MATLAB Answers

Help solving error "Undefined function or variable 'objFcn'. with Bayesian Optimization Transfer Learning. How do I fix?

18 views (last 30 days)
I am trying to follow the example for Deep Learning Using Bayesian Optimization (, 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,...
function ObjFcn = makeObjFcn(imdsTrain,imdsValidation)
ObjFcn = @valErrorFun;
function [valError,cons,fileName] = valErrorFun(optVars)
%load the pretrained network
net = alexnet;
%******************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 = [
%---------------------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',...
'InitialLearnRate',optVars.InitialLearnRate, ...
'L2Regularization',optVars.L2Regularization, ...
'Momentum',optVars.Momentum, ...
%train network
netTransfer = trainNetwork(augimdsTrain,layers,options);
%Evaluate training
YPredict = classify(netTransfer,augimdsValidation);
valError = 1 - mean(YPredict == imdsValidation.Labels);
fileName = num2str(valError) + ".mat";
cons = [];

Accepted Answer

Don Mathis
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,...

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!