Форма ввода Keras генерирует ошибку значения, ожидаемую 4d, но получила массив с формой (60000, 28,28) - PullRequest
0 голосов
/ 29 января 2020
(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)

Затем модель удостоверилась, что входная форма равна 28,28,1, поскольку 60k является образцом.

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

Я получаю ошибку: ValueError: Ошибка при проверке ввода: ожидается, что conv2d_19_input будет иметь 4 измерения, но получил массив с формой (60000, 28, 28)

Как и каждый раз, когда я пытаюсь понять форму ввода, я все больше путаюсь. Как будто я запутался с входными формами для conv2d и плотного в этой точке. Во всяком случае, почему это не так?

Ответы [ 2 ]

2 голосов
/ 29 января 2020

Вам не хватает измерения каналов (со значением один), его можно легко исправить, изменив массив:

x_train = x_train.reshape((-1, 28, 28, 1))
x_test = x_test.reshape((-1, 28, 28, 1))
2 голосов
/ 29 января 2020

Да, это правильно, параметр input_shape готов принять 3 значения. Однако функция Conv2D ожидает в качестве входных данных массив 4D, охватывающий:

  1. Количество выборок
  2. Количество каналов
  3. Ширина изображения
  4. Высота изображения

В то время как функция load_data() является трехмерным массивом, состоящим из ширины, высоты и количества выборок.

Вы можете решить проблему с помощью простого изменения формы:

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

Лучшее определение из документации keras:

Форма ввода: тензор 4D с формой: (партия, каналы, строки, столбцы), если data_format равен "channel_first" или 4D тензор с формой: (пакет, строки, столбцы, каналы), если data_format равен "channel_last".

...