Плотный ожидает 2d, но получил 3d в LSTM
В моей модели
Xtrain shape : (62, 30, 100)
Ytrain shape : (62, 1, 100)
Xtest shape : (16, 30, 100)
Ytest shape : (16, 1, 100)
Когда я строю свою модель,
model = Sequential()
model.add(LSTM(units=100, return_sequences= True, input_shape=(x_train.shape[1],X_train.shape[2])))
model.add(LSTM(units=100, return_sequences=True))
model.add(Dense(units=100))
model.fit(x_train,y_train,epochs=5,batch_size=13)
когда я пытаюсь подогнать его, выдает ошибку,
ValueError: Error when checking target: expected dense_1 to have 2 dimensions, but got array with shape (62, 1, 100)
Мне нужно спрогнозировать следующую временную метку для всех 100 функций. Какие изменения нужно сделать?
2 ответа
Если вы хотите, чтобы результат каждого шага LSTM обрабатывался отдельно (наиболее распространенное использование размещения слоя Dense после LSTM или других RNN), вам необходимо обернуть его, например:
model = Sequential()
model.add(LSTM(units=100, return_sequences= True, input_shape=(x_train.shape[1],X_train.shape[2])))
model.add(LSTM(units=100, return_sequences=True))
model.add(TimeDistributed(Dense(units=100)))
Каждый вывод будет подан отдельно на слой Dense (конечно, это будет один и тот же слой - все веса будут разделены между каждым его "экземпляром").
Опубликованный код не похож на тот, который вызвал ошибку.
Распечатайте свой model.summary()
. Ты увидишь:
- LSTM 1: (Нет, 30, 100)
- LSTM 2: (Нет, 30, 100)
- Плотный: (Нет, 30, 100)
Вы не использовали ничего для уменьшения количества временных шагов до 1. В вашем сообщении об ошибке, в соответствии с этой моделью, определенно должно быть жалоба на попытку (None, 30, 100)
против (62, 1, 100)
.
Чтобы устранить временные интервалы, вам нужно return_sequences=False
в последнем LSTM, поэтому ваша модель станет:
- (Нет, 30, 100)
- (Нет, 100)
- (Нет, 100)
Таким образом, вы можете Ytrain.shape == (62,100)
Если вам действительно нужно это среднее измерение == 1, просто используйте Lambda(lambda x: K.expand_dims(x, 1))
после плотного.