Я хочу оптимизировать свой 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