首页 文章

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

提问于
浏览
0

我正在尝试在keras中使用Conv1D和双向LSTM(非常类似于this question)进行信号处理,但是对每个时间步进行多类分类 .

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

Conv1D :(批次,长度,通道)LSTM :(批次,时间步,功能)

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

更具体地说,我的训练集X有n个样本,有1000个时间步长和一个通道(n_samples,1000,1),我使用LabelEncoder和OneHotEncoder,所以你有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具有形状(无,998,1)但是具有形状(100,1000,5)的数组 .

Is there a way to make such a neural network configuration work?

1 回答

  • 1

    你的卷积正在削减序列的提示 . 在卷积层中使用 padding='same' .

    但是,该消息似乎不适合您的模型 . 你的模型显然有5个输出功能(因为 Dense(5) ),但按摩说它预计1.可能这是因为"sparse" crossentropy发生 . 根据数据格式,您应该使用"categorical_crossentropy" .

相关问题