...
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'))
....

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

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

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

最佳答案

Jacoxu的答案是正确的。但是,如果您使用的是keras的Tensorflow后端,则Tensor类型不支持dimshuffle函数,请尝试执行此操作。

def call(self, x, mask=None):
    if mask is not None:
        # mask (batch, time)
        mask = K.cast(mask, K.floatx())
        # mask (batch, x_dim, time)
        mask = K.repeat(mask, x.shape[-1])
        # mask (batch, time, x_dim)
        mask = tf.transpose(mask, [0,2,1])
        x = x * mask
    return K.sum(x, axis=1) / K.sum(mask, axis=1)

关于python - Keras中具有屏蔽支持的平均池或最大池,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39510809/

10-12 21:17