训练时 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).
你好,最近我一直在做一个 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).