Keras中具有屏蔽支持的平均池或最大池

Ers*_*sin 5 python pooling masking lstm keras

...
print('Build model...')
model = Sequential()
model.add(Embedding(max_features, 128))
model.add(LSTM(size, return_sequences=True, dropout_W=0.2 dropout_U=0.2)) 
model.add(GlobalAveragePooling1D())
model.add(Dense(1))
model.add(Activation('sigmoid'))
....
Run Code Online (Sandbox Code Playgroud)

我需要能够在LSTM层之后的样本中获取所有时间步长的向量的平均值或最大值,然后再将该平均值或最大值提供给Keras中的密集层。

我认为timedistributedmerge能够做到这一点,但已被弃用。使用return_sequences=TrueI可以获取LSTM层之后的样本中所有时间步骤的向量。但是,GlobalAveragePooling1D()它与屏蔽不兼容,它考虑了所有时间步长,而我只需要非屏蔽时间步长。

我看到了推荐该Lambda图层的帖子,但这些帖子也没有考虑遮罩。任何帮助,将不胜感激。

nem*_*emo 3

由于平均池仅在一个轴上求平均值,因此您只需要纠正平均值中的元素数量,因为损失掩蔽是在最后处理的,而不是在这里。你可以用这样的东西来做到这一点:

class GlobalAveragePooling1DMasked(GlobalAveragePooling1D):
    def call(self, x, mask=None):
        if mask != None:
            return K.sum(x, axis=1) / K.sum(mask, axis=1)
        else:
            return super().call(x)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,在 Keras 中您无法确定“x”中的掩码值等于零!因此,这种实现会给出错误的结果。 (2认同)