【问题标题】:Error with input shapes for TimeseriesGenerator in a LSTM stacked RNNLSTM 堆叠 RNN 中 TimeseriesGenerator 的输入形状错误
【发布时间】:2019-07-28 22:20:07
【问题描述】:

我正在尝试使用 13 个数据特征创建一个预测未来股票数据的模型。我正在使用 TimeseriesGenerator,但是当我尝试拟合我的模型时,我收到一条错误消息:

ValueError: 检查输入时出错:预期 lstm_1_input 的形状为 (529, 13) 但得到的数组的形状为 (5, 13)

我的数据集有 529 行我想用来训练预测接下来的 5 天。对此的任何帮助将不胜感激。

# Part 1 - Data Preprocessing

# Importing the Libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from keras.preprocessing.sequence import TimeseriesGenerator


# Importing the Training Set
dataset_train = pd.read_csv('data.csv')
training_set_indicators = dataset_train.iloc[:, 1:14].values


# Feature Scaling
from sklearn.preprocessing import MinMaxScaler
sc = MinMaxScaler(feature_range = (0,1))
training_set_indicators_scaled = sc.fit_transform(training_set_indicators)
final_dataset = training_set_indicators_scaled


# Part 2 - Building the RNN

# Importing the Keras libraries and packages
from keras.models import Sequential
from keras.layers import LSTM
from keras.layers import Dense
from keras.layers import Dropout


n_features = final_dataset.shape[1]
n_lag = 5

generator = TimeseriesGenerator(final_dataset, final_dataset, length = n_lag, batch_size = 8)

# Initializing the RNN
regressor = Sequential()


# Adding the first LSTM layer and some Dropout Regularization
regressor.add(LSTM(units = 250, return_sequences = True, input_shape = (final_dataset.shape[0], final_dataset.shape[1])))
regressor.add(Dropout(0.2))


# Adding the second LSTM layer and some Dropout Regularization
regressor.add(LSTM(units = 250))
regressor.add(Dropout(0.2))


# Adding the Output Layer
regressor.add(Dense(units = 13))


# Compiling the RNN
regressor.compile(optimizer = 'adam', loss = 'mse')


# Fitting the RNN to the Training Set
regressor.fit_generator(generator, epochs = 100, verbose = 2)

【问题讨论】:

    标签: python keras deep-learning time-series lstm


    【解决方案1】:

    TimeseriesGenerator 中的length 参数指的是要从序列中提取的时间步数。因此,在您使用length=n_lag 的示例中,作为n_lag=5,您的生成器正在生成长度为5 的子序列。

    错误是因为你已经设置而被抛出

    input_shape = (final_dataset.shape[0], final_dataset.shape[1])
    

    final_dataset.shape[0]=529,因此您的模型需要长度为 529 的输入序列。

    至于

    预测未来 5 天

    您需要决定是要在当前序列中的选定子序列后 5 天进行预测,还是要在完整序列后 5 天进行预测(这将需要 5 个以上标记的时间点进行训练)。在这两种情况下,您都应该考虑将 RNN 的输出作为输入返回。

    【讨论】:

    • 感谢雅各布!通过调整输入形状,我让它按照您的建议工作。但只是对您所说的“在这两种情况下,您应该考虑将 RNN 的输出作为输入反馈回来”的意思感到困惑。您的意思是在反向传播方面如何将输出重定向为输入?
    • 例如,如果您训练模型预测第 N+1 步,给定第 N 步,那么要预测未来 5 步,您将需要输入第 N+1 步并重复该过程。
    猜你喜欢
    • 1970-01-01
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2022-01-15
    • 2020-06-10
    • 2019-02-18
    相关资源
    最近更新 更多