2015-11-17 3 views
1

Я использую этот код, чтобы загрузить свою сеть:Caffe, как предсказать из pretrained чистой

net = caffe.Classifier(MODEL_FILE, PRETRAINED, 
        mean=np.load(caffe_root + 'python/caffe/imagenet/ilsvrc_2012_mean.npy').mean(1).mean(1), 
        channel_swap=(2,1,0), 
        raw_scale=255, 
        image_dims=(256, 256)) 

У меня есть сомнения по трем линиям.

1- mean=np.load(caffe_root + 'python/caffe/imagenet/ilsvrc_2012_mean.npy').mean(1).mean(1)

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

2- channel_swap=(2,1,0)

Что значит channel_swap? И снова, следует ли использовать это значение или пользовательское значение?

И последний

3- raw_scale=255

Что такое raw_scale? И какую ценность я должен использовать?

Я использую Cohn Kanade набор данных. Все изображения - 64x64 и в оттенках серого.

ответ

4

channel_swap предназначен для обратного преобразования RGB в BGR, что, по-видимому, необходимо, если вы используете модель образцового изображения, основанную на комментарии в [1]. В вашем случае изображения имеют оттенки серого, поэтому у вас, вероятно, нет трех каналов. Вам может потребоваться установить его (0, 0, 0), но даже это может не помочь (я не уверен в точном выполнении channel_swap). Если это не помогает, самым простым решением может быть предварительная обработка ваших данных путем разделения каждого пикселя на три значения (RGB) с равными значениями. После этого вы можете полностью удалить channel_swap, потому что ваши каналы имеют одинаковое значение, а их замена - нет.

Среднее то, что будет вычтено из ваших входных данных, чтобы центрировать его. (Помните, что нейронные сети нуждаются в данных, чтобы иметь нулевое среднее значение, тогда как входные изображения обычно имеют положительное среднее значение, следовательно, необходимость вычитания). Среднее вычитание должно быть таким же, которое использовалось для обучения, поэтому использование среднего значения из файла, связанного с моделью, является правильным. Я не уверен, однако, о том, следует ли вам называть .mean(1) - вы получили эту строку из какого-то примера? Если да, то, скорее всего, это правильная вещь.

raw_scale - это шкала ваших входных данных. Модель ожидает, что пиксели будут нормализованы, поэтому, если ваши входные данные имеют значения от 0 до 255, то raw_scale, установленный в 255, является правильным. Если данные имеют значения между 0 и 1, то raw_scale должен быть установлен в 1.

Наконец, на основе моего понимания комментария в [2] Вам не нужно предоставлять image_dims

[1] https://github.com/BVLC/caffe/blob/master/python/caffe/io.py#L204

[2] https://github.com/BVLC/caffe/blob/master/python/caffe/classifier.py#L18

+0

Спасибо, я получаю этот код на этом сайте [] (http://www.cc.gatech.edu/~zk15/deep_learning/classify_test.py). Я не использую imaginet, я просто искал google для «предсказания caffe от предварительной модели». Итак, я должен изменить значение на (0,0,0), а не использовать channel_swap и raw_scale до 1/126. Потому что 126 - это мой оттенок серого. Я прав? – Caaarlos

+0

Если 126 - ваше среднее значение, тогда 'raw_scale' равно 255 (raw_scale - это диапазон, а не значение). Для среднего вам нужно использовать среднее значение набора данных, которое использовалось для обучения модели, которую вы используете. Какую именно модель вы используете? Для 'channel_swap', в вашем случае вам это не нужно, это правильно. – Ishamael

+0

Ishamael, не могли бы вы объяснить мне, что вы имеете в виду: «Какую именно модель вы используете?». Я этого не понимал. Caffe и convnet для меня действительно совсем недавно. – Caaarlos

2

Я согласен на комментарии @Ishamael на channel_swap и имею в виду. Я просто хотел добавить дополнительные пояснения к raw_scale. Предполагая, что изображения загружены с caffe.io.load_image, значения всегда находятся в диапазоне от 0 до 1 [1].Просто к сведению, что:

В то время как Python представляет изображения в [0, 1], некоторые модели Caffe CaffeNet и AlexNet представляют изображения в [0, 255], так что raw_scale эти модели должны быть 255.

И я думаю, что было бы разумно проверить значения входных изображений перед подачей на уровень данных сети, чтобы выбрать соответствующий raw_scale.

спасибо.

[1] https://github.com/BVLC/caffe/blob/master/python/caffe/io.py#L224

Смежные вопросы