Как использовать k-кратную перекрестную проверку с нейронной сетью 'patter nnet' в Matlab? - PullRequest
1 голос
/ 12 апреля 2020

Я пытаюсь использовать k-кратную перекрестную проверку с нейронной сетью patternnet.

inputs1 - это вектор объектов, а targets1 - это вектор меток из iris_dataset. И xtrain, xtest, ytrain и ytest являются функциями обучения и тестирования и метками соответственно после разделения с использованием функции cvpartition.

Шаги следующие:

1. Прежде всего, создается сеть распознавания образов (patternnet).

In the first and second scripts: net = patternnet; 

2. После разделения данных на k-кратные с использованием cvpartition, две функции обучения и тестирования и метки созданы (k=10).

In the first and second scripts: fold = cvpartition(targets_Vec, 'kfold', kfold);

3. Затем команда configure используется для настройки сетевого объекта, а также инициализации весов и смещений сети;

In the first script: net = configure(net, xtrain', dummyvar(ytrain)'); % xtrain and ytrain are features and labels from step (2).

или

In the second script: net = configure(net, inputs1, targets1); % inputs1 and targets1 are features and labels before splitting up.

4. После инициализации параметров и гиперпараметров сеть обучается с использованием данных обучения (с помощью функции train()).

In the first script: [net, tr] = train(net, xtrain', dummyvar(ytrain)'); % xtrain and ytrain are features and labels from step (2).

или

In the second script: [net, tr] = train(net, inputs1, targets1); % inputs1 and targets1 are features and labels before splitting up.

5. И, наконец, цели оцениваются с использованием обученной сети (с помощью функции net()).

In the first script: pred = net(xtest'); % testing features from step (2).

или

In the second script: pred = net(inputs1); 

Поскольку функции обучения и тестирования разделяются с помощью cvpartition, сеть следует обучать с использованием функций обучения и ее меток, а затем проверять их с помощью функций тестирования (новые данные).

Хотя функция train() используется для обучения сети, но она разбивает свой собственный ввод (данные обучения и метки из шага (2)) на данные обучения, проверки и тестирования, в то время как исходные данные тестирования из шаг (2) остается неиспользованным.

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

После поиска я написал два сценария, я думаю, что первый неверен, но я не уверен, что второй тоже неверен или нет? Как это решить?

Первый скрипт:

clc; close all; clearvars;
load iris_dataset
max_iter = 10;
kfold = 10;
[inputs, targets] = iris_dataset;  
inputs = inputs';
targets = targets';

targets_Vec= [];
for j = 1 : size(targets, 1)
    if max(targets(j, 1:3) == 1) && find(targets(j, 1:3))==1
        targets_Vec = [targets_Vec; 1];
    elseif max(targets(j, 1:3) == 1) && find(targets(j, 1:3))==2
        targets_Vec = [targets_Vec; 2];
    elseif max(targets(j, 1:3) == 1) && find(targets(j, 1:3))==3
        targets_Vec = [targets_Vec; 3];
    end
end

net = patternnet; ... Create a Pattern Recognition Network 

rng('default');     
... Divide data into k-folds
fold = cvpartition(targets_Vec, 'kfold', kfold);
... Pre
pred2 = []; ytest2 = []; Afold = zeros(kfold,1); 

... Neural network start
for k = 1 : kfold
    ... Call index of training & testing sets
    trainIdx = fold.training(k); testIdx = fold.test(k);
    ... Call training & testing features and labels
    xtrain = inputs(trainIdx,:); ytrain = targets_Vec(trainIdx);
    xtest = inputs(testIdx,:);   ytest = targets_Vec(testIdx);

    ... configure
    net = configure(net, xtrain', dummyvar(ytrain)');

    ... Initialize neural network
    net.layers{1}.name='Hidden Layer 1';
    net.layers{2}.name='Output Layer';
    net.layers{1}.size = 20;
    net.layers{1}.transferFcn = 'tansig'; 
    net.trainFcn = 'trainscg'; 
    net.performFcn = 'crossentropy'; 

    ... Choose Input and Output Pre/Post-Processing Functions
    net.input.processFcns = {'removeconstantrows','mapminmax'};
    net.output.processFcns = {'removeconstantrows','mapminmax'};

    ... Train the Network
    [net, tr] = train(net, xtrain', dummyvar(ytrain)'); 
    ... Estimate the targets using the trained network.(Test)
    pred = net(xtest'); 

    ... Confusion matrix
    [c, cm] = confusion(dummyvar(ytest)',pred);        
    ... Get accuracy for each fold
    Afold(k) = 100*sum(diag(cm))/sum(cm(:));
    ... Store temporary result for each fold
    pred2 = [pred2(1:end,:), pred]; 
    ytest2 = [ytest2(1:end); ytest]; 
end

... Overall confusion matrix
[~,confmat] = confusion(dummyvar(ytest2)', pred2); 
confmat=transpose(confmat);
... Average accuracy over k-folds
acc = mean(Afold);
... Store results 
NN.fold = Afold;
NN.acc = acc; 
NN.con = confmat; 
fprintf('\n Final classification Accuracy (NN): %g %%',acc);  

Второй скрипт:

clc; close all; clearvars;
load iris_dataset
max_iter = 10;
kfold = 10;
[inputs1, targets1] = iris_dataset;  
inputs = inputs1';
targets = targets1';

targets_Vec= [];
for j = 1 : size(targets, 1)
    if max(targets(j, 1:3) == 1) && find(targets(j, 1:3))==1
        targets_Vec = [targets_Vec; 1];
    elseif max(targets(j, 1:3) == 1) && find(targets(j, 1:3))==2
        targets_Vec = [targets_Vec; 2];
    elseif max(targets(j, 1:3) == 1) && find(targets(j, 1:3))==3
        targets_Vec = [targets_Vec; 3];
    end
end

net = patternnet; ... Create a Pattern Recognition Network

rng('default');     
... Divide data into k-folds
fold = cvpartition(targets_Vec, 'kfold', kfold);
... Pre
pred2 = []; ytest2 = []; Afold = zeros(kfold,1); 

... Neural network start
for k = 1 : kfold
    ... Call index of training & testing sets
    trainIdx = fold.training(k); testIdx = fold.test(k);
    ... Call training & testing features and labels
    xtrain = inputs(trainIdx,:); ytrain = targets_Vec(trainIdx);
    xtest = inputs(testIdx,:);   ytest = targets_Vec(testIdx);

    ... configure
    net = configure(net, inputs1, targets1);

    trInd = find(trainIdx);   tstInd = find(testIdx);
    net.divideFcn = 'divideind'; 
    net.divideParam.trainInd = trInd;
    net.divideParam.testInd = tstInd;

    ... Initialize neural network
    net.layers{1}.name='Hidden Layer 1';
    net.layers{2}.name='Output Layer';
    net.layers{1}.size = 20;                      
    net.layers{1}.transferFcn = 'tansig'; 
    net.trainFcn = 'trainscg'; 
    net.performFcn = 'crossentropy';

    ... Choose Input and Output Pre/Post-Processing Functions
    net.input.processFcns = {'removeconstantrows','mapminmax'};
    net.output.processFcns = {'removeconstantrows','mapminmax'};

    ... Train the Network
    [net, tr] = train(net, inputs1, targets1);
    pred = net(inputs1); ... Estimate the targets using the trained network (Test) 

    ... Confusion matrix
    [c, cm] = confusion(targets1, pred);
    y = net(inputs1);
    e = gsubtract(targets1, y);
    performance = perform(net, targets1, y);
    tind = vec2ind(targets1);
    yind = vec2ind(y);  

    percentErrors = sum(tind ~= yind)/numel(tind);

    ... Recalculate Training, Validation and Test Performance
    trainTargets = targets1 .* tr.trainMask{1};
%         valTargets = targets1 .* tr.valMask{1};
    testTargets = targets1 .* tr.testMask{1};
    trainPerformance = perform(net, trainTargets, y);
%         valPerformance = perform(net, valTargets, y);
    testPerformance = perform(net, testTargets, y);
    test_Fold(k) = testPerformance;

end

test_Fold_mean = mean(test_Fold);
acc = 100*(1-test_Fold_mean);   
fprintf('\n Final classification Accuracy (NN): %g %%',acc);   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...