Keras VGG16 режимы preprocess_input - PullRequest
0 голосов
/ 01 ноября 2018

Я использую модель Keras VGG16 .

Я видел, что есть метод preprocess_input для использования вместе с моделью VGG16 . Этот метод вызывает метод preprocess_input в imagenet_utils.py , который (в зависимости от случая) вызывает метод _preprocess_numpy_input в imagenet_utils.py .

preprocess_input имеет аргумент mode, который ожидает "caffe", "tf" или "torch". Если я использую модель в Keras с бэкэндом TensorFlow, я должен обязательно использовать mode="tf"?

Если да, это потому, что модель VGG16, загруженная Keras, была обучена изображениям, прошедшим такую ​​же предварительную обработку (т. Е. Изменил диапазон входного изображения с [0,255] на диапазон ввода [-1,1])?

Кроме того, должны ли входные изображения для режима тестирования также проходить эту предварительную обработку? Я уверен, что ответ на последний вопрос - да, но я хотел бы получить некоторое подтверждение.

Я бы ожидал, что Франсуа Шоле сделал это правильно, но, глядя на https://github.com/fchollet/deep-learning-models/blob/master/vgg16.py, он или я ошибаюсь с использованием mode="tf".

Обновленная информация

@ FalconUA направил меня к VGG в Оксфорде , в котором есть раздел Models со ссылками на 16-слойную модель. Информацию о preprocessing_input mode аргументе tf, масштабируемом от -1 до 1 и caffe, вычитающем некоторые средние значения, можно найти по ссылке в Models 16-слойной модели: информационная страница . В разделе «Описание» написано:

"В статье модель обозначается как конфигурация D, обученная с дрожанием масштаба. Входные изображения должны быть выровнены по центру нуля путем вычитания среднего пикселя (а не среднего изображения). А именно, должны быть вычтены следующие значения BGR: [103,939, 116,779, 123,68]. "

Ответы [ 3 ]

0 голосов
/ 01 ноября 2018

По моему опыту в обучении VGG16 в Керасе, входные данные должны быть от 0 до 255, вычитая среднее [103.939, 116.779, 123.68]. Я попытался перенести обучение (заморозить дно и сложить классификатор сверху) с центрами ввода от -1 до 1, и результаты намного хуже, чем 0..255 - [103.939, 116.779, 123.68].

0 голосов
/ 01 февраля 2019

В последнее время, пытаясь снова использовать VGG16, у меня возникли проблемы с получением результатов спуска, просто импортировав preprocess_input из vgg16 следующим образом:

from keras.applications.vgg16 import VGG16, preprocess_input

При этом preprocess_input по умолчанию устанавливается в режим 'caffe', но при более внимательном рассмотрении кода keras vgg16 , я заметил, что имя веса

https://github.com/fchollet/deep-learning-models/releases/download/v0.1/vgg16_weights_tf_dim_ordering_tf_kernels.h5'

относится к тензорному потоку дважды. Я думаю, что режим предварительной обработки должен быть 'tf'.

processed_img = preprocess_input(img, mode='tf')
0 голосов
/ 01 ноября 2018

Здесь mode не о бэкэнде, а о , на какой платформе была обучена модель и перенесена с нее. В ссылке keras на VGG16 это заявил, что:

Эти веса перенесены с тех, которые были выпущены VGG в Оксфорде

Таким образом, модели VGG16 и VGG19 были обучены в Caffe и перенесены в TensorFlow, отсюда mode == 'caffe' здесь (диапазон от 0 до 255 и затем извлечение среднего [103.939, 116.779, 123.68]).

Более новые сети, такие как MobileNet и ShuffleNet , прошли обучение по TensorFlow, поэтому mode для них равно 'tf', а входы расположены по центру нуля в диапазоне от -1 до 1.

...