метод 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 цента.
Стив