Keras input shape throws value error expected 4d but got an array with shape (60000, 28,28)

孤者浪人 提交于 2021-02-05 11:37:19

问题


(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)

Then the model made sure input shape is 28,28,1 since 60k is the sample.

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,)

I get the Error: ValueError: Error when checking input: expected conv2d_19_input to have 4 dimensions, but got array with shape (60000, 28, 28)

Like everytime i try to understand input shape i get more confused. Like im confused with the input shapes for conv2d and dense at this point. Anyway, Why is this wrong?


回答1:


Yes, this is correct the parameter input_shape is prepared to take 3 values. However the function Conv2D is expecting a 4D array as input, covering:

  1. Number of samples
  2. Number of channels
  3. Image width
  4. Image height

Whereas the function load_data() is a 3D array consisting of width, height and number of samples.

You can expect to solve the issue with a simple reshape:

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

A better defitinion from keras documentation:

Input shape: 4D tensor with shape: (batch, channels, rows, cols) if data_format is "channels_first" or 4D tensor with shape: (batch, rows, cols, channels) if data_format is "channels_last".




回答2:


You are missing the channels dimension (with a value of one), it can be easily corrected by reshaping the array:

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


来源:https://stackoverflow.com/questions/59972820/keras-input-shape-throws-value-error-expected-4d-but-got-an-array-with-shape-60

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!