【问题标题】:Incompatible input data error in keras, dimensions mismatch ValueErrorkeras 中输入数据不兼容错误,尺寸不匹配 ValueError
【发布时间】:2019-08-29 16:37:04
【问题描述】:

我试图了解如何在 Keras 上编写 Conv1D 模型,但我一直遇到维度不匹配错误。现在 x_train = [1000,294](1000 个项目和 294 个特征)和 y_train = [1000,9](1000 个项目和 9 个标签)。我不断收到错误消息,预期为 3 个维度,但得到了 2 个维度。但是我尝试修复它,它又出现了。 github上的一些问题建议Flatten(),但它已经存在并且没有运气。知道我错过了什么吗?谢谢

我得到的错误,

  1. 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))

回答

  1. 尺寸是一个引起麻烦的问题,今天的评论已解决了这个问题。
    1. 接下来是池化尺寸,这是在池化后减少的尺寸,所以在整个事情之后,当我更改它时,它没有 35 个幻灯片用于最终池化。固定的。

结果代码,

tb = [keras.callbacks.TensorBoard(log_dir='./dllogs')]
main_input = Input(shape=(294, 1))#changed

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) #changed
x_dev = np.expand_dims(x_dev, axis=-1) #changed
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))

【问题讨论】:

    标签: python machine-learning keras conv-neural-network


    【解决方案1】:

    Conv1D 层需要形状为(sequence_length, num_features)序列 输入。看来你有长度为 294 的序列,具有 one 特征;因此,每个输入样本需要具有(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)) # fix the input shape here as well 
    

    【讨论】:

    • 感谢您,它解决了尺寸问题。之后我在 MaxPooling1D 中遇到错误。具体来说,ValueError: Negative dimension size caused by substracting 35 from 6 for 'max_pooling1d_3/MaxPool' (op: 'MaxPool') with input shapes: [?,6,1,128]
    • 我发现这是最大池化层造成的。我将 Pool1D 层从 35 减少到 6 并且它可以工作。谢谢
    猜你喜欢
    • 1970-01-01
    • 2016-08-26
    • 2017-08-02
    • 2012-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多