python - 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 长的二进制向量。
谢谢!
解决方案
当您处理 Conv1D、RNN 或序列模型时,输出可以是一对一、多对一、(或)多对多。在这种情况下,模型是多对一的。通常,在 Keras 中,有一个return_sequence
orstateful
参数。如果这些参数为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 背后的架构理念。
推荐阅读
- matplotlib - 描述 Julia 中 2D 空间中数据点密度的图
- r - 更改相关矩阵配色方案以从指定的颜色标签开始
- twitter-bootstrap - Bootstrap 圆角右上角
- c - `char *` 和 `int *` 之间的不同语义
- vba - 使用未绑定的文本框附加到表格
- php - 带有 HTTP_NO_CONTENT/204 的 DELETE 不返回响应
- javascript - 如何向不支持 CORS 的服务器发出请求?
- sql - 有条件地执行滞后的 MAX 和 MIN 计算 - Oracle SQL
- java - 令牌编码/解码问题 - Spring
- visual-studio - Visual Studio 2019 版本 16.3.0 和 Blazor Web 程序集应用程序模板