...
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/