Модель Vowpal Wabbit плохо работает с мультиклассовой классификацией изображений с использованием пиксельных значений RGB.

Я использую Vowpal Wabbit для классификации мультиклассовых изображений. Мой набор данных похож на http://www.cs.toronto.edu/~kriz/cifar.html , состоящий из 3000 обучающих и 500 тестовых образцов. Функции представляют собой значения RGB 32 * 32 изображений. Я использовал функцию логистических потерь Vowpal Wabbit для обучения модели со 100 итерациями. Во время тренировочного процесса средняя потеря составляет менее 0,02 (я полагаю, это довольно хорошее число, верно?). Затем я предсказываю метки обучающего набора с выходной моделью и обнаруживаю, что предсказания очень плохие. Почти все они относятся к шестой категории. Я действительно не знаю, что произошло, потому что мне кажется, что в процессе обучения прогнозы в основном верны, но после того, как я предсказываю с помощью модели, они вдруг становятся все 6.

Вот пример строки функции.

1 | 211 174 171 165 161 161 162 163 163 163 163 163 163 163 163 163 162 161 162 163 163 163 163 164 165 167 168 167 168 163 160 187 153 102 96 90 89 90 91 92 92 92 92 92 92 92 92 92 92 92 91 90 90 90 90 91 92 94 95 96 99 97 98 127 111 71 71 64 66 68 69 69 69 69 69 69 70 70 69 69 70 71 71 69 68 68 68 68 70 72 73 75 78 78 81 96 111 69 68 61 64 67 67 67 67 67 67 67 68 67 67 66 67 68 69 68 68 67 66 66 67 69 69 69 71 70 77 89 116 74 76 71 72 74 74 72 73 74 74 74 74 74 74 74 72 72 74 76 76 75 74 74 74 73 73 72 73 74 85 92 123 83 86 83 82 83 83 82 83 83 82 82 82 82 82 82 81 80 82 85 85 84 83 83 83 85 85 85 85 86 94 95 127 92 96 93 93 92 91 91 91 91 91 90 89 89 86 86 86 86 87 89 89 88 88 88 92 92 93 98 100 96 98 96 132 99 101 98 98 97 95 93 93 94 93 93 95 96 97 95 96 96 96 96 95 94 100 103 98 93 95 100 105 103 103 96 139 106 108 105 102 100 98 98 98 99 99 100 100 95 98 93 81 78 79 77 76 76 79 98 107 102 97 98 103 107 108 99 145 115 118 115 115 115 113 ......

Вот мой сценарий обучения:

./vw train.vw --oaa 6 --passes 100 --loss_function logistic -c --holdout_off -f image_classification.model

Вот мой сценарий прогнозирования (на обучающем наборе данных):

./vw -i image_classification.model -t train.vw -p train.predict --quiet

Вот статистика во время обучения:

final_regressor = image_classification.model Количество битов веса = 18 Скорость обучения = 0,5 Initial_t = 0 power_t = 0,5 Decay_learning_rate = 1 Использование cache_file = train.vw.cache Игнорирование ввода текста в пользу кэширования ввода num sources = 1 среднее значение с момента примера
пример Текущий текущий потерю текущих потерь Последний счетчик
весовой меток прогнозные функции 0,000000 0,000000 1 1,0 1 1 3073 0,000000 0,000000 2 2.0 1 1 3073 0,000000 0,000000 4 4.0 1 1 3073 0,000000 0,000000 8 8,0 1 1 3073 0,00000000 0,000000 16 16,0 1 1 3073 0,00000000 0,000000 32 32,0 1 1 3073 0,000000 0,000000 64 64,0 1 1 3073 0,000000 0,000000 128 128,0 1 1 3073 0,000000 0,000000 256 256,0 1 1 3073 0,001953 0,003906 512 512,0 2 2 3073 0,002930 0,003906 1024 1024,0 3 3 3073 0,002930 0,002930 2048 2048,0 5 5 3073 0,006836 0,010742 4096 4096,0 3 3 3073 0,012573 0,018311 8192 8192,0 5 5 3073 0,014465 0,016357 16384 16384,0 3 3 3073 0,017029 0,019592 32768 32768,0 6 6 3073 0,017731 0,018433 65536 65536,0 6 6 3073 0,017891 0,018051 131072 131072,0 5 5 3073 0,017975 0,018053 3 262144

законченный запуск количество примеров за проход = 3000 использованных проходов = 100 взвешенная сумма примеров = 300000,000000 взвешенная сумма меток = 0,000000 средние потери = 0,017887 общее количество признаков = 921900000

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


person TH000    schedule 01.05.2015    source источник


Ответы (1)


В вашем подходе есть несколько проблем.

1) Я предполагаю, что обучающий набор содержит сначала все изображения с меткой 1, затем все примеры с меткой 2 и так далее, последняя метка — 6. Вам нужно перетасовать такие обучающие данные, если вы хотите использовать онлайн-обучение (что по умолчанию алгоритм обучения в VW).

2) VW использует формат разреженных функций. Порядок функций в одной строке не важен (если вы не используете --ngram). Итак, если функция № 1 (красный канал верхнего левого пикселя) имеет значение 211, а функция № 2 (красный канал второго пикселя) имеет значение 174, вам нужно использовать:

1 | 1:211 2:147 ...

3) Чтобы получить хорошие результаты в распознавании изображений, вам нужно что-то лучшее, чем линейная модель на необработанных значениях пикселей. К сожалению, в VW нет ни глубокого обучения (многослойной нейронной сети), ни сверточных сетей. Вы можете попробовать --nn X получить нейронную сеть с одним скрытым слоем с X единицами (и функцией активации tanh), но это всего лишь плохая замена современные подходы к CIFAR и т. д.. Вы также можете попробовать другие нелинейные редукции, доступные в VW (-q, --cubic, --lrq, --ksvm, --stage_poly). В общем, я думаю, что VW не подходит для таких задач (распознавание изображений), если вы не применяете некоторую предварительную обработку, которая генерирует (много) функций (например, SIFT).

4) Вы переобучаетесь.

средний убыток ниже 0,02 (я предполагаю, что это число довольно хорошее, верно?

Нет. Вы использовали --holdout_off, поэтому заявленная потеря скорее является потерей поезда. Легко получить почти нулевые потери в поездах, просто запомнив все примеры, то есть переобучившись. Однако вы хотите, чтобы тестовые потери были низкими.

person Martin Popel    schedule 01.05.2015
comment
Спасибо за такой подробный совет! - person TH000; 02.05.2015
comment
Кроме того: --oaa 6 будет использовать 6 классов, набор данных CIFAR имеет 10 классов, поэтому вам нужен --oaa 10 А также: --ect N обычно работает лучше, чем -oaa N. - person arielf - Reinstate Monica; 07.09.2016