我正在尝试在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())
当我尝试适应模型时,我收到以下错误消息:
检查目标时出错:预期time_distributed_1具有形状(无,998,1)但是具有形状(100,1000,5)的数组 .
Is there a way to make such a neural network configuration work?
1 回答
你的卷积正在削减序列的提示 . 在卷积层中使用
padding='same'
.但是,该消息似乎不适合您的模型 . 你的模型显然有5个输出功能(因为
Dense(5)
),但按摩说它预计1.可能这是因为"sparse" crossentropy发生 . 根据数据格式,您应该使用"categorical_crossentropy" .