我在尝试理解如何在Keras上编写Conv1D模型,但一直遇到维度不匹配的错误。目前x_train的维度是[1000,294](1000个样本,每个样本有294个特征),而y_train的维度是[1000,9](1000个样本,每个样本有9个标签)。我不断收到错误消息,说期望3个维度但实际得到2个维度。我尝试修复它,但错误再次出现。GitHub上的一些问题建议使用Flatten()
,但我已经使用了这个方法却没有解决问题。你们有什么想法吗?我错过了什么?谢谢
我得到的错误是,
- ValueError: 输入0与层conv1d_1不兼容:期望ndim=3,但找到ndim=2
代码如下所示
tb = [keras.callbacks.TensorBoard(log_dir='./dllogs')]main_input = Input(shape=(294, ), dtype='float32')x_train = np.array(x_train)y_train = np.array(y_train)x_dev = np.array(x_dev)y_dev = np.array(y_dev)x = Conv1D(128, 5, activation='relu')(main_input)x = MaxPooling1D(5)(x)x = Conv1D(128, 5, activation='relu')(x)x = MaxPooling1D(5)(x)x = Conv1D(128, 5, activation='relu')(x)x = MaxPooling1D(35)(x)x = Flatten()(x)x = Dropout(0.25)(x)x = Dense(128, activation='relu')(x)preds = Dense(pred_dim, activation='softmax')(x)model = Model(inputs=main_input, outputs=preds)model.compile(optimizer='adam', loss='kullback_leibler_divergence', metrics=['accuracy'])print(model.summary())history_NN = model.fit(x_train, y_train, batch_size=BATCHSIZE, epochs=EPOCHS, callbacks=tb, validation_data=(x_dev, y_dev))
回答
- 维度问题一直困扰着我,这个问题在Today的评论中得到了解决。
- 接下来是池化维度的问题,这是池化后维度的减少,所以在整个过程中,最终的池化没有35个滑动窗口,当我改变它时,问题得到了解决。
修改后的代码,
tb = [keras.callbacks.TensorBoard(log_dir='./dllogs')]main_input = Input(shape=(294, 1))#已更改x_train = np.array(x_train)y_train = np.array(y_train)x_dev = np.array(x_dev)y_dev = np.array(y_dev)x_train = np.expand_dims(x_train, axis=-1) #已更改x_dev = np.expand_dims(x_dev, axis=-1) #已更改x = Conv1D(128, 5, activation='relu')(main_input)x = MaxPooling1D(5)(x)x = Conv1D(128, 5, activation='relu')(x)x = MaxPooling1D(5)(x)x = Conv1D(128, 5, activation='relu')(x)x = MaxPooling1D(11)(x)x = Flatten()(x)x = Dropout(0.25)(x)x = Dense(128, activation='relu')(x)preds = Dense(pred_dim, activation='softmax')(x)model = Model(inputs=main_input, outputs=preds)model.compile(optimizer='adam', loss='kullback_leibler_divergence', metrics=['accuracy'])print(model.summary())history_NN = model.fit(x_train, y_train, batch_size=BATCHSIZE, epochs=EPOCHS, callbacks=tb, validation_data=(x_dev, y_dev))
回答:
Conv1D
层期望输入的形状为(sequence_length, num_features)
的序列。看起来你有长度为294的序列,每个序列只有一个特征;因此,每个输入样本需要具有(294,1)
的形状(而不是(294,)
)。为了修复这个问题,你可以使用np.expand_dims
为你的输入数据添加一个大小为1的第三维:
x_train = np.expand_dims(x_train, axis=-1)x_dev = np.expand_dims(x_dev, axis=-1)main_input = Input(shape=(294, 1)) # 同样在这里修复输入形状