首页 > 解决方案 > Keras 模型网络 3D 输入到 2D 输出

问题描述

我有一个 3D 输入(样本、步骤、特征)。因此,每个样本都有一系列具有不同特征的步骤。现在,我想要一个 2D 输出(样本、步骤),其中我有样本,并且在样本的每个步骤中,从模型中计算出 0 或 1。

所以我认为这是一个顺序二进制分类问题。我有一些难以定义的模型,尤其是输出层。

以下是 numpy 数组的形状:

x_train.shape 
# (200, 1657, 669)

x_test.shape
# (41, 1657, 669)

y_train.shape
# (200, 1657)

y_test.shape
# (41, 1657)

我试过这个模型,但输出不是我期望的

n_residues, n_features, n_outputs = trainX.shape[1], trainX.shape[2], trainy.shape[1]
model = Sequential()
model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(n_residues,n_features)))
model.add(Conv1D(filters=64, kernel_size=3, activation='relu'))
model.add(Dropout(0.1))
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(Dense(100, activation='relu'))
model.add(Dense(n_outputs, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# fit network
model.fit(trainX, trainy, epochs=epochs, batch_size=batch_size, verbose=verbose)
m_classes = model.predict_classes(x_test, verbose=0)
print(m_classes)
[  36   36   59   32   16   32   36  804 1047   16   16   36   32   36
   36   36   16   16   16   16   16   16   36   16   36   36   36   16
   59   36   36   36   16   16   16  804   16   16   16   36   36]

输出是测试集中 41 个样本的 41 长向量,我假设类为 0 -1657。

我想要的测试集输出是 41 个 1657 长的二进制向量。

谢谢!

标签: pythonkerasneural-network

解决方案


当您处理 Conv1D、RNN 或序列模型时,输出可以是一对一、多对一、(或)多对多。在这种情况下,模型是多对一的。通常,在 Keras 中,有一个return_sequenceorstateful参数。如果这些参数为False,那么您的模型的行为就像many to one。(即..,输出形状是(batch_size,unit_length)。在这种情况下,单位长度是一个输出)。要制作模型many to many,输出应该类似于(batch_size, time_step, unit_length)。只需初始化stateful==True将帮助您解决此问题。

一些有助于理解序列输出数据的有用链接
理解 LSTM
一个接一个地提供预测

查看 conv1D 初始化官方文档,设置参数stateful=True。这是 LSTM 或 Conv1D 背后的理论思想。此链接将帮助您获得 LSTM 背后的架构理念。


推荐阅读