【问题标题】:How to input mask value to Convolution1D layer如何将掩码值输入到 Convolution1D 层
【发布时间】:2019-07-15 17:58:01
【问题描述】:

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

我的模特是Embedding + LSTM + Conv1d + Maxpooling + softmax

当我在Embedding 中设置mask_zero = True 时,我无法在Conv1d 处编译。

如何在Conv1d 中输入掩码值,或者有其他解决方案吗?

【问题讨论】:

  • LSTM 在卷积层和最大池化层之后是否编译?
  • @convolutionBoy Conv 后 LSTM 还是失败了,我在 github 上发现了这个问题,除了 RNN 和 Timedistributed Layer,其他都不支持 mask

标签: keras convolution masking


【解决方案1】:

Masking 层希望每个下游层都支持遮罩,Conv1D 层不是这种情况。幸运的是,还有另一种应用屏蔽的方法,即使用函数式 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=[...])

【讨论】:

  • 如果我理解正确,如果数据类型是整数(例如,如果输入是要嵌入的单词或字符),则此解决方案有效。有没有办法用浮点数据来做到这一点(例如,如果输入是一些物理数据的一些数据系列?),嵌入不合适?
  • 如果您尝试过但它不适用于浮动,那么最后的选择是编写您自己的自定义图层: class YourCustomLayer(keras.layers.Layer): ... def call(self , 输入, 掩码): ...
【解决方案2】:

Conv1D 层目前不支持遮罩。这是 keras repo 上的 open issue

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

【讨论】:

  • 感谢您的回答。在您的解决方案中,我删除了 mask_value = True,并给填充一个嵌入向量,当在 maxpooling 之后,填充时间步将在训练过程中逐渐被忽略。你是那个意思吗?或者github问题中的解决方案,我插入一个张量[1,1,1,0,0,0],其中0代表pad,我将此张量与conv输出相乘,然后输入到maxpooling层?你觉得这个解决方案如何
  • 我不清楚它是如何工作的。你能提供代码示例吗?谢谢。
猜你喜欢
  • 1970-01-01
  • 2018-11-21
  • 2020-12-17
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 2020-08-15
相关资源
最近更新 更多