2017-02-20 17 views
1

Я использую Keras с Tensorflow, как движки и получить несовместимые ошибки:Keras: ValueError: Input 0 несовместим слой выдает

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

ответ

1

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

Кроме того, у вас может возникнуть аналогичная проблема со вторым слоем. Для того, чтобы сделать свой LSTM слой, чтобы вернуть последовательности вы должны изменить свое определение на:

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

или:

model.add(LSTM(64, input_dim = nb_of_features, input_len = len_of_sequence, return_sequences=True) 
+0

Я проверил, что это работает, только установив 'input_dim' в одиночку, кондиционирование, что установив для 'return_sequences' значение True. Не могли бы вы рассказать мне, почему я должен установить 'return_sequences'? –

+0

Вы должны установить return_srquences в True каждый раз, когда ваш выход будет передан в рекуррентную сеть. Это заставляет ваш слой выводить всю последовательность вычислений. Если для него установлено значение false, возвращается один размерный вектор (по умолчанию он устанавливается на последний выход последовательности). –

+0

Является ли мой ответ правильным или неправильным? –

 Смежные вопросы

  • Нет связанных вопросов^_^