[Keras][LSTM] ошибка из-за несоответствия формы

Вопрос или проблема

У меня есть следующие данные. У меня есть 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 выхода:-

  1. Последовательности
  2. Состояния.

LSTM

Теперь, поскольку вы работаете с 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)

Объяснения:

  1. return_sequences=True: Это добавляет возможность возвращать полный вывод LSTM для каждого временного шага, что соответствует вашей целевой переменной y.

  2. Форма y: Мы изменили форму y, чтобы она соответствовала выходу LSTM. Теперь целевая переменная имеет размерность (2, 3, 1), что позволит модели правильно обрабатывать данные.

Заключение

При работе с LSTM очень важно следить за соответствием входных и выходных размерностей. При необходимости изменения конфигурации модели, такие как return_sequences, могут помочь избежать распространенных ошибок. Надеемся, это поможет вам успешно обучить вашу модель LSTM и избежать проблем, связанных с несовпадением форматов данных. Если у вас возникнут дополнительные вопросы, не стесняйтесь обращаться!

Оцените материал
Добавить комментарий

Капча загружается...