完全披露此问题基于以下本教程:https ://tinyurl.com/vmyj8rf8
我试图完全理解 Keras 中的嵌入层。想象一下,有一个网络可以尝试将基本情绪分析理解为二元分类器(1 个正面情绪和 0 个负面情绪)。玩具数据集如下:
# Define 10 restaurant reviews
reviews =[
'Never coming back!',
'horrible service',
'rude waitress',
'cold food',
'horrible food!',
'awesome',
'awesome services!',
'rocks',
'poor work',
'couldn\'t have done better'
]#Define labels
labels = array([1,1,1,1,1,0,0,0,0,0])
该数据可用于训练一个非常简单的网络,如下所示:
Vocab_size = 50
model = Sequential()
embedding_layer = Embedding(input_dim=Vocab_size,output_dim=8,input_length=max_length)
model.add(embedding_layer)
model.add(Flatten())
model.add(Dense(1,activation='sigmoid'))
model.compile(optimizer='adam',loss='binary_crossentropy',metrics=['acc'])
print(model.summary())
为了将此数据输入网络,我们可以使用 Keras one_hot 对其进行热编码,如下所示:
encoded_reviews = [one_hot(d,Vocab_size) for d in reviews]
print(f'encoded reviews: {encoded_reviews}')
我们得到以下输出:
encoded reviews: [[14, 45, 43], [8, 2], [6, 43], [24, 1], [8, 1], [11], [11, 21], [16], [34, 40], [2, 25, 36, 15]]
我知道设置 Vocab_size = 50 的目的,即使语料库中只有大约 20 个唯一单词,也是为 one_hot 后面的哈希算法提供足够大的哈希空间,以避免文本编码时发生冲突。
如果我在这些词上训练模型(假设固定长度输入和填充),然后得到嵌入层的权重:
print(embedding_layer.get_weights()[0].shape)
(50, 8)
我们可以看到这是一个由 50 个向量组成的数组,如下所示:
[ 0.17051394 0.13659576 -0.05245572 -0.12567708 0.06743167 0.05893507 -0.14506021 0.06448647]
我的理解是,这些向量中的每一个都对应于语料库中每个词的词嵌入。但是,如果语料库中只有 20 个唯一词,并且 Vocab_size 设置得比这个大,那这不完全正确吗?如果 Vocab_size > corpus_vocab_size,那么这些嵌入代表什么?任何帮助,将不胜感激。