如何在 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 对每个时间步进行多类分类?的主要内容,如果未能解决你的问题,请参考以下文章