gpt4 book ai didi

python - 如何正确使用 mask_zero=True 进行预训练权重的 Keras 嵌入?

转载 作者:太空宇宙 更新时间:2023-11-04 02:21:56 25 4
gpt4 key购买 nike

如果我还设置了 mask_zero=True,我对如何为 Keras Embedding 层格式化我自己的预训练权重感到困惑。这是一个具体的玩具示例。

假设我有一个包含 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 值不能出现在我的词汇表中。

mask_zero: Whether or not the input value 0 is a special "padding" value that should be masked out. This is useful when using recurrent layers which may take variable length input. If this is True then all subsequent layers in the model need to support masking or an exception will be raised. If mask_zero is set to True, as a consequence, index 0 cannot be used in the vocabulary (input_dim should equal size of vocabulary + 1).

所以我很困惑的是如何为嵌入层构造权重数组,因为“索引 0 不能在词汇表中使用”。如果我将权重数组构建为

[[0.1,0.2],
[0.3,0.4],
[0.5,0.6],
[0.7,0.8]]

那么通常情况下,单词 1 将指向索引 1,在本例中它保存单词 2 的权重。还是当您指定 mask_zero=True 时,Keras 在内部使单词 1 指向索引 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)

其中 embedding_matrix 是您提供的第二个矩阵。

您可以通过查看 implementation of keras' embedding 来了解这一点层。值得注意的是,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

因此整个内核仍然乘以输入,这意味着所有索引都向上移动了一个。

关于python - 如何正确使用 mask_zero=True 进行预训练权重的 Keras 嵌入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51382664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com