ImageDataGenerator не нравится мой набор данных fashionMNIST. Какой вход ему нужен? - PullRequest
0 голосов
/ 25 октября 2019

У меня есть набор с именами train_images и train_labels из руководства по классификации базовых изображений tenorflow:

https://www.tensorflow.org/tutorials/keras/classification

Я загружаю набор данных с помощью:

fashion_mnist = keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()

Форма этих двух списков соответственно: (60000, 28, 28) (60000,)

После этого я хочу использовать ImageDataGenerator, чтобы перевернуть некоторые изображения по горизонтали, но когда я подгоняю модель к спискам поездов, она возвращаетМоя ошибка говорит, что x должен быть массивом ранга 4

Я уже пытался сделать

train_images = (np.expand_dims(train_images,0))

, поэтому форма становится (1 60000, 28, 28) (я долженсделайте это, чтобы позволить модели исследовать одно изображение), но это не подходит для модели

, это остальная часть кода:

aug = ImageDataGenerator(rotation_range=20, horizontal_flip=True)

model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28,28)),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dense(10, activation='softmax')
    ])

model.compile(
    optimizer='adam',
    loss='sparse_categorical_crossentropy',
    metrics=['accuracy']
    )

BS=32
EPOCHS=10
H = model.fit_generator(
    aug.flow(train_images, train_labels, batch_size=BS),
    validation_data=(test_images, test_labels),
    steps_per_epoch=len(train_images) // BS,
    epochs=EPOCHS)

И это сгенерированная ошибка:

---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

<ipython-input-65-e49da92bcb89> in <module>()
      5 #train_images.shape
      6 H = model.fit_generator(
----> 7         aug.flow(train_images, train_labels, batch_size=BS),
      8         validation_data=(test_images, test_labels),
      9         steps_per_epoch=len(train_images) // BS,

1 frames
/usr/local/lib/python3.6/dist-packages/keras_preprocessing/image/numpy_array_iterator.py in __init__(self, x, y, image_data_generator, batch_size, shuffle, sample_weight, seed, data_format, save_to_dir, save_prefix, save_format, subset, dtype)

    115             raise ValueError('Input data in `NumpyArrayIterator` '
    116                              'should have rank 4. You passed an array '
--> 117                              'with shape', self.x.shape)
    118         channels_axis = 3 if data_format == 'channels_last' else 1
    119         if self.x.shape[channels_axis] not in {1, 3, 4}:

ValueError: ('Input data in `NumpyArrayIterator` should have rank 4. You passed an array with shape', (60000, 28, 28))

на самом деле train_images (N ° изображений, ширина, высота), какую 4-ю ось он ждет? как это сделать?

Ответы [ 2 ]

0 голосов
/ 25 октября 2019

Канал должен быть последним измерением 4D тензора. Поэтому вместо train_images = (np.expand_dims(train_images,0)) попробуйте train_images = (np.expand_dims(train_images, -1)). Надеюсь, это поможет.

0 голосов
/ 25 октября 2019

Вы должны конвертировать ваши изображения в тензор 4D. Теперь у вас есть формат NHW (размер партии, высота, ширина). Ошибка говорит о том, что у вас должен быть формат NHWC - партия, высота, ширина, канал. Так что вам нужно сделать

train_images = (np.expand_dims(train_images, axis=3))

Это добавит размер канала (размером 1), результирующая форма будет (60000,28,28,1), и это должно решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...