如何在 keras 中使用 Conv1D 和双向 LSTM 对每个时间步进行多类分类?

Posted

技术标签:

【中文标题】如何在 keras 中使用 Conv1D 和双向 LSTM 对每个时间步进行多类分类?【英文标题】:How to use Conv1D and Bidirectional LSTM in keras to do multiclass classification of each timestep? 【发布时间】:2018-05-15 17:18:27 【问题描述】:

我正在尝试在 keras 中使用 Conv1D 和双向 LSTM(很像 this question)进行信号处理,但对每个时间步进行多类分类。

问题在于,即使 Conv1D 和 LSTM 使用的形状有些相同:

Conv1D:(批次、长度、通道) LSTM:(批次、时间步长、特征)

Conv1D 的输出为 = (length - (kernel_size - 1)/strides),因此不再匹配 LSTM 形状,即使不使用 MaxPooling1D 和 Dropout。

更具体地说,我的训练集 X 有 n 个样本,具有 1000 个时间步长和一个通道 (n_samples, 1000, 1),我使用了 LabelEncoder 和 OneHotEncoder,因此 y 有 n 个样本、1000 个时间步长和 5 个热编码类 (n_samples, 1000, 5)。

由于一个类比其他类更普遍(实际上是没有信号),我使用 loss='sparse_categorical_crossentropy'、sample_weight_mode="temporal" 和 sample_weight 为包含有意义类的时间步赋予更高的权重。

model = Sequential()
model.add(Conv1D(128, 3, strides=1, input_shape = (1000, 1), activation = 'relu'))
model.add(Bidirectional(LSTM(128, return_sequences=True)))
model.add(TimeDistributed(Dense(5, activation='softmax')))
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['categorical_accuracy'], sample_weight_mode="temporal")
print(model.summary())

Model

当我尝试拟合模型时,我收到以下错误消息:

检查目标时出错:预期 time_distributed_1 有形状 (None, 998, 1) 但得到了形状为 (100, 1000, 5) 的数组。

有没有办法让这样的神经网络配置工作?

【问题讨论】:

【参考方案1】:

您的卷积正在切割序列的尖端。在卷积层中使用padding='same'

不过,该消息似乎不适合您的模型。您的模型显然有 5 个输出特征(因为 Dense(5)),但按摩说它需要 1 个。这可能是因为“稀疏”交叉熵而发生的。根据您的数据格式,您可能应该使用“categorical_crossentropy”。

【讨论】:

感谢padding='same' 部分。但是,即使我有Dense(5),我也不知道为什么会收到该错误消息。现在它说:“预计 time_distributed_1 的形状为 (None, 1000, 1) 但得到的数组的形状为 (100, 1000, 5)”。 不是因为“稀疏”的分类交叉熵吗?如果您的数据包含所有 5 个元素,我认为您不需要稀疏。 太好了,就是这样!改为“categorical_crossentropy”,效果很好!我想知道什么时候会使用“sparse_categorical_crossentropy”... 稀疏张量通过消除零数据来尝试变得更小。对于使用“sparse_categorical_crossentropy”,您可能应该尝试在模型中使用所有可能的稀疏数据,并使您的数据也稀疏。 (但我不知道怎么做,没有稀疏模型的经验) 稀疏张量通过消除零数据来尝试变得更小。对于使用“sparse_categorical_crossentropy”,您可能应该尝试在模型中使用所有可能的稀疏数据,并使您的数据也稀疏。 (但我不知道怎么做,没有稀疏模型的经验)

以上是关于如何在 keras 中使用 Conv1D 和双向 LSTM 对每个时间步进行多类分类?的主要内容,如果未能解决你的问题,请参考以下文章

Conv1D 层 Keras 的 input_shape

为啥 Keras Conv1D 层的输出张量没有输入维度?

Keras Conv1d 参数及输入输出详解

在 Keras 的卷积层上使用 Dropout

卷积层(CNN)如何在 keras 中工作?

Keras 中具有批量标准化的双向 LSTM