Я использую модель VGG19 из приложения keras. Я ожидал, что изображение будет масштабировано до [-1, 1]
, но вместо этого кажется, что preprocess_input
делает что-то еще.
Для предварительной обработки ввода я использую следующие 2 строки, чтобы сначала загрузить изображение, а затем масштабировать его:
from keras.preprocessing import image
from keras.applications.vgg19 import preprocess_input
img = image.load_img("./img.jpg", target_size=(256, 256))
img = preprocess_input(np.array(img))
print(img)
>>> array([[[151.061 , 138.22101, 131.32 ],
... ]]]
Вывод, кажется, находится в интервале [0,255], однако, исходные 255 были сопоставлены со значениями около 151 (вероятное центрирование). Какой вклад VGG на самом деле требует? Я думал, что это должно быть в [-1,1], глядя на исходный код (для mode='tf'
). Это достаточно гибко, и я могу использовать любой вид масштабирования, который я хочу? (Я использую VGG для извлечения функций среднего уровня - блок Conv4).
При просмотре исходного кода preprocess_input
вижу:
...
if mode == 'tf':
x /= 127.5
x -= 1.
return x
...
, что предполагает, что для бэкэнда тензорного потока (который использует keras), его следует масштабировать до [-1,1].
Что мне нужно сделать, это создать функцию restore_original_image_from_array()
, которая возьмет img
и восстановит исходное изображение, которое я ввел. Проблема в том, что я не уверен, как происходит масштабирование для VGG19.
Короче я бы хотел сделать:
img = image.load_img("./img.jpg", target_size=(256, 256))
scaled_img = preprocess_input(np.array(img))
restore_original_image_from_array(scaled_img) == np.array(img)
>>> True