Python Keras数字数据集中出错:预期conv2d_输入有4个维度,但得到了具有形状的数组(60000,28,28)

Python Keras数字数据集中出错:预期conv2d_输入有4个维度,但得到了具有形状的数组(60000,28,28),python,tensorflow,keras,deep-learning,Python,Tensorflow,Keras,Deep Learning,Keras数字数据集中出错:ValueError:检查输入时出错:预期conv2d_输入有4个维度,但得到了形状为60000、28、28的数组。我不知道发生了什么事,为什么 我需要4个维度?我肯定它们是28x28图像。我该怎么办 (train_images, train_labels), (test_images, test_labels) = mnist.load_data() train_images = train_images/255 test_images = test_imag

Keras数字数据集中出错:ValueError:检查输入时出错:预期conv2d_输入有4个维度,但得到了形状为60000、28、28的数组。我不知道发生了什么事,为什么

我需要4个维度?我肯定它们是28x28图像。我该怎么办

   (train_images, train_labels), (test_images, test_labels) = mnist.load_data()
train_images = train_images/255
test_images = test_images/255

classes = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

model = keras.Sequential([
    tf.keras.layers.Conv2D(56, (3, 3), activation='relu', input_shape=(28, 28)),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Conv2D(56, (3, 3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(784, activation='relu'),
    tf.keras.layers.Dense(10, activation='softmax')
])

model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", metrics=["accuracy"])
model.fit(train_images, train_labels, epochs=5)

test_loss, test_acc = model.evaluate(test_images, test_labels)

在将输入数据传递到网络之前,使用将第四个维度(即通道维度)添加到输入数据中。使用这种方式,您将能够使用Conv2D


在将输入数据传递到网络之前,使用将第四个维度(即通道维度)添加到输入数据中。使用这种方式,您将能够使用Conv2D


谢谢,@bit01指出我的错误,我已经相应地更新了我的答案-

不能在没有深度或通道的图像上使用二维方法。您的图像不包含任何通道,具有28 X 28形状,Conv2D是为具有通道的图像定义的,如灰度刻度256256,1或RGB256256,3或具有alpha通道256256,4的png图像。对于没有任何深度的2D矩阵,它不起作用

所以你有两种方法来解决这个问题:

对于卷积和最大池层,从2D方法切换到1D方法。 像这样-

(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
train_images = train_images/255
test_images = test_images/255

classes = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

model = keras.Sequential([
    tf.keras.layers.Conv1D(56, 3, activation='relu', input_shape=(28, 28)),
    tf.keras.layers.MaxPooling1D(2, 2),
    tf.keras.layers.Conv1D(56, 3, activation='relu'),
    tf.keras.layers.MaxPooling1D(2, 2),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(784, activation='relu'),
    tf.keras.layers.Dense(10, activation='softmax')
])

model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", metrics=["accuracy"])
model.fit(train_images, train_labels, epochs=5)

test_loss, test_acc = model.evaluate(test_images, test_labels)
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

train_images = np.expand_dims(train_images, axis=-1)  # (60000, 28, 28, 1)
test_images = np.expand_dims(test_images, axis=-1) # (10000, 28, 28, 1)

train_images = train_images/255
test_images = test_images/255

#train_images.shape, test_images.shape
classes = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']


input_layer = keras.layers.Input(shape=(28, 28, 1), name='image_input')
conv1 = keras.layers.Conv2D(56, (3,3), activation='relu')(input_layer)
pool1 = keras.layers.MaxPooling2D(2, 2)(conv1)
conv2 = keras.layers.Conv2D(56, (3,3), activation='relu')(pool1)
pool2 = keras.layers.MaxPooling2D(2, 2)(conv2)
flatten = keras.layers.Flatten()(pool2)
dense1 = keras.layers.Dense(784, activation='relu')(flatten)
output_layer = keras.layers.Dense(10, activation='softmax')(dense1)

model = keras.models.Model(inputs=input_layer, outputs=output_layer, name='my_model')
model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", metrics=["accuracy"])
model.fit(train_images, train_labels, epochs=5)

test_loss, test_acc = model.evaluate(test_images, test_labels)
向数据集中添加一个额外的维度,使其为28 X 28->28 X 28 X1。 像这样-

(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
train_images = train_images/255
test_images = test_images/255

classes = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

model = keras.Sequential([
    tf.keras.layers.Conv1D(56, 3, activation='relu', input_shape=(28, 28)),
    tf.keras.layers.MaxPooling1D(2, 2),
    tf.keras.layers.Conv1D(56, 3, activation='relu'),
    tf.keras.layers.MaxPooling1D(2, 2),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(784, activation='relu'),
    tf.keras.layers.Dense(10, activation='softmax')
])

model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", metrics=["accuracy"])
model.fit(train_images, train_labels, epochs=5)

test_loss, test_acc = model.evaluate(test_images, test_labels)
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

train_images = np.expand_dims(train_images, axis=-1)  # (60000, 28, 28, 1)
test_images = np.expand_dims(test_images, axis=-1) # (10000, 28, 28, 1)

train_images = train_images/255
test_images = test_images/255

#train_images.shape, test_images.shape
classes = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']


input_layer = keras.layers.Input(shape=(28, 28, 1), name='image_input')
conv1 = keras.layers.Conv2D(56, (3,3), activation='relu')(input_layer)
pool1 = keras.layers.MaxPooling2D(2, 2)(conv1)
conv2 = keras.layers.Conv2D(56, (3,3), activation='relu')(pool1)
pool2 = keras.layers.MaxPooling2D(2, 2)(conv2)
flatten = keras.layers.Flatten()(pool2)
dense1 = keras.layers.Dense(784, activation='relu')(flatten)
output_layer = keras.layers.Dense(10, activation='softmax')(dense1)

model = keras.models.Model(inputs=input_layer, outputs=output_layer, name='my_model')
model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", metrics=["accuracy"])
model.fit(train_images, train_labels, epochs=5)

test_loss, test_acc = model.evaluate(test_images, test_labels)

谢谢,@bit01指出我的错误,我已经相应地更新了我的答案-

不能在没有深度或通道的图像上使用二维方法。您的图像不包含任何通道,具有28 X 28形状,Conv2D是为具有通道的图像定义的,如灰度刻度256256,1或RGB256256,3或具有alpha通道256256,4的png图像。对于没有任何深度的2D矩阵,它不起作用

所以你有两种方法来解决这个问题:

对于卷积和最大池层,从2D方法切换到1D方法。 像这样-

(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
train_images = train_images/255
test_images = test_images/255

classes = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

model = keras.Sequential([
    tf.keras.layers.Conv1D(56, 3, activation='relu', input_shape=(28, 28)),
    tf.keras.layers.MaxPooling1D(2, 2),
    tf.keras.layers.Conv1D(56, 3, activation='relu'),
    tf.keras.layers.MaxPooling1D(2, 2),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(784, activation='relu'),
    tf.keras.layers.Dense(10, activation='softmax')
])

model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", metrics=["accuracy"])
model.fit(train_images, train_labels, epochs=5)

test_loss, test_acc = model.evaluate(test_images, test_labels)
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

train_images = np.expand_dims(train_images, axis=-1)  # (60000, 28, 28, 1)
test_images = np.expand_dims(test_images, axis=-1) # (10000, 28, 28, 1)

train_images = train_images/255
test_images = test_images/255

#train_images.shape, test_images.shape
classes = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']


input_layer = keras.layers.Input(shape=(28, 28, 1), name='image_input')
conv1 = keras.layers.Conv2D(56, (3,3), activation='relu')(input_layer)
pool1 = keras.layers.MaxPooling2D(2, 2)(conv1)
conv2 = keras.layers.Conv2D(56, (3,3), activation='relu')(pool1)
pool2 = keras.layers.MaxPooling2D(2, 2)(conv2)
flatten = keras.layers.Flatten()(pool2)
dense1 = keras.layers.Dense(784, activation='relu')(flatten)
output_layer = keras.layers.Dense(10, activation='softmax')(dense1)

model = keras.models.Model(inputs=input_layer, outputs=output_layer, name='my_model')
model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", metrics=["accuracy"])
model.fit(train_images, train_labels, epochs=5)

test_loss, test_acc = model.evaluate(test_images, test_labels)
向数据集中添加一个额外的维度,使其为28 X 28->28 X 28 X1。 像这样-

(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
train_images = train_images/255
test_images = test_images/255

classes = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

model = keras.Sequential([
    tf.keras.layers.Conv1D(56, 3, activation='relu', input_shape=(28, 28)),
    tf.keras.layers.MaxPooling1D(2, 2),
    tf.keras.layers.Conv1D(56, 3, activation='relu'),
    tf.keras.layers.MaxPooling1D(2, 2),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(784, activation='relu'),
    tf.keras.layers.Dense(10, activation='softmax')
])

model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", metrics=["accuracy"])
model.fit(train_images, train_labels, epochs=5)

test_loss, test_acc = model.evaluate(test_images, test_labels)
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

train_images = np.expand_dims(train_images, axis=-1)  # (60000, 28, 28, 1)
test_images = np.expand_dims(test_images, axis=-1) # (10000, 28, 28, 1)

train_images = train_images/255
test_images = test_images/255

#train_images.shape, test_images.shape
classes = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']


input_layer = keras.layers.Input(shape=(28, 28, 1), name='image_input')
conv1 = keras.layers.Conv2D(56, (3,3), activation='relu')(input_layer)
pool1 = keras.layers.MaxPooling2D(2, 2)(conv1)
conv2 = keras.layers.Conv2D(56, (3,3), activation='relu')(pool1)
pool2 = keras.layers.MaxPooling2D(2, 2)(conv2)
flatten = keras.layers.Flatten()(pool2)
dense1 = keras.layers.Dense(784, activation='relu')(flatten)
output_layer = keras.layers.Dense(10, activation='softmax')(dense1)

model = keras.models.Model(inputs=input_layer, outputs=output_layer, name='my_model')
model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", metrics=["accuracy"])
model.fit(train_images, train_labels, epochs=5)

test_loss, test_acc = model.evaluate(test_images, test_labels)

你需要做两个小小的改变。 首先,您需要将图像转换为4D张量,格式为NHWC批次大小、高度、宽度、通道,这是Conv2D所期望的。但是,当前图像数据集中没有通道维度。可以按如下方式添加通道4维

train_images = np.expand_dims(train_images, axis=-1)  # (60000, 28, 28, 1)
test_images = np.expand_dims(test_images, axis=-1) # (10000, 28, 28, 1)
其次,您需要将input_形状更改为指定输入图像通道号的模型。由于您的图像具有单通道输入,因此图像形状应为28、28、1


你需要做两个小小的改变。 首先,您需要将图像转换为4D张量,格式为NHWC批次大小、高度、宽度、通道,这是Conv2D所期望的。但是,当前图像数据集中没有通道维度。可以按如下方式添加通道4维

train_images = np.expand_dims(train_images, axis=-1)  # (60000, 28, 28, 1)
test_images = np.expand_dims(test_images, axis=-1) # (10000, 28, 28, 1)
其次,您需要将input_形状更改为指定输入图像通道号的模型。由于您的图像具有单通道输入,因此图像形状应为28、28、1


谢谢你,我真的很感谢你的帮助。这解决了我的问题。谢谢你,我真的很感谢你的帮助。这解决了我的问题。请不要只发布代码作为答案,还要解释代码的作用以及它如何解决问题。带有解释的答案通常质量较高,并且更有可能吸引更多的投票。请不要只发布代码作为答案,还要包括解释代码的作用以及它如何解决问题。带有解释的答案通常质量更高,更容易吸引选票。