【问题标题】:How to set up the LSTM network?如何建立 LSTM 网络?
【发布时间】:2019-09-16 03:57:04
【问题描述】:

我正在学习如何设置 RNN-LSTM 网络进行预测。我已经用一个变量创建了数据集。

x  y
1  2.5
2  6
3  8.6
4  11.2
5  13.8
6  16.4
...

y(t) = 2.5x(t) + x(t-1) -0.9*x(t-2)的关系。我正在尝试设置 RNN-LSTM 来学习该模式,但它发生了我的程序错误。我的程序如下:

df= pd.read_excel('dataset.xlsx')

def split_dataset(data):
    # split into standard weeks
    train, test = data[:-328], data[-328:-6]
    # restructure into windows of weekly data
    train = np.array(np.split(train, len(train)/1))
    test = np.array(np.split(test, len(test)/1))
    return train, test

verbose, epochs, batch_size = 0, 20, 16
train, test = split_dataset(df.values)
train_x, train_y = train[:,:,0], train[:,:,1]


model = Sequential()
model.add(LSTM(200, return_sequences=True, input_shape = train_x.shape))
model.compile(loss='mse', optimizer='adam')

发生ValueError:

ValueError: Error when checking input: expected lstm_35_input to have 3 dimensions, but got array with shape (8766, 1)

有经验的DS或者pythoner可以教教我怎么设置网络吗?

谢谢

【问题讨论】:

    标签: python lstm recurrent-neural-network


    【解决方案1】:

    对于基于 LSTM 的 RNN,输入应该是 3 维(批次、时间、数据点)。我假设您的 x 变量的索引是它的时间。在这种情况下,你必须将你的输入转换成一些窗口的批次,比如一个 3 的窗口,那么你的输入是:

    批次#       输入      目标

    0        x[0:3]       y[3]

    1        x[1:4]        y[4]

    2        x[2:5]        y[5]

    注意:您的 y 从 t=3 开始,因为您使用最后 3 个时间步来预测下一个第 4 个值。如果您的 y 已经按照您所说的从最后三个时间步计算,那么 y 应该从 0 索引开始,即在第 0 批您有 y[0] 作为目标

    UPDATE 根据以下评论 如果你想有多个序列,那么你可以将它建模为一个序列到序列的问题,并且将是一个N to M 映射,你需要五个 x 值来预测三个 y:

    批次#       输入      目标

    0        x[0:5]       y[3:6]

    1        x[1:6]        y[4:7]

    2        x[2:7]        y[5:8]

    【讨论】:

    • 可行,但如何预测多步?你能告诉我更多吗?我已经问过上面的问题了。
    • 多步骤是什么意思,能详细说明一下吗?
    • 基于 (x(t),x(t-1)) 预测 y(t), y(t+1)... 或更多 ,这意味着输出不仅仅是一个值.
    • python中的代码怎么样?如何在 python LSTM 设置中写这个?我上面的第二个回复显示了我尝试过的内容和其他问题。
    • 您不应该通过创建两个帖子在一个主题中提出两个问题。您能否接受并投票赞成我的回答,然后再提出另一个问题?您的第一个问题已得到解答,第二个问题需要自己的另一个主题。
    【解决方案2】:

    目前,我已经创建了数据窗口,它看起来适合我提到的案例。

    下面是我的代码:

    df= pd.read_excel('dataset.xlsx')
    
    # split a univariate dataset into train/test sets
    def split_dataset(data):
        train, test = data[:-328], data[-328:-6]
        return train, test
    
    train, test  = split_dataset(df.values)
    
    # scale train and test data to [-1, 1]
    def scale(train, test):
        # fit scaler
        scaler = MinMaxScaler(feature_range=(0,1))
        scaler = scaler.fit(train)
        # transform train
        #train = train.reshape(train.shape[0], train.shape[1])
        train_scaled = scaler.transform(train)
        # transform test
        #test = test.reshape(test.shape[0], test.shape[1])
        test_scaled = scaler.transform(test)
        return scaler, train_scaled, test_scaled
    
    scaler, train_scaled, test_scaled = scale(train, test)
    
    def to_supervised(train, n_input, n_out=7):
        # flatten data
        data = train
        X, y = list(), list()
        in_start = 0
        # step over the entire history one time step at a time
        for _ in range(len(data)):
            # define the end of the input sequence
            in_end = in_start + n_input
            out_end = in_end + n_out
            # ensure we have enough data for this instance
            if out_end <= len(data):
                x_input = data[in_start:in_end, 0]
                x_input = x_input.reshape((len(x_input), 1))
                X.append(x_input)
                y.append(data[in_end:out_end, 0])
            # move along one time step
            in_start += 1
        return np.array(X), np.array(y)
    train_x, train_y = to_supervised(train_scaled, n_input = 3, n_out = 1)
    test_x, test_y =  to_supervised(test_scaled, n_input = 3, n_out = 1)
    
    verbose, epochs, batch_size = 0, 20, 16
    n_timesteps, n_features, n_outputs = train_x.shape[1], train_x.shape[2], train_y.shape[1]
    
    
    model = Sequential()
    model.add(LSTM(200, return_sequences= False, input_shape = (train_x.shape[1],train_x.shape[2])))
    model.add(Dense(1))
    model.compile(loss = 'mse', optimizer = 'adam')
    history = model.fit(train_x, train_y, epochs=epochs, verbose=verbose, validation_data = (test_x, test_y))
    

    不过,我对此还有其他疑问:

    Q1:LSTM中的units是什么意思? [model.add(LSTM(units, ...))]

    (我已经为模型尝试了不同的单位,随着单位的增加会更准确。)

    Q2:我应该设置多少层?

    Q3:如何预测多步?例如基于 (x(t),x(t-1)) 预测 y(t), y(t+1) 我曾尝试在to_supervised函数中设置n_out = 2,但是当我应用相同的方法时,它返回了错误

    train_x, train_y = to_supervised(train_scaled, n_input = 3, n_out = 2)
    test_x, test_y =  to_supervised(test_scaled, n_input = 3, n_out = 2)
    
    verbose, epochs, batch_size = 0, 20, 16
    n_timesteps, n_features, n_outputs = train_x.shape[1], train_x.shape[2], train_y.shape[1]
    
    model = Sequential()
    model.add(LSTM(200, return_sequences= False, input_shape = (train_x.shape[1],train_x.shape[2])))
    model.add(Dense(1))
    model.compile(loss = 'mse', optimizer = 'adam')
    history = model.fit(train_x, train_y, epochs=epochs, verbose=verbose, validation_data = (test_x, test_y))
    
    
    ValueError: Error when checking target: expected dense_27 to have shape (1,) but got array with shape (2,)
    

    Q3(续):我应该在模型设置中添加或更改什么?

    Q3(续):return_sequences 是什么?我应该什么时候设置True

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    • 2017-07-09
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多