训练时 RNN LSTM valueError

RNN LSTM valueError while training

你好,最近我一直在做一个 RNN LSTM 项目,我有一个二维数据集

x = [[x1,x2,x3...,x18],[x1,x2,x3...,x18],...]
y = [[y1,y2,y3],[y1,y2,y3],...]

X.shape => (295,5,18)
Y.shape => (295,3)

然后我通过下面的代码将其转换为 3D 数据集

X_train = []
Y_train = []

for i in range(5,300):
    X_train.append(training_set_scaled[i-5:i,0:18])
    Y_train.append(training_set_scaled[i,18:22])
    
X_train, Y_train = np.array(X_train), np.array(Y_train)

然后将 Keras 用于 LSTM

from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers import Dropout

regressor = Sequential()

regressor.add(LSTM(units=50, return_sequences=True,input_shape=(X_train.shape[0],X_train.shape[1],X_train.shape[2])))
regressor.add(Dropout(0.1))

regressor.add(LSTM(units=50, return_sequences=True))
regressor.add(Dropout(0.1))

regressor.add(LSTM(units=50, return_sequences=True))
regressor.add(Dropout(0.1))

regressor.add(LSTM(units=50, return_sequences=True))
regressor.add(Dropout(0.1))

regressor.add(LSTM(units=50))
regressor.add(Dropout(0.1))


regressor.add(Dense(units= 1))

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

regressor.fit(X_train,Y_train, epochs = 100, batch_size = 32)

当我 运行 这个脚本时,我得到以下错误:

ValueError: Input 0 is incompatible with layer lstm_104: expected ndim=3, found ndim=4

我不知道这个问题有没有人能帮助我?

变化:

input_shape=(X_train.shape[0],X_train.shape[1],X_train.shape[2])

input_shape=(X_train.shape[1],X_train.shape[2])

基本上 keras 旨在在单个批次中获取任意数量的示例,因此它会自动将 None 作为第一个参数。所以,当你提到剩下的2个维度时,它总共得到3维输入,但是如果你自己提到第一个维度,维度的数量就变成了4,即(None, X_train.shape[0],X_train.shape[1],X_train.shape[2]) ].

但是,如果您真的想对 batch_size 进行硬编码,您仍然可以这样做。为此,您必须使用 batch_input_shape 而不是 input_shape,如下所示:

regressor.add(LSTM(units=50, return_sequences=True, batch_input_shape=(X_train.shape[0], X_train.shape[1], X_train.shape[2])))

它将使您能够控制为网络设置的特定批量大小。 (在这种情况下,您的程序还有另一个缺陷,您正在设置批量大小 X_train.shape[0],即 295,但您在 fit() 中发送 32,但它们应该相等.另外batch size一般取小于data set size).