Вопрос или проблема
У меня есть следующие данные. У меня есть 2 образца. Каждый образец имеет 3 временных шага, каждый с 2 признаками. Я намерен использовать 2 батча (чтобы обновлять веса после каждого образца)
X=np.array([[[0.54, 0.3], [0.11, 0.2], [0.37, 0.81]],[[0.55, 0.4], [0.12, 0.3], [0.38, 0.9]]])
X=X.reshape(2,3,2)
y = np.array([[[0.2],[0.3],[0.4]],[[0.3],[0.4],[0.5]]])
y = y.reshape(2,3)
Следующий код является моим кодом Keras LSTM
model = Sequential()
model.add(LSTM(50, activation='relu', batch_input_shape=(2, 3, 2)))
# model.add(LSTM(50, activation='relu', batch_input_shape=(1, n_steps, n_features)))
# model.add(LSTM(50, activation='relu', input_shape=(n_steps, n_features)))
model.add(Dense(1))
model.compile(optimizer="adam", loss="mse")
model.fit(X, y, epochs=10000, verbose=0)
Это вызывает у меня следующую ошибку. Согласно моему пониманию, это связано с несоответствием размеров, но я не могу найти проблему в моих размерах. Буду признателен за ваши замечания
ValueError: Error when checking target: expected dense_1 to have shape (1,) but got array with shape (3,)
LSTM дает 2 выхода:-
- Последовательности
- Состояния.
Теперь, поскольку вы работаете с Keras, по умолчанию слой LSTM предназначен для возврата состояний по последовательности (что можно изменить, установив аргумент return_sequence
в True
в слое keras).
Смотрев на форму вашего выхода, (2,3) неправильно для состояний и на самом деле выглядит так, как будто должно быть для последовательности. Это причина, по которой ваш код вызывает ошибку.
Ответ или решение
При работе с глубинным обучением, особенно с рекуррентными нейронными сетями (RNN) и такими их подтипами, как долгосрочные кратковременные памяти (LSTM), часто возникают ошибки, связанные с несовпадением размеров ваших данных. В данном случае мы сталкиваемся с проблемой, касающейся формата входных и выходных данных в Keras.
Контекст проблемы
У вас есть два образца, каждый из которых содержит три временных шага, и на каждом этапе есть два признака. То есть ваши данные имеют форму (2, 3, 2)
, где:
2
— количество образцов (или пакетов),3
— количество временных шагов,2
— количество признаков.
Для целевых переменных y
вы используете форму (2, 3)
, что означает, что у вас есть два образца с тремя выходами для каждого образца. Этот выход, похоже, представляет собой последовательность, но у вас есть только одно значение для каждого временного шага.
Ошибка
Ошибка, с которой вы столкнулись, гласит:
ValueError: Error when checking target: expected dense_1 to have shape (1,) but got array with shape (3,)
Это значит, что выходной слой вашей модели ожидает на выходе размерность (1,)
, но на самом деле получает массив размерностью (3,)
, что соответствует всему количеству временных шагов. Причиной этого является то, что вы не задали параметр return_sequences=True
в слое LSTM, что позволяет модели возвращать все последовательные выходы в виде последовательности, а не только последний.
Решение проблемы
Вам необходимо внести изменения в код модели, чтобы соответствовать ожиданиям выходных данных. Вот исправленный код, который решает проблему:
import numpy as np
from keras.models import Sequential
from keras.layers import LSTM, Dense
# Подготовка данных
X = np.array([[[0.54, 0.3], [0.11, 0.2], [0.37, 0.81]],
[[0.55, 0.4], [0.12, 0.3], [0.38, 0.9]]])
X = X.reshape(2, 3, 2)
y = np.array([[[0.2], [0.3], [0.4]],
[[0.3], [0.4], [0.5]]])
y = np.reshape(y, (2, 3))
# Создание модели
model = Sequential()
model.add(LSTM(50, activation='relu', return_sequences=True, input_shape=(3, 2)))
model.add(Dense(1))
# Компиляция модели
model.compile(optimizer="adam", loss="mse")
# Обучение модели
model.fit(X, y.reshape(2, 3, 1), epochs=10000, verbose=0)
Объяснения:
-
return_sequences=True
: Это добавляет возможность возвращать полный вывод LSTM для каждого временного шага, что соответствует вашей целевой переменнойy
. -
Форма
y
: Мы изменили формуy
, чтобы она соответствовала выходу LSTM. Теперь целевая переменная имеет размерность(2, 3, 1)
, что позволит модели правильно обрабатывать данные.
Заключение
При работе с LSTM очень важно следить за соответствием входных и выходных размерностей. При необходимости изменения конфигурации модели, такие как return_sequences
, могут помочь избежать распространенных ошибок. Надеемся, это поможет вам успешно обучить вашу модель LSTM и избежать проблем, связанных с несовпадением форматов данных. Если у вас возникнут дополнительные вопросы, не стесняйтесь обращаться!