метод preprocess_input() в керасе

Я пробую пример кода keras со страницы документации keras ниже, https://keras.io/applications/

Что функция preprocess_input(x) модуля keras выполняет в приведенном ниже коде? Почему мы должны сделать expand_dims(x, axis=0) до того, как это будет передано методу preprocess_input()?

from keras.applications.resnet50 import ResNet50
from keras.preprocessing import image
from keras.applications.resnet50 import preprocess_input
import numpy as np

model = ResNet50(weights='imagenet')

img_path = 'elephant.jpg'
img = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)

Есть ли документация с хорошим объяснением этих функций?

Спасибо!

Ответы

Ответ 1

Keras работает с партиями изображений. Таким образом, первое измерение используется для количества образцов (или изображений), которые у вас есть.

Когда вы загружаете одно изображение, вы получаете форму одного изображения, которое равно (size1,size2,channels).

Чтобы создать партию изображений, вам нужно дополнительное измерение: (samples, size1,size2,channels)

Функция preprocess_input предназначена для адекватного отображения вашего изображения в формате, который требуется модели.

Некоторые модели используют изображения со значениями от 0 до 1. Другие от -1 до +1. Другие используют стиль "caffe", который не нормализуется, а центрируется.

Из исходного кода Resnet использует стиль caffe.

Вам не нужно беспокоиться о внутренних деталях preprocess_input. Но в идеале вы должны загружать изображения с помощью функций keras для этого (чтобы вы гарантировали совместимость загружаемых изображений с preprocess_input).

Ответ 2

Это загружает изображение и изменяет размер изображения до (224, 224):

 img = image.load_img(img_path, target_size=(224, 224))

Функция img_to_array() добавляет каналы: x.shape = (224, 224, 3) для RGB и (224, 224, 1) для серого изображения

 x = image.img_to_array(img) 

expand_dims() используется для добавления количества изображений: x.shape = (1, 224, 224, 3):

x = np.expand_dims(x, axis=0)

preprocess_input вычитает средние RGB-каналы набора данных imagenet. Это связано с тем, что используемая модель была обучена для другого набора данных: x.shape по-прежнему (1, 224, 224, 3)

x = preprocess_input(x)

Если вы добавляете x к массиву images, в конце цикла вам нужно добавить images = np.vstack(images) чтобы вы получили (n, 224, 224, 3) виде тусклых изображений, где n - это количество обработанных изображений

Ответ 3

Я обнаружил, что предварительная обработка ваших данных, в то время как у вас слишком разные наборы данных по сравнению с предварительно подготовленными моделями/наборами данных, тогда это может как-то повредить вашей точности. Если вы перенесете обучение и заморозите некоторые слои из предварительно подготовленной модели/их веса, просто /255.0 ваш исходный набор данных отлично справится с этой задачей, по крайней мере для больших 1/2 миллионов выборочных наборов пищевых данных. В идеале вы должны знать ваш набор данных std/mean вашего и использовать его вместо использования std/mdean предварительно обработанного предварительного процесса модели.

Мои 2 цента.

Стив