Keras LSTM выводит другое измерение, чем ожидалось

#keras #lstm

#keras #lstm

Вопрос:

Я запускаю LSTM для обработки данных МРТ. Наши входные данные поступают с input_shape (временные интервалы, функции) = (495,359320) и данными метки (495,). Я столкнулся с проблемой, связанной с тем, что выводит уровень LSTM.

    MAX_SLIDER_VALUE=127
   EPOCHS=3
   BATCH_SIZE=1
   LOSS='mean_squared_error'
   OPTIMIZER='RMSprop'

   model=Sequential()
`  model.add(LSTM(units=MAX_SLIDER_VALUE,` activation=keras.layers.LeakyReLU(alpha=.025),dropout=.08,input_shape=(495,359320)))
   model.add(Dense(units=MAX_SLIDER_VALUE,activation='softmax'))``

   model.compile(loss=LOSS,optimizer=OPTIMIZER, metrics=['acc','mae']) 

   model.fit(np.array(train_subset_nii),np.array(train_subset_labels),
   epochs=EPOCHS,batch_size=BATCH_SIZE)
  

Проверка выходного слоя модели с помощью pdb debugger показывает, что вывод 0-го уровня должен быть (127,), но я получаю ValueError, где оно выводится как (495,).

 model.layers[0].input_shape
(None, 495, 359320)

model.layers[0].output_shape
(None, 127)

model.layers[1].input_shape
(None, 127)

model.layers[1].output_shape
(None, 127)


ValueError: Error when checking target: expected dense_5 to have shape (127,) but got array with shape (495,)
  

Дополнительное примечание:

Код обучается и выполняется, если мы изменим выходные данные в соответствии с количеством временных шагов

 MAX_SLIDER_VALUE=495
  

Я пытаюсь выяснить, что вызывает несоответствие между (127,) и (495,).

Ответ №1:

Значение по умолчанию в LSTM для return_sequences равно False, поэтому уровень LSTM выводит только вывод последней ячейки -> (None (batch), units=MAX_SLIDER_VALUE). Если вы хотите вывести (None, 495, MAX_SLIDER_VALUE), измените return_sequences на True при инициализации LSTM (единицы измерения не обязательно должны быть MAX_SLIDER_VALUE), а плотные единицы измерения — на MAX_SLIDER_VALUE.

Ответ №2:

Я полагаю, что с MAX_SLIDER_VALUE=127 вашим результатом будет (127,), поскольку ваш плотный слой состоит из 127 нейронов.

Проблема в том, как ваша модель может сравнивать предсказание (127,) с вашим измерением метки как (495,)? Для меня это, во-первых, не будет работать логически.

Вы можете попробовать изменить эту строку:

model.add(Dense(units=MAX_SLIDER_VALUE,activation='softmax'))

в

model.add(Dense(units=495,activation='softmax'))

Дайте мне знать, исправлено ли это.