Ошибка в наборе цифр Keras: ожидается, что conv2d_input будет иметь 4 измерения, но получит массив с формой (60000, 28, 28) - PullRequest
1 голос
/ 27 октября 2019

Ошибка в наборе цифр Keras Digit: ValueError: Ошибка при проверке ввода: ожидалось, что conv2d_input имеет 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)

Ответы [ 3 ]

1 голос
/ 27 октября 2019

Вам нужно сделать два крошечных изменения. Во-первых, вам нужно преобразовать изображение в тензор 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_shape на модель с указанием номера. канала вашего входного изображения. Поскольку ваше изображение имеет одноканальный входной формат изображения должен быть (28, 28, 1)

tf.keras.layers.Conv2D(56, (3, 3), activation='relu', input_shape=(28, 28, 1))
1 голос
/ 27 октября 2019

Добавьте четвертое измерение, которое является измерением канала, к вашим входным данным, используя np.expand_dims, прежде чем передавать его в сеть. Используя этот способ, вы сможете использовать Conv2D.

train_images = np.expand_dims(train_images, axis=-1)
test_images = np.expand_dims(test_images, axis=-1)

print(train_images.shape()) # (60000, 28, 28, 1)
print(test_images.shape()) # (10000, 28, 28, 1)
0 голосов
/ 27 октября 2019

Спасибо, @ bit01 за указание на мою ошибку. Я соответственно обновил свой ответ -

Вы не можете использовать 2D-методы для изображений без глубины или каналов. Ваше изображение не содержит ни одного канала, имеющего форму 28 x 28, Conv2D определено для изображений с такими каналами, как grey_scale (256,256,1) или RGB (256,256,3) или PNG-изображений с альфа-каналом (256,256,4). Он не будет работать для 2D-матрицы без какой-либо глубины.

, поэтому у вас есть два способа решения этой проблемы:

  1. переключение с 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...