Supprt Vector Machine работает в Matlab, не работает в Stack Overflow

Я пишу приложение, которое использует SVM для классификации некоторых изображений (особенно эти). Моя реализация Matlab работает очень хорошо. Используя подход SIFT «мешок слов», я могу достичь почти 100% точности с линейным ядром.

Мне нужно реализовать это в C ++ по соображениям скорости / переносимости, и поэтому я попытался использовать оба libsvm а также dlib. Я пробовал несколько типов SVM (c_svm, nu_svm, one_class) и несколько ядер (линейное, полиномиальное, rbf). Лучшее, чего я смог достичь, — это точность около 50% — даже на тех же образцах, на которых я тренировался. Я подтвердил, что мои генераторы функций работают, потому что когда я экспортирую сгенерированные с ++ функции в Matlab и тренируюсь на них, я снова могу получить почти идеальные результаты.

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

1

Решение

В версии библиотек Matlab нет ничего волшебного, кроме того, что она работает в Matlab, что затрудняет стрельбу по ногам.

Контрольный список:

  1. Вы нормализуете свои данные, заставляя все значения лежать между 0 и 1
    (или между -1 и 1), либо линейно, либо с использованием среднего и
    стандартное отклонение?
  2. Вы ищете параметры для хорошего значения C (или C и гамма в
    случай с ядром RBF)? Делаете перекрестную проверку или на удержании?
  3. Вы уверены, что вы обрабатываете NaN, и все другие с плавающей точкой
    гадость? Matlab очень хорошо скрывает это от вас, C ++ не очень
    много.
  4. Может быть, вы загружаете свои данные неправильно, читая
    «% s» в двойное число или что-то, что добавляет шум к вашему входу
    данные?
  5. Может ли быть так, что libsvm / dlib ожидает данные в главном порядке и
    Вы отправляете это в колонке Major (или наоборот)? Опять же, Matlab делает это почти невозможным, C ++ не так уж и много.
  6. 32-64 битность одна версия библиотеки, скомпилированный исполняемый файл
    с другой?

Некоторые другие вещи:

  1. Может ли быть так, что в Matlab вы каким-то образом пропускаете класс (y) в
    предварительная обработка? никто не делает это нарочно, но я видел, как это произошло.
    Если вы сделаете почти любую функцию, вы получите почти 100%
    каждый раз.
  2. Иногда это помогает проверить, что все численно
    идентично печати в файл перед тренировкой в ​​C ++ и
    Matlab.
5

Другие решения

Я очень доволен тем, что libsvm использует ядро ​​rbf. carlosdc указал на наиболее распространенные ошибки в правильном порядке :-). для libsvm — вы использовали инструменты python, поставляемые с libsvm? если нет, я рекомендую это сделать. запишите свои векторы функций в файл (из matlab и / или c ++) и выполните метатренинг для ядра rbf с помощью easy.py. вы получите параметры и прогноз для сгенерированной модели. если этот прогноз в порядке, продолжайте с C ++. после обучения вы также получаете масштабированный файл объектов (мин / макс преобразуется в -1.0 / 1.0 для каждой функции). сравните их с вашей реализацией на С ++.

некоторые проблемы libsvm: неприятная привычка (если я правильно помню), что значения, масштабирующиеся до 0 (ноль), опускаются в масштабируемом файле. в grid.py это параметр «nr_local_worker», который определяет количество потоков. Вы могли бы хотеть увеличить это.

1

По вопросам рекламы [email protected]