Использование SVM поверх извлеченных функций CNN - Как сделать классификацию мультикласса? - PullRequest
0 голосов
/ 15 января 2019

В наборе данных MNIST есть 10 классификационных выходных данных. Теперь я хотел бы использовать SVM в качестве классификатора для этой задачи классификации. Я использовал архитектуру CNN (исключая верхний слой или классификатор), чтобы сначала извлечь элемент из необработанного изображения, а затем поместить его в классификатор SVM.

SVM - это двоичный классификатор, поэтому мы можем использовать One-vs-One или One-vs-Rest подход к выполнению таких задач. Я использую ниже реализованный код из Sci-Kit узнать официальный документ. Но я не мог понять, где я указываю модель для метки мультикласса, или это подход One-One или One-Rest .

Форма набора данных выглядит ниже:

train : (2045, 32, 32)
label : (2045, 10)

После извлечения функции, используя не верхний код CNN, мы получаем:

train : (7636, 256)  < - cnn_Xtrain
label : (7636,)      < - Ytrain

Классификатор SVM, который я пробовал

# SVC classifier
SVMC = SVC(probability=True)
svc_param_grid = {'kernel': ['rbf'], 
                  'gamma': [0.0001, 0.001],
                  'C': [1, 10, 50]}

gsSVMC = GridSearchCV(SVMC, param_grid = svc_param_grid, cv = K_fold,
                      scoring="accuracy", n_jobs= -1, verbose = 1)

gsSVMC.fit(cnn_Xtrain, Ytrain) # fitting extracted features

SVMC_best = gsSVMC.best_estimator_

В этом классификаторе, как SVM понимает, что это проблема с несколькими классами или один против одного или один против остальных? Результат для меня более подозрительный, я оцениваю почти 98%. За это отвечает ядро, указанное в grid-search (RBF)? Или я просто что-то тут не так сделал?

Кроме того, можно ли извлечь эту функцию из необработанного изображения с использованием кодов CNN, а затем поместить ее в SVM или аналогичный классификатор?

1 Ответ

0 голосов
/ 15 января 2019

Время принятия решения об использовании one-vs-rest или one-vs-one задается в параметре′ing_function_shape 'классификатора (см. doc для svc ). Там говорится:

Возвращать ли решающую функцию one-vs-rest ('ovr') формы (n_samples, n_classes) в качестве всех других классификаторов или исходную решающую функцию one-vs-one ('ovo') libsvm, которая имеет форма (n_samples, n_classes * (n_classes - 1) / 2). Тем не менее, «один против одного» («ovo») всегда используется в качестве мультиклассовой стратегии. Изменено в версии 0.19: решение по умолчанию имеет значение «ovr». Новое в версии 0.17: решение Solution_function_shape = ’ovr’ рекомендуется. Изменено в версии 0.17: устарело Solution_function_shape = ’ovo’ и None.

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

Что касается вашего вопроса об использовании CNN для извлечения элементов перед установкой: в общем, это должно работать. Однако, используя правильное ядро, оно не должно быть необходимым. Если вы хотите уменьшить размерность векторов объектов, вы можете просто использовать pca или методы нелинейного встраивания, такие как встраивание в многообразие , чтобы получить меньше объектов.

надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...