Python 如何正确使用mask_zero=True进行Keras预训练权重嵌入?
如果我同时设置了Python 如何正确使用mask_zero=True进行Keras预训练权重嵌入?,python,tensorflow,keras,word-embedding,Python,Tensorflow,Keras,Word Embedding,如果我同时设置了mask\u zero=True,我会对如何为Keras嵌入层设置自己预先训练的权重感到困惑。这里有一个具体的玩具例子 假设我有一个4个单词的词汇表[1,2,3,4],并且我使用由以下定义的向量权重: weight[1]=[0.1,0.2] weight[2]=[0.3,0.4] weight[3]=[0.5,0.6] weight[4]=[0.7,0.8] 我想嵌入长度不超过5个单词的句子,所以我必须在将它们输入嵌入层之前对它们进行零填充。我想屏蔽掉零,这样以后的层就不用它们
mask\u zero=True
,我会对如何为Keras嵌入层设置自己预先训练的权重感到困惑。这里有一个具体的玩具例子
假设我有一个4个单词的词汇表[1,2,3,4]
,并且我使用由以下定义的向量权重:
weight[1]=[0.1,0.2]
weight[2]=[0.3,0.4]
weight[3]=[0.5,0.6]
weight[4]=[0.7,0.8]
我想嵌入长度不超过5个单词的句子,所以我必须在将它们输入嵌入层之前对它们进行零填充。我想屏蔽掉零,这样以后的层就不用它们了
在阅读Keras文档进行嵌入时,它说0值不能出现在我的词汇表中
掩码0:输入值0是否为特殊的“填充”
应该屏蔽的值。这在使用递归函数时非常有用
可采用可变长度输入的图层。如果这是真的,那么一切
模型中的后续层需要支持掩蔽或异常
将被提出。如果mask_zero设置为True,则索引为0
不能在词汇表中使用(输入尺寸应等于
词汇+1)
所以我困惑的是如何为嵌入层构造权重数组,因为“索引0不能在词汇表中使用”
[[0.1,0.2],
[0.3,0.4],
[0.5,0.6],
[0.7,0.8]]
然后,word1
通常会指向索引1,在本例中,索引1包含word2
的权重。或者,当您指定mask_zero=True
时,Keras会在内部将其设置为word1
指向索引0?或者,您是否只需在索引0中预加一个零向量,如下所示
[[0.0,0.0],
[0.1,0.2],
[0.3,0.4],
[0.5,0.6],
[0.7,0.8]]
在我看来,第二种选择似乎是将零放入词汇表中。换句话说,我很困惑。有人能解释一下吗?你认为第二种方法是正确的。您将希望按照以下方式构造嵌入层
embedding = Embedding(
output_dim=embedding_size,
input_dim=vocabulary_size + 1,
input_length=input_length,
mask_zero=True,
weights=[np.vstack((np.zeros((1, embedding_size)),
embedding_matrix))],
name='embedding'
)(input_layer)
其中embedded_matrix
是您提供的第二个矩阵
通过查看图层可以看到这一点。值得注意的是,mask_zero仅用于字面上屏蔽输入
def compute_mask(self, inputs, mask=None):
if not self.mask_zero:
return None
output_mask = K.not_equal(inputs, 0)
return output_mask
因此,整个内核仍然与输入相乘,这意味着所有索引都上移一位