簡體   English   中英

Keras-嵌入層

[英]Keras- Embedding layer

input_dimoutput_diminput_length是什么意思:

Embedding(input_dim, output_dim, input_length)

從文檔中我了解到:

  • input_dim : int > 0. 詞匯表的大小
  • output_dim : int >= 0. 密集嵌入的維度。
  • input_length : 輸入序列的長度

因此,當我的輸入是像google.com這樣的單詞時,每個字符都由一個整數表示[5, 2, 2, 5, 8, 3, 4, 1, 2, 9]並且可能的最大字長是75 可能的最大字符數為38 我應該如何決定input_dimoutput_diminput_length

為了將單詞用於自然語言處理或機器學習任務,必須首先將它們映射到一個連續的向量空間,從而創建詞向量詞嵌入 Keras 嵌入層對於構建這樣的詞向量很有用。

input_dim :詞匯量。 這是您的語料庫中表示的獨特單詞的數量。

output_dim :詞向量的期望維度。 例如,如果 output_dim = 100,那么每個詞都會被映射到一個有 100 個元素的向量上,而如果 output_dim = 300,那么每個詞都會被映射到一個有 300 個元素的向量上。

input_length :序列的長度。 例如,如果您的數據由句子組成,則此變量表示一個句子中有多少個單詞。 由於不同的句子通常包含不同數量的單詞,因此通常需要填充您的序列,以使所有句子的長度相同。 keras.preprocessing.pad_sequence 方法可用於此( https://keras.io/preprocessing/sequence/ )。

在 Keras 中,可以 1) 使用預訓練的詞向量,例如 GloVe 或 word2vec 表示,或 2) 在訓練過程中學習詞向量。 這篇博文 ( https://blog.keras.io/using-pre-trained-word-embeddings-in-a-keras-model.html ) 提供了有關如何使用 GloVe 預訓練詞向量的教程。 對於選項 2,Keras 將隨機初始化向量作為默認選項,然后在訓練過程中學習最佳詞向量。

  • input_dim:是要嵌入的詞匯表的大小
  • output_dim:是嵌入向量的長度
  • input_length:是輸入(句子)的最大長度

用示例解釋:嵌入層如何在 keras 中工作,您可以將句子轉換為整數列表(向量或張量)。 具有 input_length 的向量示例(句子的最大長度為 6,以防您的句子更長,剩余的單詞將被修剪)

 'This is a text' --> [0 0 1 2 3 4]
 'This is a very long text, my friends' --> [1 2 3 5 6 4]

然后使用 keras 的嵌入層,您可以將這些向量轉換為 output_dim 深度的嵌入向量。 例如 output_dim = 3:

[0 0 1 2 3 4] --> 
array([[ 0.00251105,  0.00724941, -0.01146401],
   [ 0.00251105,  0.00724941, -0.01146401],
   [ 0.03071865,  0.00953215, -0.01349484],
   [ 0.02962008,  0.04860269, -0.04597988],
   [-0.01875228,  0.03349927, -0.03210936],
   [-0.02512982,  0.04811014,  0.03172458]], dtype=float32)

最后一個參數 input_dim 是映射到嵌入向量的詞匯表的大小。 你可以通過運行看到它

model.layers[0].get_weights() 

因為嵌入層通常是模型的第一層。 如果是 10,嵌入層包含 10 個大小為 output_dim 的向量。 請注意,第一個元素對應於輸入向量中 0 的映射 (0 --> [ 0.00251105, 0.00724941, -0.01146401]),第二個 1 等。

[array([[ 0.00251105,  0.00724941, -0.01146401],
    [ 0.03071865,  0.00953215, -0.01349484],
    [ 0.02962008,  0.04860269, -0.04597988],
    [-0.01875228,  0.03349927, -0.03210936],
    [-0.02512982,  0.04811014,  0.03172458],
    [-0.00569617, -0.02348857, -0.00098624],
    [ 0.01327456,  0.02390958,  0.00754261],
    [-0.04041355,  0.03457253, -0.02879228],
    [-0.02695872,  0.02807242,  0.03338097],
    [-0.02057508,  0.00174383,  0.00792078]], dtype=float32)]

增加 input_dim 可以讓你映射更大的詞匯量,但也增加了嵌入層的參數數量。 參數數量為 input_dim x output_dim。

據我所知,這些向量是隨機啟動的,並像使用優化器算法的任何其他層一樣進行訓練。 但是,您可以使用不同的算法,如 word2vec 或預訓練的向量,如手套 ( https://nlp.stanford.edu/projects/glove/ )。 想法是每個單詞將代表空間中的一個獨特位置(由它的向量描述),您可以對單詞的語義(含義)應用一些向量數學。 例如 W('cheesburger') - W('cheese') = W('hamburger') 或 W('prince') - W('man') + W('woman') = W('princess') 見更多例如https://www.oreilly.com/learning/capturing-semantic-meanings-using-deep-learning

通過查看該keras文檔,您會看到:

Embedding(1000, 64, input_length=10)
#the model will take as input an integer matrix of size (batch, input_length).
#the largest integer (i.e. word index) in the input should be no larger than 999 (vocabulary size).
#now model.output_shape == (None, 10, 64), where None is the batch dimension.

通過使用您在帖子中給出的值,您可以嘗試掌握此方法的想法並提出以下設置:

  • input_dim=38
  • input_length=75

output_dim是一個模型參數,您仍然必須確定(並且可能必須嘗試不同的值才能找到最佳值)。

編輯:您可以在此處找到有關嵌入層的其他信息。

我在理解“output_dim”參數時特別困難,但作為一個視覺人士,我發現這張圖片很有幫助。 詞嵌入將從標記器獲得的單個整數值轉換為 n 維數組。 例如,單詞“cat”的分詞器可能具有值“20”,但 keras 的嵌入層可以使用詞匯中的所有詞來構建詞嵌入,以確定詞匯中所有詞之間的關系(包括“貓”) . 它找到“維度”或特征,例如“活人”、“貓科動物”、“人類”、“性別”等。然后“貓”這個詞具有每個維度/特征的值。“output_dim”參數只是告訴 keras您希望嵌入矩陣中有多少維度/特征。

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM