【问题标题】:Error defining an input shape in keras for (60000, 28, 28) array在 keras 中为 (60000, 28, 28) 数组定义输入形状时出错
【发布时间】:2023-10-04 01:10:01
【问题描述】:

我正在使用 keras 和 tensorflow 建立我的第一个神经网络。我将输入输入到一个形状数组 (60000, 28, 28) 中,但是当我尝试将其提供给模型时,我收到输入形状错误的错误。

我尝试了多种不同的输入形状,包括 (60000, 28, 28) (1, 28, 28) (28, 28) (28, 28, 1),但它们似乎都不起作用。

model = kr.Sequential()

model.add(InputLayer(input_shape=(60000, 28, 28)))
model.add(Dense(units=784, activation='relu'))
model.add(Dense(units=392, activation='relu'))
model.add(Dense(units=196, activation='relu'))
model.add(Dense(units=10, activation='softmax'))

model.compile(loss='categorical_crossentropy', optimizer='Adam', metrics=['accuracy'])

training = model.fit(x=images_array, y=labels_array, epochs=10, batch_size=256)

我希望它适用于输入形状 (60000, 28, 28),但我总是收到此错误:

ValueError:检查输入时出错:预期 input_1 有 4 尺寸,但得到了形状为 (60000, 28, 28) 的数组

编辑:

感谢所有回答的人。 cho_uc 答案确实有效,这就是我接受它的原因。 我应该在帖子中提到的是,我正在尝试构建一个仅包含 Dense 层的模型,因此我可以将其用作未来模型的基准。

我解决了输入层问题:

images_array = images_array.reshape(-1, 28 * 28)

model.add(InputLayer(input_shape=(784, )))

【问题讨论】:

    标签: python python-3.x tensorflow keras mnist


    【解决方案1】:

    KerasConv2D 层执行卷积操作。它要求其输入是一个 4 维数组。 根据您的设置和后端(theano 或 tensorlow 图像布局约定),我们必须将输入重塑为 ( , 1, 28, 28) 或可能为 ( , 28, 28, 1)。

    from keras import backend as K
    if K.image_data_format() == 'channels_first' :
       input_shape = (1, 28, 28)
       X_train = X_train.reshape(X_train.shape[0], 1, 28, 28)
       X_test = X_test.reshape(X_test.shape[0], 1, 28, 28)
    else:
       input_shape = (28, 28, 1)
       X_train = X_train.reshape(X_train.shape[0], 28, 28, 1)
       X_test = X_test.reshape(X_test.shape[0], 28, 28, 1)
    

    因此,您应该将数据重塑为 (60000, 28, 28, 1) 或 (60000, 1, 28, 28)

    【讨论】:

      【解决方案2】:

      需要进行两次更正。

      1. TF 和 Keras 期望图像尺寸为(宽度、高度、通道),RGB 图像的通道为 3,灰度图像的通道为 1。
      model.add(InputLayer(input_shape=(28, 28, 1)))
      
      1. fit() 方法的训练输入必须具有维度(样本数、宽度、高度、通道)。
      assert images_array.shape == (60000, 28, 28, 1)
      

      【讨论】: