训练时 RNN LSTM 值错误

时间:2021-05-27 18:22:46

标签: python numpy keras deep-learning lstm

嗨,最近我一直在研究 RNN LSTM 项目,我有一个像这样的 2D 数据集

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

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

1 个答案:

答案 0 :(得分:0)

变化:

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,即{{1} }.

但同样,如果您真的想对 batch_size 进行硬编码,您仍然可以这样做。为此,您必须使用 (None, X_train.shape[0],X_train.shape[1],X_train.shape[2]) 而不是 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 中发送 32,但它们应该相等. 批大小通常小于数据集大小)。