Неизвестная ошибка при оптимизации CNN на Matlab - PullRequest
1 голос
/ 17 апреля 2020

Я хочу оптимизировать свой CNN как в этом примере , используя Bayesian optimization и Matlab 2019a. Вместо того, чтобы показывать все мои коды в одной части, я делю их на три части, чтобы показать, какие строки вызывают ошибку. Первая часть о загрузке данных, разделении для обучения и проверки и определении переменных оптимизации. Вторая часть, где ошибка . Третья часть - оставшаяся часть кодов. Обратите внимание, что buildLayer также написан мной для создания сетевых слоев.

Мои вопросы: Как я могу исправить вышеупомянутую ошибку и почему она произошла?

Первая часть (загрузка данных):

folder = 'C:\Users\X';
imds = imageDatastore(folder, ...
"IncludeSubfolders",true, ...
"LabelSource","foldernames");

num = 20;
per = randperm(1000, num);
figure;
for i=1 : num
    subplot(4, 5, i);
    imshow(imds.Files{per(i)});
end

img = readimage(imds,1);

[trainData, validData] = splitEachLabel(imds,0.8);

% defining optimizable variables
optVars = [
    optimizableVariable('depth', [1 5], "Type","integer")
    optimizableVariable('initLearningRate', [0.001, 1], "Transform","log")
    optimizableVariable('initFilterNum', [8 32], "Type","integer")
    optimizableVariable('momentum', [0.7 0.98])
    optimizableVariable('l2Reg', [1e-10 1e-2],'Transform','log')]

objFcn = makeObjFcn(trainData,validData);

Я получаю эту ошибку:

Формирование массива и индексация в скобках с объектами класса 'matlab .io.datastore.ImageDatastore 'не допускается. Используйте объекты класса 'matlab.io.datastore.ImageDatastore' только в качестве скаляров или используйте массив ячеек.

Ошибка в unique> uniqueR2012a (строка 191) a = a (:);

Ошибка в уникальном (строка 103) [varargout {1: nlhs}] = uniqueR2012a (varargin {:});

Ошибка в основном> makeObjFcn / valErrorFun (строка 47) numClasses = цифра (уникальная (vaData)) ;

Ошибка в байесовской оптимизации / callObjNormally (строка 2560) [Objective, ConstraintViolations, UserData] = this.ObjectiveFcn (conditionalizeX (this, X));

Ошибка в байесовской оптимизации / callObjFcn 46 ) = callObjNormally (this, X);

Ошибка в байесовской оптимизации / runSerial (строка 1989) ObjectiveFcnObjectiveEvaluationTime, ObjectiveNargout] = callObjFcn (this, this.XNext);

Ошибка в байесовской оптимизации строка 1941) this = runSerial (this);

ошибка байесовской оптимизации (строка 457) this = run (this);

ошибка байесопта (строка 323) Results = BayesianOptimization (Options);

вкл вторая часть (строки вызывают ошибку):

bayesObj = bayesopt(...
    objFcn, optVars, ...
    "MaxTime", 1* 3600,...,
    "IsObjectiveDeterministic",false,...
    "UseParallel",false);

и третья часть (оставшиеся коды):

estIdx = bayesObj.IndexOfMinimumTrace(end);
fileName = bayesObj.UserDataTrace{bestIdx};
savedStruct = load(fileName);
valError = savedStruct.valError;


function ObjFcn = makeObjFcn(trData,vaData)
ObjFcn = @valErrorFun;
    function [valError,cons,fileName] = valErrorFun(optVars)

        % making layers
        imageSize = [32 32 3];
        numClasses = numel(unique(vaData));
        layers = buidLayers(...
            imageSize,... 
            optVars.initFilterNum,...
            optVars.depth,...
            numClasses);

        miniBatchSize = 256;
        validationFrequency = floor(numel(vaData)/miniBatchSize);
        options = trainingOptions('sgdm', ...
            'InitialLearnRate',optVars.initLearningRate, ...
            'Momentum',optVars.momentum1, ...
            'MaxEpochs',60, ...
            'LearnRateSchedule','piecewise', ...
            'LearnRateDropPeriod',40, ...
            'LearnRateDropFactor',0.1, ...
            'MiniBatchSize',miniBatchSize, ...
            'L2Regularization',optVars.l2Reg, ...
            'Shuffle','every-epoch', ...
            'Verbose',false, ...
            'Plots','training-progress', ...
            'ValidationData',vaData, ...
            'ValidationFrequency',validationFrequency);

        pixelRange = [-4 4];

        imageAugmenter = imageDataAugmenter( ...
            'RandXReflection',true, ...
            'RandXTranslation',pixelRange, ...
            'RandYTranslation',pixelRange);
        datasource = augmentedImageDatastore(...
            imageSize,...
            trData,...
            'DataAugmentation',imageAugmenter);

        trainedNet = trainNetwork(datasource,layers,options);
        %close(findall(groot,'Tag','NNET_CNN_TRAININGPLOT_FIGURE'))

        YPredicted = classify(trainedNet,XValidation);
        valError = 1 - mean(YPredicted == YValidation);

        fileName = num2str(valError) + ".mat";
        save(fileName,'trainedNet','valError','options')
        cons = [];

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