我正在尝试创建一个简单的LSTM网络,该网络将基于最近的16个时间帧提供一些输出。假设我有一个包含112000行(度量)和7列(6个要素+类)的数据集。我了解的是,我必须将数据集“打包”成X个16个元素的长批次。对于112000行,这意味着112000/16 = 7000批,因此是一个形状为(7000,16,7)的numpy 3D数组。拆分该数组以获取训练和测试数据,我得到了形状:
xtrain.shape == (5000, 16, 6)
ytrain.shape == (5000, 16)
xtest.shape == (2000, 16, 6)
ytest.shape == (2000, 16)
我的模型如下:
model.add(keras.layers.LSTM(8, input_shape=(16, 6), stateful=True, batch_size=16, name="input"));
model.add(keras.layers.Dense(5, activation="relu", name="hidden1"));
model.add(keras.layers.Dense(1, activation="sigmoid", name="output"));
model.compile(optimizer="rmsprop", loss="binary_crossentropy", metrics=["accuracy"]);
model.fit(xtrain, ytrain, batch_size=16, epochs=10);
但是在尝试拟合模型后,出现此错误:
ValueError:检查目标时出错:预期输出的形状为(1,),但数组的形状为(16,)
我猜错了,该模型期望每批输出一个输出(因此,ytrain形状应为(5000,)),而不是16个输出(批处理中的每个条目一个输出-(5000,16))
如果是这样,我是否应该像这样打包数据,而不是为每个输出创建一个16个元素长的批处理?因此拥有
xtrain.shape == (80000, 16, 6)
ytrain.shape == (80000,)
xtest.shape == (32000, 16, 6)
ytest.shape == (32000,)
答案 0 :(得分:1)
您已经接近问题的最后评论。由于这是二进制分类问题,因此每个输入应该有1
个输出,因此您需要摆脱16
s中的y
并将其替换为1
此外,您需要能够将火车组除以您的批次大小,因此可以使用5008
。
事实上:
ytrain.shape == (5000, 1)
传递您提到的错误,但引发一个新错误:
ValueError:在有状态网络中,您应仅传递输入,输入中包含的样本数量可以用批大小进行划分。找到:5000个样本
通过确保满足以下条件来解决
xtrain.shape == (5008, 16, 6)
ytrain.shape == (5008, 1)