Keras: ValueError: ввод 0 — это проблемы с несовместимым слоем

Я использую Keras с Tensorflow в качестве серверной части и получаю несовместимые ошибки:

model = Sequential()
model.add(LSTM(64, input_dim = 1))
model.add(Dropout(0.2))
model.add(LSTM(16))

Показывает следующую ошибку:

Traceback (most recent call last):
  File "train_lstm_model.py", line 36, in <module>
    model.add(LSTM(16))
  File "/home/***/anaconda2/lib/python2.7/site-packages/keras/models.py", line 332, in add
    output_tensor = layer(self.outputs[0])
  File "/home/***/anaconda2/lib/python2.7/site-packages/keras/engine/topology.py", line 529, in __call__
    self.assert_input_compatibility(x)
  File "/home/***/anaconda2/lib/python2.7/site-packages/keras/engine/topology.py", line 469, in assert_input_compatibility
    str(K.ndim(x)))
ValueError: Input 0 is incompatible with layer lstm_2: expected ndim=3, found ndim=2

Как я могу решить эту проблему?

Версия Keras: 1.2.2 Версия Tensorflow: 0.12


person Shuai Zhang    schedule 20.02.2017    source источник


Ответы (1)


Слой LSTM принимает входные данные в форме (len_of_sequences, nb_of_features). Предоставленная вами входная форма - это только 1-dim, поэтому возникает ошибка. Точная форма сообщения об ошибке исходит из того факта, что фактическая форма данных включает в себя batch_size. Таким образом, фактическая форма данных, подаваемых на слой, — (batch_size, len_of_sequences, nb_of_features). Ваша фигура (batch_size, 1), и это причина ввода 3d против 2d.

Более того - у вас может быть аналогичная проблема со вторым слоем. Чтобы ваш слой LSTM возвращал последовательности, вы должны изменить его определение на:

model.add(LSTM(64, input_shape = (len_of_seq, nb_of_features), return_sequences=True)

or:

model.add(LSTM(64, input_dim = nb_of_features, input_len = len_of_sequence, return_sequences=True)
person Marcin Możejko    schedule 20.02.2017
comment
Я убедился, что это работает, только установив только input_dim, при условии, что для return_sequences установлено значение True. Не могли бы вы сказать мне, почему я должен установить return_sequences? - person Shuai Zhang; 20.02.2017
comment
Вы должны устанавливать для return_srquences значение True каждый раз, когда ваш вывод подается в рекуррентную сеть. Это заставляет ваш слой выводить всю последовательность вычислений. Если установлено значение false, возвращается одномерный вектор (по умолчанию он устанавливается на последний вывод последовательности). - person Marcin Możejko; 20.02.2017
comment
Мой ответ правильный или неправильный? - person Marcin Możejko; 22.02.2017