[英]Keras- Embedding layer
input_dim
、 output_dim
和input_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_dim
、 output_dim
和input_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 將隨機初始化向量作為默認選項,然后在訓練過程中學習最佳詞向量。
如用示例解釋:嵌入層如何在 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
是一個模型參數,您仍然必須確定(並且可能必須嘗試不同的值才能找到最佳值)。
編輯:您可以在此處找到有關嵌入層的其他信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.