Как исправить ‘ValueError: невозможно передать значение формы X для тензора Y, который имеет форму Z на Keras

#python #keras #lstm #shapes #valueerror

#python #keras #lstm #формы #ошибка значения

Вопрос:

Архитектура модели

 model = Sequential()
model.add(LSTM(50,batch_input_shape(50,10,9),return_sequences=True))
model.add(LSTM(30,return_sequences=True, activation='tanh'))
model.add(LSTM(20,return_sequences=False, activation='tanh'))
model.add(Dense(9, activation='tanh'))
model.compile(loss='mean_squared_logarithmic_error',
                   optimizer='adam',metrics=['accuracy'])
  

Сводка выглядит следующим образом

 Layer (type)                 Output Shape              Param #   
=================================================================
lstm_1 (LSTM)                (50, 10, 50)              12000     
_________________________________________________________________
lstm_2 (LSTM)                (50, 10, 30)              9720      
_________________________________________________________________
lstm_3 (LSTM)                (50, 20)                  4080      
_________________________________________________________________
dense_1 (Dense)              (50, 9)                   189       
=================================================================
Total params: 25,989
Trainable params: 25,989
Non-trainable params: 0
  

Я использую fit_generator для обучения модели. Я намерен использовать predict вместо predict_generator . Я закодировал пользовательский генератор, используя yeild. С этим нет проблем, потому что predict_generator работает нормально

 model.fit_generator(generator=generator, 
                    steps_per_epoch=250, epochs=10, shuffle=True)
  

Когда я использую predict

 model.predict(testX = np.zeros(50,10,9))
  

Это выдает ошибку ниже

 ValueError: Cannot feed value of shape (32, 10, 9) for Tensor
          'lstm_1_input:0', which has shape '(50, 10, 9)'
  

Теперь я понятия не имею, откуда взялись эти 32, потому что входная форма равна (50,10,9), что является именно тем, что он ожидает.

Ответ №1:

Используйте

 model.predict(np.random.randn(50,10,9), batch_size=50)
  

Вы фиксируете размер пакета на 50 via batch_input_shape(50,10,9)

Однако, когда вы используете predict , вы не передаете batch_size значение, которое по умолчанию равно 32. Поэтому он пытается перейти в (32, 10, 9) into (50, 10, 9) и терпит неудачу.

Это не сбой, fit_generator потому что вы generator должны возвращать пакет размером 50.

https://keras.io/models/model/#predict