rng(0) % seed: random number generator -> reprodukálhatóság érdekében % Beolvassuk az adatokat, formátum: imageDatastore % Célváltozó: az alkönyvtár neve imds=imageDatastore('att_faces',... 'IncludeSubfolders',true,'FileExtensions','.pgm','LabelSource','foldernames'); % Nézzünk meg egy képet: imshow(imds.Files{131}) % 400 kép összesen % Elkészítjük a tanító- és teszthalmazt: minden személy első 7 képe % tanítóadat, a maradék 3 tesztadat. [imds1,imds2] = splitEachLabel(imds,7); % Definiáljuk a rétegeket: % Az első kötelezően az input réteg % paraméterei a képek mérete, ill a képcsatornák száma. % Az utolsó fullyconnectedlayer paramétere kötelezően az osztályok száma. layers = [imageInputLayer([112 92 1]) convolution2dLayer(5,6,'Padding',2) %batchNormalizationLayer % ilyen is lehet benne reluLayer maxPooling2dLayer(4,'Stride',2) convolution2dLayer(5,20,'Padding',2) reluLayer maxPooling2dLayer(4,'Stride',2) dropoutLayer(.4) fullyConnectedLayer(80) fullyConnectedLayer(40) softmaxLayer classificationLayer()]; % Tanítási paraméterek megadása: options = trainingOptions('sgdm','MaxEpochs',50, ... 'InitialLearnRate',0.001,'LearnRateSchedule','piecewise',... 'LearnRateDropFactor', 0.6, ... 'LearnRateDropPeriod', 5,'MinibatchSize',40,... 'L2Regularization',0.005,'Plots','training-progress'); % Betanítás: convnet = trainNetwork(imds1,layers,options); % Tanítás után: parancsablakba gépelve, hogy convnet, információt kapunk a % hálózatról. A convnet.Layers parancsot beírva részletes leírást kapunk a % rétegekről. % Sorok elején lévő számok segítségével hivatkozhatunk a rétegekre. % Pl. konvolúciós rétegek: 2 és 5. % Mesterségesen is állíthatjuk a kezdősúlyokat: pl. % layers(2).Weights = gpuArray(single(unifrnd(-0.05,0.05,[5 5 1 6]))); % layers(5).Weights = gpuArray(single(unifrnd(-0.05,0.05,[5 5 6 20]))); % Ha a gépünk nem alkalmas arra, hogy GPU-n számoljon, akkor: % layers(2).Weights = unifrnd(-0.05,0.05,[5 5 1 6]); % layers(5).Weights = unifrnd(-0.05,0.05,[5 5 6 20]); % Tesztelés, tanítóképeken: predTrain=classify(convnet,imds1); % Pontosság a tanítóhalmazon: accuracy1=sum(imds1.Labels==predTrain)/numel(predTrain) % Tesztelés a tesztképeken: predTraint=classify(convnet,imds2); % Pontosság a teszthalmazon: accuracy2=sum(imds2.Labels==predTraint)/numel(predTraint)