Нужно ли масштабировать изображение перед прогнозированием с помощью модели, обученной с помощью ImageDataGenerator (1./255)? - PullRequest
0 голосов
/ 16 июня 2019

После тренировки модели с ImageDataGenerator (1/255.), Нужно ли изменить масштаб изображения перед прогнозированием? Я думал, что это необходимо, но результат эксперимента сказал НЕТ.

Я обучил модель Resnet50, у которой 37 классов на верхнем слое. Модель была обучена с ImageDataGenerator, как это.

datagen = ImageDataGenerator(rescale=1./255)
generator=datagen.flow_from_directory(
    directory=os.path.join(os.getcwd(), data_folder),
    target_size=(224,224),
    batch_size=256,
    classes=None,
    class_mode='categorical')

history = model.fit_generator(generator, steps_per_epoch=generator.n / 256, epochs=10)

Точность достигла 98% после 10 эпох в моем наборе данных поезда. Проблема в том, что когда я пытался предсказать каждое изображение в наборе данных TRAIN, прогноз был неверным (результат равен 33 независимо от того, какое входное изображение было)

img_p = './data/pets/shiba_inu/shiba_inu_27.jpg'
img = cv2.imread(img_p, cv2.IMREAD_COLOR)
img = cv2.resize(img, (224,224))

img_arr = np.zeros((1,224,224,3))
img_arr[0, :, :, :] = img / 255.
pred = model.predict(img_arr)
yhat = np.argmax(pred, axis=1)

у вас 5, а у 33

Когда я заменяю эту строку

img_arr[0, :, :, :] = img / 255.

этим

img_arr[0, :, :, :] = img

ровно 33.

Кто-то может предложить использовать предикат_генератор () вместо предиката (), но я хочу понять, что я здесь сделал неправильно.

Ответы [ 2 ]

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

Я знал, что здесь не так.

Я использую модель с предварительной подготовкой Imagenet, которая НЕ масштабирует изображение, разделив его на 255. Я должен использовать resnet50.preprocess_input перед обучением / тестированием.

Функция preprocess_input может быть найдена здесь.https://github.com/keras-team/keras-applications/blob/master/keras_applications/imagenet_utils.py

0 голосов
/ 16 июня 2019

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

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