我正在尝试使用keras训练LSTM模型,但我认为我在这里遇到了一些问题。
我收到错误
ValueError:检查输入时出错:预期lstm_17_input有 3个维度,但得到了具有形状的数组(10000,0,20)
虽然我的代码看起来像
model = Sequential()
model.add(LSTM(256, activation="relu", dropout=0.25, recurrent_dropout=0.25, input_shape=(None, 20, 64)))
model.add(Dense(1, activation="sigmoid"))
model.compile(loss='binary_crossentropy',
optimizer='adam',
metrics=['accuracy'])
model.fit(X_train, y_train,
batch_size=batch_size,
epochs=10)
其中X_train
的形状为(10000, 20)
,前几个数据点就像
array([[ 0, 0, 0, ..., 40, 40, 9],
[ 0, 0, 0, ..., 33, 20, 51],
[ 0, 0, 0, ..., 54, 54, 50],
...
和y_train
的形状为(10000, )
,这是一个二进制(0/1)标签数组。
有人能指出我错在哪里吗?
答案 0 :(得分:13)
为了完整起见,这里发生了什么。
首先,LSTM
与Keras中的所有图层一样,接受两个参数:input_shape
和batch_input_shape
。区别在于input_shape
不包含批量大小,而batch_input_shape
是完整输入形状,包括批量大小。
因此,规范input_shape=(None, 20, 64)
告诉keras期望一个4维输入,这不是你想要的。正确的只是(20,)
。
但并非全部。 LSTM层是一个循环层,因此它需要一个三维输入(batch_size, timesteps, input_dim)
。这就是正确规范为input_shape=(20, 1)
或batch_input_shape=(10000, 20, 1)
的原因。此外,您的训练阵列也应重新整形,以表示每步的{1}}时间步长和20
输入功能。
因此,解决方案:
1