我正在部署Bidirectional LSTM Autoencoder
,并在其上添加attention layer
。
在添加关注层之前,它工作正常。我从这个post那里得到了增加注意力层的想法。 在引起注意之后,它抱怨尺寸不兼容。
这是我关注后的代码:
inputs = Input(shape=(SEQUENCE_LEN, EMBED_SIZE), name="input")
encoded = Bidirectional(LSTM(LATENT_SIZE, return_sequences=True), name="encoder_lstm")(inputs)
attention = Dense(SEQUENCE_LEN, activation='tanh')(encoded)
attention = Flatten()(attention)
attention = Activation('softmax')(attention)
attention = RepeatVector(SEQUENCE_LEN)(attention)
attention = Permute([2, 1])(attention)
sent_representation = merge([encoded, attention], mode='mul')
sent_representation = Lambda(lambda xin: K.sum(xin, axis=-2), output_shape=(units,))(sent_representation)
autoencoder = Model(inputs, sent_representation)
autoencoder.compile(optimizer="sgd", loss='mse')
这是我得到的错误:
Using TensorFlow backend.
(?, 40, 50)
(?, 40, 40)
Traceback (most recent call last):
(?, 40, 40)
File "/home/sgnbx/Downloads/projects/LSTM_autoencoder-master/walkingaround.py", line 131, in <module>
sent_representation = merge([activations, attention], mode='mul')
File "/home/sgnbx/anaconda3/envs/tf_gpu/lib/python3.4/site-packages/keras/engine/topology.py", line 470, in __call__
self.assert_input_compatibility(x)
File "/home/sgnbx/anaconda3/envs/tf_gpu/lib/python3.4/site-packages/keras/engine/topology.py", line 411, in assert_input_compatibility
str(K.ndim(x)))
Exception: Input 0 is incompatible with layer dense_1: expected ndim=2, found ndim=3
我已经阅读了几篇有关此错误的文章,分别是:this和this和this。 但它们与我的错误不同。另外,有人建议使return_sequences = False,但我认为这不是正确的方法。在代码的后面,如果我们将其设置为False,它将再次引发错误!
所以,我觉得我做错了,否则,为什么网络应该使用标准体系结构来引发错误。
所以我的问题是: 该网络有什么问题 以及如何解决。
如果您能详细解释,我将不胜感激,以便我能更好地理解或提供一些链接来讨论我的代码中的冲突。
谢谢!
答案 0 :(得分:0)
更正以下行:
encoded = Bidirectional(LSTM(LATENT_SIZE, return_sequences=False), name="encoder_lstm")(inputs)
只需将返回序列设置为False。