嵌入层将输入的单词创建为嵌入向量(我自己仍然不理解其中的数学原理),类似于word2vec或预先计算的glove。
在介绍你的代码之前,让我们做一个简短的例子。
texts = ['This is a text', 'This is not a text']
首先,我们将这些句子转换为整数向量,其中每个单词都是在字典中分配给该单词的数字,向量的顺序创建了单词的序列。
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
from keras.utils import to_categorical
max_review_length = 6
embedding_vector_length = 3
top_words = 10
tokenizer = Tokenizer(top_words)
tokenizer.fit_on_texts(texts)
sequences = tokenizer.texts_to_sequences(texts)
word_index = tokenizer.word_index
input_dim = len(word_index) + 1
print('Found %s unique tokens.' % len(word_index))
data = pad_sequences(sequences, max_review_length)
print('Shape of data tensor:', data.shape)
print(data)
[Out:]
'This is a text' --> [0 0 1 2 3 4]
'This is not a text' --> [0 1 2 5 3 4]
现在您可以将它们输入到嵌入层中。
from keras.models import Sequential
from keras.layers import Embedding
model = Sequential()
model.add(Embedding(top_words, embedding_vector_length, input_length=max_review_length, mask_zero=True))
model.compile(optimizer='adam', loss='categorical_crossentropy')
output_array = model.predict(data)
output_array
包含大小为 (2, 6, 3) 的数组: 在我的情况下,2 个输入评论或句子,每个评论最多包含 6 个单词 (max_review_length
),而 3 是 embedding_vector_length
。例如:
array([[[-0.01494285, -0.007915 , 0.01764857],
[-0.01494285, -0.007915 , 0.01764857],
[-0.03019481, -0.02910612, 0.03518577],
[-0.0046863 , 0.04763055, -0.02629668],
[ 0.02297204, 0.02146662, 0.03114786],
[ 0.01634104, 0.02296363, -0.02348827]],
[[-0.01494285, -0.007915 , 0.01764857],
[-0.03019481, -0.02910612, 0.03518577],
[-0.0046863 , 0.04763055, -0.02629668],
[-0.01736645, -0.03719328, 0.02757809],
[ 0.02297204, 0.02146662, 0.03114786],
[ 0.01634104, 0.02296363, -0.02348827]]], dtype=float32)
在您的情况下,您有一个包含5000个单词的列表,可以创建最多500个单词的评论(超过部分将被裁剪),并将这500个单词中的每一个转换为大小为32的向量。
您可以通过运行以下命令获取单词索引和嵌入向量之间的映射:
model.layers[0].get_weights()
在下面的情况中,
top_words
为10,因此我们有10个单词的映射,你可以看到0、1、2、3、4和5的映射等于上面的
output_array
。
[array([[-0.01494285, -0.007915 , 0.01764857],
[-0.03019481, -0.02910612, 0.03518577],
[-0.0046863 , 0.04763055, -0.02629668],
[ 0.02297204, 0.02146662, 0.03114786],
[ 0.01634104, 0.02296363, -0.02348827],
[-0.01736645, -0.03719328, 0.02757809],
[ 0.0100757 , -0.03956784, 0.03794377],
[-0.02672029, -0.00879055, -0.039394 ],
[-0.00949502, -0.02805768, -0.04179233],
[ 0.0180716 , 0.03622523, 0.02232374]], dtype=float32)]
如https://stats.stackexchange.com/questions/270546/how-does-keras-embedding-layer-work所述,这些向量是随机初始化的,并且像网络的任何其他参数一样,由网络优化器进行优化。