【发布时间】: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())
当我尝试拟合模型时,我收到以下错误消息:
检查目标时出错:预期 time_distributed_1 有形状 (None, 998, 1) 但得到了形状为 (100, 1000, 5) 的数组。
有没有办法让这样的神经网络配置工作?
【问题讨论】:
标签: python deep-learning keras convolution recurrent-neural-network