Перейти к содержимому
Compvision.ru
mrgloom

kmeans и MNIST dataset

Recommended Posts

vector<Mat> db_lbp(db.size());

	for(int i=0;i<db.size();++i)

	{

		lbp::OLBP(db[i],db_lbp[i]);

	}

	vector<Mat> db_hist(db.size());

	for(int i=0;i<db.size();++i)

	{

		lbp::histogram(db_lbp[i],db_hist[i],256);

	}

	db= db_hist;

попробовал так, получилось нечто опять же не очень ,если судить по проекции на 2д.

еще встаёт вопрос, почему тогда нельзя было использовать гистограмму и без LBR.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

пишут что

mathematically a k-means method yields the same centroids as a PCA projection

http://ranger.uta.edu/~chqding/papers/KmeansPCA1.pdf

только всё равно не понятно как это использовать ибо из kмеаns мы получаем принадлежность к классу, а из PCA всего лишь базис.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

mrgloom, не знаю видели ли Вы эту страничку (по deep learning - помню Вы давали какую то ссылку), но думаю она будет для Вас интересна.

http://deeplearning.stanford.edu/wiki/index.php/UFLDL_Tutorial

ЗЫ: Внизу страницы есть матлабовские исходники некоторых модулей.

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

похоже про проекции называется задача Manifold learning

тут помоему лучше всего isomap отработало

http://scikit-learn.org/0.10/auto_examples/manifold/plot_lle_digits.html

t-sne кстати попробовал работает, но о качестве трудно судить, а матлабовская версия работает ощутимо долго.

http://homepage.tudelft.nl/19j49/t-SNE.html

и еще вот это в тему

Multidimensional scaling

http://en.wikipedia.org/wiki/Multidimensional_scaling

еще может пригодится

http://people.cs.uchicago.edu/~dinoj/ndaona/

сравнение алгоритмов

http://www.cs.wmich.edu/~yang/research/dembed/

еще 1 метод визуализации

http://people.cs.uchicago.edu/~dinoj/vis/digits/

визуализация на питоне

http://www.pymvpa.org/examples/mdp_mnist.html

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

isomap - красивее смотрится, те методы, которые дают нечто, похожее на треугольник, кластеры тоже не плохо собрали.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

решил попробовать svm на mnist

http://ttic.uchicago.edu/~smaji/projects/digits/

то что тут без напильника не завелось.

и в итоге классификаторы я качал отдельно новые версии libsvm и liblinear т.к. в матлабовском svm нет поддержки классификации для многих классов.

в итоге libsvm работает довольно долго и для большой выборки я так и не дождался окончания там пару раз было 10кк итераций каких то.

кстати я так и не понял что это за итерации.

liblinear работает быстро, но точность почему то хуже у неё, чем у линейного классификатора в libsvm.(опять же это похоже связано как то с итерациями ибо там 1к максимум их было).

попозже еще отпишу про точность и выложу архив со всем готовым.

sphog фичи кстати улучшают распознавание, только вектор увеличивается в 3 раза(по сравнению с просто пикселями).

непонятно почему, если я беру набор 70к запихиваю его в svm и потом прогоняю, точность всё равно не 100%, т.е. он не смог разделить тренировочную выборку или как это трактовать?

еще интересно будет попробовать сделать искажения цифр и дополнить этим тренировочную выборку, только я пока не нашел кода на матлабе для этого.

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

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

попробовал libsvm с gpu

http://mklab.iti.gr/project/GPU-LIBSVM

я так понял там на gpu переложены какие то матричные операциии, которые делаются спомощью cublas, у меня заработало только собранное из сорцов, причем там нету интерфейса для матлаба, но можно из матлаба экспортировать данные с помощью svmwrite и потом использовать их просто с .exe.

но при работе я как то не заметил, что gpu хоть как то используется.

еще можно тот же mnist скачать отсюда

http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/multiclass.html#mnist

вообщем в итоге похоже данные перед использованием надо скейлить на [0 1], ибо видимо какая то численная нестабильность.

причем обучение прошло относительно быстро ,а вот проверка долго, ибо наверно получилось большое кол-во support vectors.

запускал с параметрами

'-s 0 -t 0'

model =

Parameters: [5x1 double]

nr_class: 10

totalSV: 11625

rho: [45x1 double]

Label: [10x1 double]

sv_indices: [11625x1 double]

ProbA: []

ProbB: []

nSV: [10x1 double]

sv_coef: [11625x9 double]

SVs: [11625x784 double]

Accuracy = 96.9314% (67852/70000) (classification)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

попробовал варьировать С параметр и при С=10 выдало 100%, но непонятно хорошо ли это или плохо.(всмысле оверфитинг и все дела).

еще есть некий online svm

http://leon.bottou.org/papers/loosli-canu-bottou-2006

http://leon.bottou.org/projects/lasvm

с 8кк сэмплов сделаных путем деформации обычного mnist.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
попробовал варьировать С параметр и при С=10 выдало 100%, но непонятно хорошо ли это или плохо.(всмысле оверфитинг и все дела).

Это на тестовой выборке? Если да, то это вряд-ли оверфиттинг.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Это на тестовой выборке? Если да, то это вряд-ли оверфиттинг.

это на той же выборке на которой проводилось обучение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну тогда это ни о чем, надо на тестовой проверить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ну так как раз меня бы не удивило, если бы было всё время 100%, а так в зависимости от параметра С может получиться и не 100%.

по дефолту например С=1 и не дает 100%.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

С - это параметр регуляризации (или для svm цена ошибки классификации), он задает гибкость модели.

Для SVM (обычно везде наоборот), чем больше C, тем меньше регуляризация, и больше гибкость модели.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ну как я понял этот параметр как то тоже можно через grid search найти автоматом, что то там связанное с кроссвалидацией.

пока не пробовал.

попробовал применить svm для распознавания лиц, на orl database 40 индивидов и по 10 картинок на кадого и всего 400.

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

на матлабе

%orl dataset test

n=200;

k = randperm(size(orl_data,1));

ndata = orl_data(k(1:n),: ) ;

nlabel = orl_label(k(1:n),: ) ;

model= svmtrain(nlabel,ndata,'-s 0 -t 0')


n=400;

%вроде так не совсем честно ибо тестовая выборка должна не пересекаться

k = randperm(size(orl_data,1));

ndata = orl_data(k(1:n),: ) ;

nlabel = orl_label(k(1:n),: ) ;

[predict_label, accuracy, dec_values] = svmpredict(nlabel, ndata, model);
потом попробовал по честному на питоновых скриптах и батниках libsvm
libsvmwrite('orl_data.txt', orl_label, sparse(orl_data));
и разделил на тренировочную и тестовую
python subset.py orl_data.txt 100 orl_train.txt orl_test.txt
на 100 и 300. потом обучил и проверил
svm-train -t 0 orl_train.txt orl_model.txt svm-predict orl_test.txt orl_model.txt orl_res.txt
выдало 72% если наоборот 300 и 100 98% интересно, как это будет работать если классов будт много, можно еще проверить на feret db она вроде побольше. оказывается на матлабе разделить выборку тоже довольно просто
X = magic(8);

inds = randperm(64);

vector1 = X(1:5);

vector2 = X(6:12);

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

еще по поводу визуализации, когда хотим максимизировать расстояние между классами и минимизировать внутри класса.

http://stats.stackexchange.com/questions/16305/dimensionality-reduction-technique-to-maximize-separation-of-known-clusters

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

на python используя sklearn

import numpy as np

import matplotlib.pyplot as plt

from itertools import product

from sklearn.decomposition import RandomizedPCA

from sklearn.datasets import fetch_mldata

from sklearn.utils import shuffle


#use all digits

mnist = fetch_mldata("MNIST original")

X_train, y_train = mnist.data[:70000] / 255., mnist.target[:70000]


#X_train, y_train = shuffle(X_train, y_train)

#X_train, y_train = X_train[:1000], y_train[:1000] # lets subsample a bit for a first impression


pca = RandomizedPCA(n_components=2)

fig, plot = plt.subplots()

fig.set_size_inches(50, 50)

plt.prism()


X_transformed = pca.fit_transform(X_train)

plot.scatter(X_transformed[:, 0], X_transformed[:, 1], c=y_train)

plot.set_xticks(())

plot.set_yticks(())


plt.tight_layout()

plt.savefig("mnist_pca.png")

(Я извиняюсь, но уж очень долго грузит, уменьшил размеры изображения в 2 раза (Smorodov) )

post-1-0-44679000-1379619955_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А сколько это считалось?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

2 mrgloom:

Рядом бы для сравнения поместить картинку из статьи Хинтона в Сайнс 2006г (с той, с которой начался мировой бум deep learning).

Чисто для спекуляции насчёт того, что алгоритм снижения размерности, явно не ставящий задачи минимизации внутриклассовых расстояний и максимизации межклассовых, - тоже отрабатывает на этой базе очень достойно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×