#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'))
Дайте мне знать, исправлено ли это.