Слой внимания в верхней части LSTM Autoencoder получает ошибку несовместимости - PullRequest
0 голосов
/ 11 апреля 2019

Я развертываю Bidirectional LSTM Autoencoder и добавляю attention layer поверх этого.

Перед добавлением слоя внимания он работает нормально.Из этой записи я получил идею добавить слой внимания.После добавления внимания он жалуется на несовместимость измерений.

Это мой код после добавления внимания:

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

Iпрочитал пару постов относительно этой ошибки, а именно: это и это и это .но они не такие, как моя ошибка.Также некоторые предлагали сделать return_sequence = False, но я не думаю, что это правильный путь.Позже в коде снова возникает ошибка, если мы установим значение False!

Итак, я чувствую, что делаю что-то не так, в противном случае, почему сеть должна выдавать ошибку при стандартной архитектуре.

Поэтому мой вопрос таков: что не так с этой сетью и как я могу это исправить.

Я ценю, если вы смогли бы объяснить подробно, чтобы я мог лучше понять или дать мне некоторые ссылки, которые говорят оконфликт в моем коде.

Заранее спасибо!

...