Tensorflow ValueError:如果LSTM的'stateful=True`

Tensorflow ValueError:如果LSTM的'stateful=True`,tensorflow,keras,keras-layer,Tensorflow,Keras,Keras Layer,我尝试将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

我尝试将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,)

然而,我得到:

ValueError: Error when checking target: expected dense_1 to have 3 dimensions, but got array with shape (816, 1)
PS此代码改编自两个小错误:

给你

regressor.add(LSTM(units = 64, batch_input_shape=(train_X.shape[0], batch_size, n_feats),
               activation = 'sigmoid',
               stateful=True, return_sequences=True))
regressor.fit(train_X, train_y, batch_size=7, epochs = 1, callbacks=[resetCallback])
此LSTM将返回一个3D向量,但y是2D,这会抛出一个ValueError。您可以使用
return\u sequences=False
修复此问题。我不知道为什么最初在
批输入中有
train\u X.shape[0]
,整个集合中的样本数量不应影响每个批的大小

    regressor.add(LSTM(units = 64, batch_input_shape=(1, batch_size, n_feats),
               activation = 'sigmoid',
               stateful=True, return_sequences=False))
在这之后你有

regressor.add(LSTM(units = 64, batch_input_shape=(train_X.shape[0], batch_size, n_feats),
               activation = 'sigmoid',
               stateful=True, return_sequences=True))
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])
你的预测也是如此。您必须指定
批次大小=1

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

他的y有3个阴影,你的有2个。为了减少维度,我使用了
返回\u sequences=False
。他不必这样做,因为他的输入和输出都是相同的DIM。你可以这样做:添加另一个返回序列为True的LSTM层,最后一个返回序列为false,以减少到2yeah。我想你也希望输出是2D的,所以你只需要预测下一个价格,而不是更多的功能。我认为这不会对你的模型的性能有多大影响,如果你记住,制作神经网络最重要的部分是选择你输入的数据并预处理这些数据。不管是哪种模式,如果垃圾进入,垃圾就会流出。