【问题标题】:ValueError: in case of LSTM with `stateful=True`ValueError:如果 LSTM 使用 `stateful=True`
【发布时间】:2018-04-15 13:00:44
【问题描述】:

我尝试将 LSTM 网络与stateful=True 一起使用,如下所示:

import numpy as np, pandas as pd, matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import Dense, LSTM
from keras.callbacks import LambdaCallback
from sklearn.metrics import mean_squared_error
from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import StandardScaler

raw = np.sin(2*np.pi*np.arange(1024)/float(1024/2))
data = pd.DataFrame(raw)

window_size = 3
data_s = data.copy()
for i in range(window_size):
    data = pd.concat([data, data_s.shift(-(i+1))], axis = 1)   
data.dropna(axis=0, inplace=True)

print (data)
ds = data.values

n_rows = ds.shape[0]
ts = int(n_rows * 0.8)

train_data = ds[:ts,:]
test_data = ds[ts:,:]

train_X = train_data[:,:-1]
train_y = train_data[:,-1]
test_X = test_data[:,:-1]
test_y = test_data[:,-1]

print (train_X.shape)
print (train_y.shape)
print (test_X.shape)
print (test_y.shape)

(816, 3) (816,) (205, 3) (205,)

batch_size = 3
n_feats = 1

train_X = train_X.reshape(train_X.shape[0], batch_size, n_feats)
test_X = test_X.reshape(test_X.shape[0], batch_size, n_feats)
print(train_X.shape, train_y.shape)

regressor = Sequential()
regressor.add(LSTM(units = 64, batch_input_shape=(train_X.shape[0], batch_size, n_feats),
                   activation = 'sigmoid',  
                   stateful=True, return_sequences=True))

regressor.add(Dense(units = 1))

regressor.compile(optimizer = 'adam', loss = 'mean_squared_error')

resetCallback = LambdaCallback(on_epoch_begin=lambda epoch,logs: regressor.reset_states())

regressor.fit(train_X, train_y, batch_size=7, epochs = 1, callbacks=[resetCallback])

previous_inputs = test_X                                    
regressor.reset_states()

previous_predictions = regressor.predict(previous_inputs).reshape(-1)
test_y = test_y.reshape(-1)
plt.plot(test_y, color = 'blue')
plt.plot(previous_predictions, color = 'red')
plt.show()

但是,我得到了:

ValueError: Error when checking target: expected dense_1 to have 3 dimensions, but got array with shape (816, 1)

PS 此代码已改编自https://github.com/danmoller/TestRepo/blob/master/testing%20the%20blog%20code%20-%20train%20and%20pred.ipynb

【问题讨论】:

    标签: tensorflow keras keras-layer


    【解决方案1】:

    两个小错误:

    给你

    regressor.add(LSTM(units = 64, batch_input_shape=(train_X.shape[0], batch_size, n_feats),
                   activation = 'sigmoid',
                   stateful=True, return_sequences=True))
    

    这个 LSTM 将返回一个 3D 向量,但您的 y 是 2D 会引发 valueerror。您可以使用return_sequences=False 解决此问题。我不确定为什么您最初在您的 batch_input 中包含 train_X.shape[0],整个集合中的样本数量不应影响每批的大小。

        regressor.add(LSTM(units = 64, batch_input_shape=(1, batch_size, n_feats),
                   activation = 'sigmoid',
                   stateful=True, return_sequences=False))
    

    在这之后你有

    regressor.fit(train_X, train_y, batch_size=7, epochs = 1, callbacks=[resetCallback])
    

    在有状态网络中,您只能输入除以批量大小的多个输入。由于 7 不除以 816,我们将其更改为 1:

    regressor.fit(train_X, train_y, batch_size=1, epochs = 1, callbacks=[resetCallback])
    

    您的预测也是如此。你必须指定batch_size=1:

    previous_predictions = regressor.predict(previous_inputs, batch_size=1).reshape(-1)
    

    【讨论】:

    • 他有 3 个暗淡,你有 2 个。为了减小尺寸,我有 return_sequences=False。他不必那样做,因为他的进出都是一样的暗淡
    • 你可以,但是怎么样:你添加另一个 LSTM 层 return_sequences=True 并让最后一个带有它的 false 减少到 2
    • 是的。我认为您还希望输出为 2D,因此您只需预测下一个价格而不是更多功能
    • 我认为它不会对模型的性能产生太大影响
    • 请记住,制作神经网络最重要的部分是选择您输入的数据并预处理该数据。无论型号如何,如果垃圾进入,垃​​圾就会流出。
    猜你喜欢
    • 1970-01-01
    • 2018-07-01
    • 2019-03-31
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多