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]]
然后,word
1
通常会指向索引1,在本例中,索引1包含word
2
的权重。或者,当您指定
mask_zero=True
时,Keras会在内部将其设置为word
1
指向索引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
因此,整个内核仍然与输入相乘,这意味着所有索引都上移一位