Arhn - архитектура программирования

SVM для гендерной классификации: 100% правильные результаты с линейным ядром, но гораздо худшие результаты с RBF

Я создал небольшую программу для классификации пола на основе изображения лица. Я использовал базу данных лиц Йельского университета (175 изображений для мужчин и столько же для самки), преобразовали их в оттенки серого и выровняли гистограммы, поэтому после предварительной обработки изображения выглядят так:

введите здесь описание изображения

Я запустил следующий код для проверки результатов (он использует SVM и ядро ​​linear):

def run_gender_classifier():
    Xm, Ym = mkdataset('gender/male', 1)     # mkdataset just preprocesses images, 
    Xf, Yf = mkdataset('gender/female', 0)   #  flattens them and stacks into a matrix
    X = np.vstack([Xm, Xf])
    Y = np.hstack([Ym, Yf])
    X_train, X_test, Y_train, Y_test = train_test_split(X, Y,
                                                    test_size=0.1,
                                                    random_state=100)
    model = svm.SVC(kernel='linear')
    model.fit(X_train, Y_train)
    print("Results:\n%s\n" % (
        metrics.classification_report(
            Y_test, model.predict(X_test))))

И получили 100% точность!

In [22]: run_gender_classifier()
Results:
             precision    recall  f1-score   support

          0       1.00      1.00      1.00        16
          1       1.00      1.00      1.00        19

avg / total       1.00      1.00      1.00        35

Я мог бы ожидать других результатов, но 100% правильная классификация изображений выглядит для меня очень подозрительно.

Более того, когда я сменил ядро ​​на RBF, результаты стали совсем плохими:

In [24]: run_gender_classifier()
Results:
             precision    recall  f1-score   support

          0       0.46      1.00      0.63        16
          1       0.00      0.00      0.00        19

avg / total       0.21      0.46      0.29        35

Что мне кажется еще более странным.

Итак, мои вопросы:

  1. Есть ли ошибка в моем подходе или коде?
  2. Если нет, то как результаты для линейного ядра могут быть такими хорошими, а для RBF такими плохими?

Обратите внимание, что я также получил 100% правильные результаты с логистической регрессией и очень плохие результаты с сетями глубокого доверия, поэтому это не относится к SVM, а скорее к линейным и нелинейным моделям.


Просто для полноты вот мой код для предварительной обработки и создания набора данных:

import cv2
from sklearn import linear_model, svm, metrics
from sklearn.cross_validation import train_test_split


def preprocess(im):
    im = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
    im = cv2.resize(im, (100, 100))
    return cv2.equalizeHist(im)


def mkdataset(path, label):
    images = (cv2.resize(cv2.imread(fname), (100, 100))
              for fname in list_images(path))
    images = (preprocess(im) for im in images)
    X = np.vstack([im.flatten() for im in images])
    Y = np.repeat(label, X.shape[0])
    return X, Y

Ответы:


1

Все описанные модели требуют настройки параметров:

  • Линейный SVM: C
  • RBF SVM: C, гамма
  • DBN: количество слоев, количество нейронов, выходной классификатор, скорость обучения...

И вы просто опустили этот элемент. Так что вполне естественно, что модели с наименьшим количеством настраиваемых параметров вели себя лучше - просто больше вероятность того, что параметры по умолчанию действительно работали.

100%-й результат всегда выглядит подозрительно, и вы должны дважды проверить его «вручную» — физически разделить данные на обучение и тестирование (поместить в разные каталоги), обучить одну часть, сохранить вашу модель в файл. Затем в отдельном коде - загрузите модель и протестируйте ее на тестовых файлах с отображением изображения + метки из модели. Таким образом, вы убедитесь, что нет ошибки реализации (поскольку вам действительно все равно, есть ли какая-либо ошибка обработки, если у вас есть физическое доказательство того, что ваша модель распознает эти лица, верно?). Это чисто «психологический метод», который делает очевидным отсутствие ошибки в разделении/разделении данных и дальнейшей оценке.

ОБНОВЛЕНИЕ

Как было предложено в комментарии, я также проверил ваш набор данных, как указано на официальном сайте:

Расширенная база данных Yale Face Database B содержит 16 128 изображений 28 человек в 9 позах и 64 условиях освещения.

Так что это точно проблема - это не набор данных для распознавания пола. Ваш классификатор просто запоминает эти 28 субъектов, которые легко делятся на мужские и женские. Он просто не будет работать ни с одним изображением из других предметов. Единственная «ценная» часть этого набора данных — это набор из 28 лиц характерных личностей, которые вы можете извлечь вручную, но 28 изображений кажутся по крайней мере в ряд слишком маленькими, чтобы быть полезными.

26.10.2013
  • Кроме того, для тестового разделения поезда убедитесь, что лица из тестового разделения принадлежат другим людям, чем лица из разделения поезда. Я хочу, чтобы вы получили не более одной фотографии на человека в наборе данных Йельского университета. Если люди получают повторяющиеся изображения, то классификатору, возможно, придется просто переопределить идентичность людей, а не обобщать, рассматривая только атрибуты, специфичные для пола. 26.10.2013
  • Запоминание лиц субъектов действительно имеет смысл для меня. Это также объясняет, почему простая линейная модель работала так хорошо. Спасибо за ответ и комментарий :) 26.10.2013

  • 2

    Друг, из того, что я понимаю в вашем описании ваших вопросов, и я думаю, что объяснение простое, из-за проблемы с линейным ядром лучше, чем RBF, считаю, что ваша логика верна, однако вы должны использовать RBF несколько неправильно, я думаю, что это будет служить к вашей проблеме, продолжайте пытаться разработать способ просто использовать линейное ядро

    25.10.2013
  • Спасибо, Фернандо, но меня больше интересовало, почему линейная модель работает так хорошо, и предложение @ogrisel кажется наиболее правдоподобным. 26.10.2013
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..