为(60000、28、28)数组在keras中定义输入形状时出错

时间:2019-05-28 18:28:32

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

我正在用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的答案确实有效,这就是为什么我接受了它。 我在帖子中提到的是,我正在尝试构建仅由密集层组成的模型,因此可以将其用作将来模型的基准。

我使用以下方法解决了输入层问题:

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

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

2 个答案:

答案 0 :(得分:4)

Keras Conv2D层执行卷积操作。它要求其输入为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)

答案 1 :(得分:1)

需要两次更正。

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