Keras 嵌入层遮罩。为啥 input_dim 需要是 |vocabulary| + 2?

Posted

技术标签:

【中文标题】Keras 嵌入层遮罩。为啥 input_dim 需要是 |vocabulary| + 2?【英文标题】:Keras embedding layer masking. Why does input_dim need to be |vocabulary| + 2?Keras 嵌入层遮罩。为什么 input_dim 需要是 |vocabulary| + 2? 【发布时间】:2017-08-30 21:01:32 【问题描述】:

Embeddinghttps://keras.io/layers/embeddings/ 的 Keras 文档中,对 mask_zero 的解释是

mask_zero:输入值 0 是否是一个特殊的“填充”值,应该被屏蔽掉。这在使用可能采用可变长度输入的循环层时很有用。如果这是 True 则模型中的所有后续层都需要支持屏蔽,否则将引发异常。如果将 mask_zero 设置为 True,则索引 0 不能在词汇表中使用(input_dim 应该等于 |vocabulary| + 2)。

为什么 input_dim 需要 2 + 词汇表中的单词数?假设 0 被屏蔽并且不能使用,不应该只是 1 + 字数吗?另一个额外的条目是做什么用的?

【问题讨论】:

文档已更新。如果mask_zero:True,则input_dim 等于特殊零掩码的词汇数量+1 【参考方案1】:

因为 input_dim 已经是词汇表的 +1,所以你只需为 0 添加另一个 +1 并获得 +2。

input_dim: int > 0. 词汇表的大小,即。 1 + 最大整数 输入数据中出现的索引。

【讨论】:

那么问题是什么“input_dim 已经是词汇的 +1”【参考方案2】:

我相信那里的文档有点误导。在正常情况下,您将n 输入数据索引[0, 1, 2, ..., n-1] 映射到向量,因此您的input_dim 应该与您拥有的元素一样多

input_dim = len(vocabulary_indices)

一种等效的(但有点令人困惑)的说法,以及文档的做法,就是说

1 + 输入数据中出现的最大整数索引。

input_dim = max(vocabulary_indices) + 1

如果启用屏蔽,值 0 的处理方式不同,因此您将 n 索引加一:[0, 1, 2, ..., n-1, n],因此您需要

input_dim = len(vocabulary_indices) + 1

或者

input_dim = max(vocabulary_indices) + 2

正如他们所说,这里的文档变得特别令人困惑

(input_dim 应该等于|vocabulary| + 2

我会将|x| 解释为集合的基数(相当于len(x)),但作者似乎是这个意思

2 + 输入数据中出现的最大整数索引。

【讨论】:

我明白了。这就说得通了。感谢您的详尽回答!我想知道我们是否可以为 Keras 文档提交拉取请求以减少误导。 @NilsWerner 那么在这个例子中,max(vocabulary_indices) 是不同单词的数量,还是数据集中的总单词数?即,如果vocabulary_indexes=[1,2,...i,i,...,n-1,n]input_dim=n+1,因为nmax(vocabulary_indexes),或者是input_dim=n+2,因为ivocabulary_indexes 中出现两次,所以input_dim=len(vocabulary_indices)+1=(n+1)+1=n+2

以上是关于Keras 嵌入层遮罩。为啥 input_dim 需要是 |vocabulary| + 2?的主要内容,如果未能解决你的问题,请参考以下文章

如何给C4D添加多个层遮罩?

PSphotoshop怎么添加层遮罩?

layer弹层遮罩挡住窗体解决

uni-app tabbar页面遮罩层遮不住tabbar问题解决

Keras官方中文文档:嵌入层Embedding

JS弹出层遮罩,隐藏背景页面滚动条细节优化