Больше информации для LSTM - PullRequest
0 голосов
/ 07 января 2020

Я не уверен, как передать данные в LSTM, где у меня есть 6 столбцов с отношением. Я использовал модель, рассчитанную на один вход, и попытался изменить размеры. Сначала я добавил

nsamples, nx, ny = X_train.shape

X_train = X_train.reshape((nsamples,nx*ny))

Чтобы убедиться, что MixMaxScaler принимает данные в двух измерениях. Модель использовала три измерения для LSTM (последний был 1), поэтому я изменил его до 6 и скормил его модели. Но выдает ошибку: Error when checking target: expected dense to have 2 dimensions, but got array with shape (69692, 42, 6) Итак, я добавил flatten слой. Это не помогает ... Что я делаю не так? Btw. 7 означает прогноз на 7 дней. Мои данные выглядят так: enter image description here

А вот код

data_test = (data.loc['2014-01-01':,:])
data_train = data.loc[:'2013-12-31', :]

data_train = np.array(data_train)

X_train, y_train = [], []

for i in range(7, len(data_train)-7):
    X_train.append(data_train[i-7:i])
    y_train.append(data_train[i:i+7])

X_train, y_train = np.array(X_train), np.array(y_train)

nsamples, nx, ny = X_train.shape
X_train = X_train.reshape((nsamples,nx*ny))

nsamples, nx, ny = y_train.shape
y_train = y_train.reshape((nsamples,nx*ny))


x_scaler = MinMaxScaler()
X_train = x_scaler.fit_transform(X_train)

y_scaler = MinMaxScaler()
y_train = y_scaler.fit_transform(y_train)
print(X_train, y_train)

# >>>69692, 42 / 69692, 42


X_train = X_train.reshape(69692, 7, 6)
y_train = y_train.reshape(69692, 7, 6)

reg = Sequential()
reg.add(LSTM(units = 200, activation = 'relu', input_shape=(7,6)))
reg.Flatten()
reg.add(Dense(7))
reg.compile(loss='mse', optimizer='adam')
reg.fit(X_train, y_train, epochs = 100)



X_test, y_test = [], []
data_test = np.array(data_test)

for i in range(7, len(data_test)-7):
    X_test.append(data_test[i-7:i])
    y_test.append(data_test[i:i+7])



X_test, y_test = np.array(X_test), np.array(y_test)

nsamples, nx, ny = X_test.shape
X_test = X_test.reshape((nsamples,nx*ny))

nsamples, nx, ny = y_test.shape
y_test = y_test.reshape((nsamples,nx*ny))

X_test = x_scaler.transform(X_test)
y_test = y_scaler.transform(y_test)
print(X_test.shape, y_test.shape)
# >>> 12189, 42 / 12189, 42

X_test = X_test.reshape(12189,7,6)

y_pred = reg.predict(X_test)

1 Ответ

1 голос
/ 07 января 2020

Ваш код имеет это как Flatten: reg.Flatten()

Попробуйте вместо этого: reg.add(Flatten())

РЕДАКТИРОВАТЬ:

Я пробовал код похож на ваш ниже, и это сработало. Я не уверен, почему ваш Y имеет форму (7,6). Попытайтесь понять, чем мой код концептуально отличается от вашего (особенно ваш целевой вывод Y).

X_train = np.array([[6.8, 36.3,140.1,31,3.2,4],[7.6, 40.5, 141.4,0,4.6,5]])
X_train = X_train.reshape(2,3,2)
Y_train = np.array([[1],[3]])

reg = Sequential()
reg.add(LSTM(units = 200, activation = 'relu', input_shape=                        
(X_train.shape[1], X_train.shape[2]), return_sequences=True))
reg.add(Flatten())
reg.add(Dense(1))
reg.compile(loss='mse', optimizer='adam')
#reg.summary()
reg.fit(X_train, Y_train, epochs = 100)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...