Вопрос или проблема
Я использую функциональный API Keras для написания модели LSTM, но возникает ошибка, не могли бы вы помочь, ниже приведен код модели, выходная форма – 65. Я использую Keras 2.2.4 и TensorFlow 1.15
event_num = 65
droprate = 0.3
vector_size = 572
def DNN():
train_input=Input(shape=(vector_size*2,),name="Inputlayer")
train_in=LSTM(512)(train_input)
# train_in=BatchNormalization()(train_in)
train_in=Dropout(droprate)(train_in)
train_in=LSTM(256)(train_in)
# train_in=BatchNormalization()(train_in)
train_in=Dropout(droprate)(train_in)
train_in=Flatten()(train_in)
train_in=Dense(event_num)(train_in)
out=Activation('softmax')(train_in)
model=Model(input=train_input,output=out)
model.compile(optimizer="adam", loss="categorical_crossentropy", metrics=['accuracy'])
return model
Ваш пост является дубликатом: Вот здесь кто-то задавал тот же вопрос.
Посмотрите на ответы, вы также можете попробовать эту ссылку, которая дает подробное объяснение того, как изменить формы входных данных для слоев LSTM.
Ответ или решение
Ошибка, с которой вы столкнулись, ValueError: Input 0 is incompatible with layer lstm_1: expected ndim=3, found ndim=2
, происходит из-за несоответствия ожидаемого входного формата для слоя LSTM в вашем Keras модели. Давайте подробно рассмотрим данную проблему и то, как её решить.
Понимание Ошибки
Слои LSTM (Long Short-Term Memory) требуют входные данные в формате 3D массивов с тремя измерениями: (batch_size, timesteps, features)
.
- batch_size — количество последовательностей (примеров) в одной партии данных,
- timesteps — количество временных шагов в каждой последовательности,
- features — количество признаков (характеристик) на каждом временном шаге.
Когда вы передаете входные данные в виде 2D массива (например, (batch_size, vector_size*2)
), LSTM не может обработать его, поскольку оно ожидает 3D вход.
Исправление Кода
Вам необходимо изменить форму входных данных, чтобы они соответствовали требованиям LSTM. Это можно сделать, добавив дополнительное измерение к вашему входному массиву. Вот что вам нужно сделать:
-
Изменить форму входных данных перед подачей в модель:
Измените форму данных на(batch_size, timesteps, features)
, гдеtimesteps
будет равен 1, если вы рассматриваете одно временное состояние, иfeatures
будет равноvector_size * 2
. -
Изменение кода модели:
import numpy as np
from keras.layers import Input, LSTM, Dropout, Dense, Activation
from keras.models import Model
event_num = 65
droprate = 0.3
vector_size = 572
def DNN():
# Изменение формы входа на 3D
train_input = Input(shape=(1, vector_size * 2), name="InputLayer")
# Первая LSTM
train_in = LSTM(512, return_sequences=True)(train_input) # Убедитесь, что return_sequences= True
train_in = Dropout(droprate)(train_in)
# Вторая LSTM
train_in = LSTM(256, return_sequences=False)(train_in) # Убедитесь, что return_sequences= False
train_in = Dropout(droprate)(train_in)
# Полносвязный слой
train_in = Dense(event_num)(train_in)
out = Activation('softmax')(train_in)
model = Model(inputs=train_input, outputs=out)
model.compile(optimizer="adam", loss="categorical_crossentropy", metrics=['accuracy'])
return model
Подготовка Данных
Когда вы будете готовить данные для обучения, убедитесь, что данные имеют правильный формат. Если ваши исходные данные — это 2D массив, вы можете использовать reshape
, чтобы добавить недостающее измерение. Например:
X_train = X_train.reshape((X_train.shape[0], 1, vector_size * 2))
Заключение
Следуя этим шагам, вы сможете устранить ошибку и корректно использовать LSTM в вашем проекте. Помните, что правильная форма данных для архитектур, основанных на временных рядах, как LSTM, критически важна для успешного обучения и прогнозирования.
Если у вас возникнут дополнительные вопросы или потребуется дальнейшая помощь, не стесняйтесь обращаться!