Изменение размера в большем разрешении с помощью лыжного мага вызывает опечатку в кера - PullRequest
0 голосов
/ 01 июля 2018

Моя цель - взять предварительно обученную модель без двух последних полностью связанных слоев, чтобы построить новый собственный класс для CIFAR-10. Первая проблема, с которой я столкнулся, заключается в том, что VGG ожидает, по крайней мере, 48*48*3 тензор, в то время как набор данных CIFAR-10 поставляется с 32*32*3 изображениями. Я знаю, что ImageDataGenerator.flow_from_directory поставляется со встроенным параметром target_size, но я не могу использовать его здесь, потому что изображения уже находятся в памяти:

from keras.applications import VGG16
from keras.datasets import cifar10
from keras.preprocessing.image import ImageDataGenerator
import numpy as np
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
vgg_conv = VGG16(weights='imagenet', include_top=False, input_shape=(48, 48, 3)) # 48 its a minimum width 

>> type(x_train) #we have numpy here
numpy.ndarray

Для преобразования изображений я использую skimage (не знаю почему, но, похоже, это работает):

from  skimage import transform
new_shape = (48,88,3)
x_train = np.asarray([transform.resize(image, new_shape) for image in x_train])

Далее мы передаем его генератору, чтобы иметь возможность кормить NN партиями. К сожалению, у него нет параметра target_size, поэтому раньше я использовал resize:

train_generator = datagen.flow(
    x_train, 
    batch_size=batch_size, 
    shuffle=True)

Тогда я перебираю train_generator без удачи:

for inputs_batch  in train_generator:
    features_batch = vgg_conv.predict(inputs_batch)
    train_features[i * batch_size : (i + 1) * batch_size] = features_batch 
    i += 1
    if i * batch_size >= nImages:
        break

Это ошибка, которую я получаю:

ValueError Traceback (последний вызов был последним) ----> 2 features_batch = vgg_conv.predict (input_batch) ValueError: Ошибка при проверке ввода: ожидалось, что input_4 будет иметь форму (48, 48, 3), но получил массив с формой (48, 88, 3)

Возможно, проблема связана с flow generator, которая:

    # Returns
        An `Iterator` yielding tuples of `(x, y)`
            where `x` is a numpy array of image data
            (in the case of a single image input) or a list
            of numpy arrays (in the case with
            additional inputs) and `y` is a numpy array
            of corresponding labels. If 'sample_weight' is not None,
        the yielded tuples are of the form `(x, y, sample_weight)`.
        If `y` is None, only the numpy array `x` is returned.

Итак, у меня есть 2 вопроса: что здесь не так и есть ли лучший способ изменить размер изображения, может быть, какой-то встроенный в функцию Keras?

1 Ответ

0 голосов
/ 03 июля 2018

( Примечание: в соответствии с запросом OP , я объединил свои комментарии в этот ответ.)

  1. У вас есть опечатка здесь: new_shape = (48,88,3); это должно быть new_shape = (48,48,3), т.е. 48, а не 88, как говорится в ошибке.

  2. Не забудьте нормализовать изображения, передав rescale=1./255 в ImageDataGenerator.

  3. Что касается изменения размера изображений, ваш текущий подход в порядке. Но вы также можете попробовать решение, предоставленное в этом SO-ответе . Преимущество упомянутого решения состоит в том, что оно будет частью модели, и вы можете снабдить модель изображениями произвольного размера.

...