如何向Convolution1D层输入掩码值

15

我需要将可变长度的序列输入到我的模型中。

我的模型是 嵌入层 + LSTM层 + 一维卷积层(Conv1d) + 最大池化层 + softmax层

当我在 嵌入层(Embedding) 中设置 mask_zero = True 时,我无法通过 一维卷积层(Conv1d) 的编译。

如何在 一维卷积层(Conv1d) 中输入掩码值,或者是否有其他解决方案?


1
如果LSTM在卷积和最大池化层之后,它是否能编译通过? - convolutionBoy
1
@convolutionBoy 如果在卷积后接LSTM,它仍然失败了,我已经在Github上找到了问题,除了RNN和Timedistributed层之外,其他都不支持mask。 - Jaspn Wjbian
2个回答

8

Masking层期望每个下游层都支持掩码,但Conv1D层并不是这种情况。幸运的是,还有另一种使用Functional API应用掩码的方法:

inputs = Input(...)
mask = Masking().compute_mask(inputs) # <= Compute the mask
embed = Embedding(...)(inputs)
lstm = LSTM(...)(embed, mask=mask) # <= Apply the mask
conv = Conv1D(...)(lstm)
...
model = Model(inputs=[inputs], outputs=[...])

如果我理解正确的话,这个解决方案适用于整数数据类型(例如,如果输入是要嵌入的单词或字符)。是否有一种方法可以处理浮点数据(例如,如果输入是某些物理数据的数据系列),其中嵌入不合适? - Itamar Mushkin
如果您尝试使用浮点数但无法正常工作,则最后的选择是编写自己的自定义层:class YourCustomLayer(keras.layers.Layer): ... def call(self, inputs, mask): ... - MiniQuark

7

目前Conv1D层不支持掩码。Keras的存储库中有一个未解决问题

根据任务的不同,您可能可以像序列中的其他值一样嵌入mask_value并应用全局池化(就像您现在正在做的那样)。


感谢您的回答。在您的解决方案中,我删除了mask_value = True,并为填充添加了一个嵌入向量,当经过maxpooling后,填充时间步将逐渐在训练过程中被忽略。您是这个意思吗? 还是在github问题中的解决方案,我插入一个张量[1,1,1,0,0,0],其中0表示pad,然后将此张量与卷积输出相乘,再输入到maxpooling层?您认为这个解决方案如何? - Jaspn Wjbian
我不清楚它是如何工作的。你能提供一些代码示例吗?谢谢。 - user4918159

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接