了解Keras LSTM NN输入和输出以进行二进制分类

时间:2018-11-22 23:31:15

标签: python tensorflow keras lstm

我正在尝试创建一个简单的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,)

1 个答案:

答案 0 :(得分:1)

您已经接近问题的最后评论。由于这是二进制分类问题,因此每个输入应该有1个输出,因此您需要摆脱16 s中的y并将其替换为1

此外,您需要能够将火车组除以您的批次大小,因此可以使用5008

事实上:

ytrain.shape == (5000, 1)

传递您提到的错误,但引发一个新错误:

  

ValueError:在有状态网络中,您应仅传递输入,输入中包含的样本数量可以用批大小进行划分。找到:5000个样本

通过确保满足以下条件来解决

xtrain.shape == (5008, 16, 6)
ytrain.shape == (5008, 1)