Спасибо, @ bit01 за указание на мою ошибку. Я соответственно обновил свой ответ -
Вы не можете использовать 2D-методы для изображений без глубины или каналов. Ваше изображение не содержит ни одного канала, имеющего форму 28 x 28, Conv2D определено для изображений с такими каналами, как grey_scale (256,256,1) или RGB (256,256,3) или PNG-изображений с альфа-каналом (256,256,4). Он не будет работать для 2D-матрицы без какой-либо глубины.
, поэтому у вас есть два способа решения этой проблемы:
- переключение с 2D-метода на 1D для методов Convolution и max-слои объединения.
Как это -
(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)
добавить одно дополнительное измерение к вашему набору данных (сделайте это 28 X 28 -> 28 X 28 X1).
Как это -
(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)