% Számjegyfelismerés (MNIST) MLP-vel % Adatok: digits_data.mat struktúrában, betöltés: load digits_data; % A struktúrának 4 mezője van, a parancsablakba digits_data -t gépelve % kaphatunk információt az adatokról. % Xtrain mező: tanulóadatok. Ezen a mezőn egy (28x28x1x60000)-es 4D tömb van. Xtrain=digits_data.Xtrain; % Nézzünk meg egy képet! figure imshow(Xtrain(:,:,:,27000)) % pl. a 27ezredik kép % Készítünk egy csupa nullákból álló X tömböt. % "Kilapítva" beletesszük az adatokat az X tömbbe. % X(:,:,:,i) az i-edik tanulókép lesz. X=zeros(784,60000); for i=1:60000 X(:,i)=reshape(Xtrain(:,:,:,i),784,1); end % A Ttrain mezőről betöltjük a tanulóadatokhoz tartozó outputvektort. % Ez egy 60000 elemű categorical típusú vektor. Ttrain=digits_data.Ttrain; % Az Xtest mezőről beolvassuk a tesztadatokat. Xtest=digits_data.Xtest; % Készítünk a tesztképeknek is egy tömböt. Xt=zeros(784,10000); for i=1:10000 Xt(:,i)=reshape(Xtest(:,:,:,i),784,1); end % A Ttest mezőről beolvassuk a tesztadatokhoz tartozó outputvektort. Ttest=digits_data.Ttest; %%%%%%%%%%%%%%%%%%%%%%%%%% % Output elkészítése: % A patternnet célváltozóként egy mátrixot vár, melynek i-edik oszlopa % a j-edik egységvektor, ha az i-edik adat a j-edik osztályba tartozik. % Elő kell állítanunk a tanuló és tesztadatok esetén is ezeket a % targetmátrixokat. trainTd=double(Ttrain); % A categorical (0-9) változót számmá alakítja: 1-10. trainTd=full(ind2vec(trainTd')); % A 60ezer elemű vektorban szereplő minden számot először vektorrá alakít, % a kapott tömb egy ritka mátrix. A full % parancs segítségével már konkrétan a % tömböt tárolja. testTd=double(Ttest); % Ugyanaz, mint fent, csak a tesztadatokra. testTd=full(ind2vec(testTd')); %%%%%%%%%%%%%%%%%%%%%%%%%% % Hálózat inicializálása és tanítása: %net=patternnet([100,50]); % 2 rejtett réteg, 100 ill. 50 neuronnal. Többi paraméter: default. %net=train(net,X,trainTd); % Tanítás. %%%%%%%%%%%%%%%%%%%%%%%%%% % Tesztelés: % Pontosság a tanító- és tesztadatokon: outT=net(X); % Hálózat által nyújtott output a tanítóadatokon. [~,outV]=max(outT); % Oszloponként (tanítópontonként) megkeresi az output vektor % (ami egy valószínűségeloszlás) % maximumának az indexét -> outV. % outV értékei: 1-10 TT=crosstab(outV,vec2ind(trainTd)); % Kereszttábla, tévesztési mátrix. ac1=['A tanitoadatokon a pontossag:' num2str(sum(diag(TT))/sum(sum(TT)))]; disp(ac1); % Kiírja az előző sort, benne kiszámolja a tévesztési mátrix főátlójában % szereplő számok összegének és az összes % tanítópontnak a hányadosát. % Ugyanaz, mint az előbb, csak most a tesztadatokkal. outT=net(Xt); [~,outV]=max(outT); TT=crosstab(outV,vec2ind(testTd)); ac2=['A tesztadatokon a pontossag: ' num2str(sum(diag(TT))/sum(sum(TT)))]; disp(ac2); % Ha meg akarunk nézni néhány rosszul osztályozott képet: [~,~,ind,~] = confusion(outT,testTd); % ind{i,j}-ben azok az indexek vannak felsorolva (a tesztképek közül), ahol a kép a j-edik % osztályba tartozik, de az i-edikbe lett besorolva. figure k=1; % Pl. a 0-nak besorolt 6-osok: for i=ind{1,7} subplot(5,5,k) imshow(Xtest(:,:,:,i)) k=k+1; end