Help solving error "Undefined function or variable 'objFcn'. with Bayesian Optimization Transfer Learning. How do I fix?
5 views (last 30 days)
Show older comments
I am trying to follow the example for Deep Learning Using Bayesian Optimization (https://www.mathworks.com/help/deeplearning/examples/deep-learning-using-bayesian-optimization.html), but with transfer learning instead. I keep running into the error:
"Undefined function or variable 'objFcn'.
Error in test_BayesianOptimization (line 38)
BayesObj = bayesopt(objFcn,optimVars,..."
I am using imageDataStores instead of 4-D uint8 arrays and categorical arrays to store the images and I think this might be part of the problem but I'm not sure how to go about fixing it.
Some of the code I think is relevant to my problem is as follows:
%load data
imds = imageDatastore('D:\Wavelets\Transfer Learning\Images', ...
'IncludeSubfolders', true, ...
'FileExtensions', '.jpg', ...
'LabelSource', 'foldernames');
[imdsTrain,imdsValidation] = splitEachLabel(imds,0.8,'randomize');
%Create the object function for the Bayesian optimizer.
%defined at bottom of script.
ObjFcn = makeObjFcn(imdsTrain,imdsValidation);
%this is where line 38 is that I keep getting the error
BayesObj = bayesopt(objFcn,optimVars,...
'MaxTime',1.5*60*60,...
'IsObjectDeterministic',false,...
'UseParallel',false);
%-------------------------ObjectiveFunction-------------------
function ObjFcn = makeObjFcn(imdsTrain,imdsValidation)
ObjFcn = @valErrorFun;
function [valError,cons,fileName] = valErrorFun(optVars)
%load the pretrained network
net = alexnet;
%analyzeNetwork(net);
%******************define network architecture********************
inputSize = net.Layers(1).InputSize;
%replace final layers of network for new training classifications
layersTransfer = net.Layers(1:end-3);
numClasses = numel(categories(imdsTrain.Labels));
layers = [
layersTransfer
fullyConnectedLayer(numClasses,...
'WeightLearnRateFactor',10,...
'BiasLearnRateFactor',10)
softmaxLayer
classificationLayer];
%---------------------Resize Images--------------------------
augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain);
augimdsValidation = augmentedImageDatastore(inputSize(1:2),imdsValidation);
%-------------------set up training options------------------
miniBatchSize = optVars.miniBatchSize;
validationFreq = floor(numel(imdsTrain)/miniBatchSize);
options = trainingOptions('sgdm',...
'MiniBatchSize',miniBatchSize,...
'MaxEpochs',optVars.MaxEpochs,...
'Shuffle','every-epoch',...
'ValidationData',augimdsValidation,...
'ValidationFrequency',valFreq,...
'InitialLearnRate',optVars.InitialLearnRate, ...
'L2Regularization',optVars.L2Regularization, ...
'Momentum',optVars.Momentum, ...
'Verbose',false,...
'Plots','training-progress');
%train network
netTransfer = trainNetwork(augimdsTrain,layers,options);
%Evaluate training
YPredict = classify(netTransfer,augimdsValidation);
valError = 1 - mean(YPredict == imdsValidation.Labels);
fileName = num2str(valError) + ".mat";
save(fileName,'netTransfer','valError','options')
cons = [];
end
end
0 Comments
Accepted Answer
Don Mathis
on 3 Jul 2019
It looks like you named your variable ObjFcn but then passed it as objFcn.
ObjFcn = makeObjFcn(imdsTrain,imdsValidation);
BayesObj = bayesopt(objFcn,optimVars,...
0 Comments
More Answers (3)
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!