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 【问题描述】:在Embedding
https://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
,因为n
是max(vocabulary_indexes)
,或者是input_dim=n+2
,因为i
在vocabulary_indexes
中出现两次,所以input_dim=len(vocabulary_indices)+1=(n+1)+1=n+2
?以上是关于Keras 嵌入层遮罩。为啥 input_dim 需要是 |vocabulary| + 2?的主要内容,如果未能解决你的问题,请参考以下文章