Я пишу приложение, которое использует SVM для классификации некоторых изображений (особенно эти). Моя реализация Matlab работает очень хорошо. Используя подход SIFT «мешок слов», я могу достичь почти 100% точности с линейным ядром.
Мне нужно реализовать это в C ++ по соображениям скорости / переносимости, и поэтому я попытался использовать оба libsvm а также dlib. Я пробовал несколько типов SVM (c_svm, nu_svm, one_class) и несколько ядер (линейное, полиномиальное, rbf). Лучшее, чего я смог достичь, — это точность около 50% — даже на тех же образцах, на которых я тренировался. Я подтвердил, что мои генераторы функций работают, потому что когда я экспортирую сгенерированные с ++ функции в Matlab и тренируюсь на них, я снова могу получить почти идеальные результаты.
Есть ли что-то волшебное в реализации Matlab SVM? Есть ли какие-либо распространенные подводные камни или области, которые я мог бы изучить, которые могли бы объяснить поведение, которое я вижу? Я знаю, что это немного расплывчато, но отчасти проблема в том, что я не знаю, куда идти. Пожалуйста, дайте мне знать в комментариях, если есть другая информация, которую я могу предоставить, которая будет полезна.
В версии библиотек Matlab нет ничего волшебного, кроме того, что она работает в Matlab, что затрудняет стрельбу по ногам.
Контрольный список:
Некоторые другие вещи:
Я очень доволен тем, что libsvm использует ядро rbf. carlosdc указал на наиболее распространенные ошибки в правильном порядке :-). для libsvm — вы использовали инструменты python, поставляемые с libsvm? если нет, я рекомендую это сделать. запишите свои векторы функций в файл (из matlab и / или c ++) и выполните метатренинг для ядра rbf с помощью easy.py. вы получите параметры и прогноз для сгенерированной модели. если этот прогноз в порядке, продолжайте с C ++. после обучения вы также получаете масштабированный файл объектов (мин / макс преобразуется в -1.0 / 1.0 для каждой функции). сравните их с вашей реализацией на С ++.
некоторые проблемы libsvm: неприятная привычка (если я правильно помню), что значения, масштабирующиеся до 0 (ноль), опускаются в масштабируемом файле. в grid.py это параметр «nr_local_worker», который определяет количество потоков. Вы могли бы хотеть увеличить это.