【问题标题】:Keras input shape throws value error expected 4d but got an array with shape (60000, 28,28)Keras 输入形状抛出预期 4d 的值错误,但得到一个形状为 (60000, 28,28) 的数组
【发布时间】:2020-05-15 06:56:30
【问题描述】:
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.fashion_mnist.load_data()
x_train = x_train.astype('float32') / 255
x_test = x_test.astype('float32') / 255

x_train.shape #Shape is (60000, 28, 28)

然后模型确保输入形状为 28,28,1,因为 60k 是样本。

model2 = tf.keras.Sequential()
# Must define the input shape in the first layer of the neural network
model2.add(tf.keras.layers.Conv2D(filters=64, kernel_size=2, padding='same', activation='relu', input_shape=(28,28,1))) 
model2.add(tf.keras.layers.MaxPooling2D(pool_size=2))
model2.add(tf.keras.layers.Dropout(0.3))
model2.add(tf.keras.layers.Conv2D(filters=32, kernel_size=2, padding='same', activation='relu'))
model2.add(tf.keras.layers.MaxPooling2D(pool_size=2))
model2.add(tf.keras.layers.Dropout(0.3))
model2.add(tf.keras.layers.Flatten())
model2.add(tf.keras.layers.Dense(256, activation='relu'))
model2.add(tf.keras.layers.Dropout(0.5))
model2.add(tf.keras.layers.Dense(10, activation='softmax'))
model2.compile(loss='categorical_crossentropy',
             optimizer='adam',
             metrics=['accuracy'])
model2.fit(x_train,
         y_train,
         batch_size=64,
         epochs=25,)

我得到错误: ValueError:检查输入时出错:预期 conv2d_19_input 有 4 个维度,但得到的数组形状为 (60000, 28, 28)

就像每次我尝试理解输入形状时,我都会变得更加困惑。就像我在这一点上对 conv2d 和密集的输入形状感到困惑。 无论如何,这是怎么回事?

【问题讨论】:

    标签: python machine-learning keras tf.keras


    【解决方案1】:

    是的,这是正确的,参数input_shape 准备取 3 个值。但是函数Conv2D 需要一个 4D 数组作为输入,包括:

    1. 样本数
    2. 频道数
    3. 图像宽度
    4. 图片高度

    而函数load_data() 是一个由宽度、高度和样本数量组成的3D 数组。

    您可以通过简单的重塑来解决问题:

    train_X = train_X.reshape(-1, 28,28, 1)
    test_X = test_X.reshape(-1, 28,28, 1)
    

    keras 文档中更好的定义:

    输入形状: 4D tensor with shape: (batch, channels, rows, cols) if data_format 是 "channels_first" 或 4D tensor with shape: (batch, rows, cols, channels) if data_format 是 "channels_last"。

    【讨论】:

    • 是的,你说得对,我一意识到你就回答了,但你说得更清楚了,所以非常感谢
    • 如果有任何其他问题,请随时联系我!
    • 会的,再次感谢您。这太令人沮丧了哈哈。
    • 是的,我感觉到你,我在 CNN 上度过了一段艰难的时光! #Edit:仍然可以。
    【解决方案2】:

    您缺少通道维度(值为 1),可以通过重塑数组轻松纠正:

    x_train = x_train.reshape((-1, 28, 28, 1))
    x_test = x_test.reshape((-1, 28, 28, 1))
    

    【讨论】:

    • 是的,刚刚意识到,非常感谢。我很高兴终于修好了。再次感谢您
    猜你喜欢
    • 2020-05-29
    • 1970-01-01
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 2023-02-18
    • 1970-01-01
    • 2020-04-23
    • 2020-04-27
    相关资源
    最近更新 更多