Number of layers: 71 |
Number of connections: 78 |
Training setup file: “params.mat” |
This script is run to create the network layers, import training and validation data, and train the network. |
➀ Load Training Setup Data: |
trainingSetup = load(“params.mat”) |
➁ Import Data: |
imdsTrain = trainingSetup.imdsTrain; |
imdsValidation = trainingSetup.imdsValidation; |
% Resize the images to match the network input layer. |
augimdsTrain = augmentedImageDatastore([224 224 3],imdsTrain); |
augimdsValidation = augmentedImageDatastore([224 224 3],imdsValidation); |
➂ Set Training Options: |
opts = trainingOptions(“sgdm”,… |
“ExecutionEnvironment”,“auto”,… |
“InitialLearnRate”,0.001,… |
“MaxEpochs”,5,… |
“Shuffle”,“every-epoch”,… |
“Plots”,“training-progress”,… |
“ValidationData”,augimdsValidation); |
➃ Create Layer Graph: |
lgraph = layerGraph(); |
Add Layer Branches: |
tempLayers = [ |
imageInputLayer([224 224 3],“Name”,“data”,“Normalization”,“zscore”,“Mean”,trainingSetup.data.Mean,“StandardDeviation”,trainingSetup.data.StandardDeviation) |
convolution2dLayer([7 7],64,“Name”,“conv1”,“BiasLearnRateFactor”,0,“Padding”,[3 3 3 3],“Stride”,[2 2],“Bias”,trainingSetup.conv1.Bias,“Weights”,trainingSetup.conv1.Weights) |
batchNormalizationLayer(“Name”,“bn_conv1”,“Offset”,trainingSetup.bn_conv1.Offset,“Scale”,trainingSetup.bn_conv1.Scale,“TrainedMean”,trainingSetup.bn_conv1.TrainedMean,“TrainedVariance”,trainingSetup.bn_conv1.TrainedVariance) |
reluLayer(“Name”,“conv1_relu”) |
maxPooling2dLayer([3 3],“Name”,“pool1”,“Padding”,[1 1 1 1],“Stride”,[2 2])]; |
lgraph = addLayers(lgraph,tempLayers); |
tempLayers = [ |
convolution2dLayer([3 3],64,“Name”,“res2a_branch2a”,“BiasLearnRateFactor”,0,“Padding”,[1 1 1 1],“Bias”,trainingSetup.res2a_branch2a.Bias,“Weights”,trainingSetup.res2a_branch2a.Weights) |
batchNormalizationLayer(“Name”,“bn2a_branch2a”,“Offset”,trainingSetup.bn2a_branch2a.Offset,“Scale”,trainingSetup.bn2a_branch2a.Scale,“TrainedMean”,trainingSetup.bn2a_branch2a.TrainedMean,“TrainedVariance”,trainingSetup.bn2a_branch2a.TrainedVariance) |
reluLayer(“Name”,“res2a_branch2a_relu”) |
convolution2dLayer([3 3],64,“Name”,“res2a_branch2b”,“BiasLearnRateFactor”,0,“Padding”,[1 1 1 1],“Bias”,trainingSetup.res2a_branch2b.Bias,“Weights”,trainingSetup.res2a_branch2b.Weights) |
batchNormalizationLayer(“Name”,“bn2a_branch2b”,“Offset”,trainingSetup.bn2a_branch2b.Offset,“Scale”,trainingSetup.bn2a_branch2b.Scale,“TrainedMean”,trainingSetup.bn2a_branch2b.TrainedMean,“TrainedVariance”,trainingSetup.bn2a_branch2b.TrainedVariance)]; |
lgraph = addLayers(lgraph,tempLayers); |
tempLayers = [ |
additionLayer(2,“Name”,“res2a”) |
reluLayer(“Name”,“res2a_relu”)]; |
lgraph = addLayers(lgraph,tempLayers); |
tempLayers = [ |
convolution2dLayer([3 3],64,“Name”,“res2b_branch2a”,“BiasLearnRateFactor”,0,“Padding”,[1 1 1 1],“Bias”,trainingSetup.res2b_branch2a.Bias,“Weights”,trainingSetup.res2b_branch2a.Weights) |
batchNormalizationLayer(“Name”,“bn2b_branch2a”,“Offset”,trainingSetup.bn2b_branch2a.Offset,“Scale”,trainingSetup.bn2b_branch2a.Scale,“TrainedMean”,trainingSetup.bn2b_branch2a.TrainedMean,“TrainedVariance”,trainingSetup.bn2b_branch2a.TrainedVariance) |
reluLayer(“Name”,“res2b_branch2a_relu”) |
convolution2dLayer([3 3],64,“Name”,“res2b_branch2b”,“BiasLearnRateFactor”,0,“Padding”,[1 1 1 1],“Bias”,trainingSetup.res2b_branch2b.Bias,“Weights”,trainingSetup.res2b_branch2b.Weights) |
batchNormalizationLayer(“Name”,“bn2b_branch2b”,“Offset”,trainingSetup.bn2b_branch2b.Offset,“Scale”,trainingSetup.bn2b_branch2b.Scale,“TrainedMean”,trainingSetup.bn2b_branch2b.TrainedMean,“TrainedVariance”,trainingSetup.bn2b_branch2b.TrainedVariance)]; |
lgraph = addLayers(lgraph,tempLayers); |
tempLayers = [ |
additionLayer(2,“Name”,“res2b”) |
reluLayer(“Name”,“res2b_relu”)]; |
lgraph = addLayers(lgraph,tempLayers); |
tempLayers = [ |
convolution2dLayer([3 3],128,“Name”,“res3a_branch2a”,“BiasLearnRateFactor”,0,“Padding”,[1 1 1 1],“Stride”,[2 2],“Bias”,trainingSetup.res3a_branch2a.Bias,“Weights”,trainingSetup.res3a_branch2a.Weights) |
batchNormalizationLayer(“Name”,“bn3a_branch2a”,“Offset”,trainingSetup.bn3a_branch2a.Offset,“Scale”,trainingSetup.bn3a_branch2a.Scale,“TrainedMean”,trainingSetup.bn3a_branch2a.TrainedMean,“TrainedVariance”,trainingSetup.bn3a_branch2a.TrainedVariance) |
reluLayer(“Name”,“res3a_branch2a_relu”) |
convolution2dLayer([3 3],128,“Name”,“res3a_branch2b”,“BiasLearnRateFactor”,0,“Padding”,[1 1 1 1],“Bias”,trainingSetup.res3a_branch2b.Bias,“Weights”,trainingSetup.res3a_branch2b.Weights) |
batchNormalizationLayer(“Name”,“bn3a_branch2b”,“Offset”,trainingSetup.bn3a_branch2b.Offset,“Scale”,trainingSetup.bn3a_branch2b.Scale,“TrainedMean”,trainingSetup.bn3a_branch2b.TrainedMean,“TrainedVariance”,trainingSetup.bn3a_branch2b.TrainedVariance)]; |
lgraph = addLayers(lgraph,tempLayers); |
tempLayers = [ |
convolution2dLayer([1 1],128,“Name”,“res3a_branch1”,“BiasLearnRateFactor”,0,“Stride”,[2 2],“Bias”,trainingSetup.res3a_branch1.Bias,“Weights”,trainingSetup.res3a_branch1.Weights) |
batchNormalizationLayer(“Name”,“bn3a_branch1”,“Offset”,trainingSetup.bn3a_branch1.Offset,“Scale”,trainingSetup.bn3a_branch1.Scale,“TrainedMean”,trainingSetup.bn3a_branch1.TrainedMean,“TrainedVariance”,trainingSetup.bn3a_branch1.TrainedVariance)]; |
lgraph = addLayers(lgraph,tempLayers); |
tempLayers = [ |
additionLayer(2,“Name”,“res3a”) |
reluLayer(“Name”,“res3a_relu”)]; |
lgraph = addLayers(lgraph,tempLayers); |
tempLayers = [ |
convolution2dLayer([3 3],128,“Name”,“res3b_branch2a”,“BiasLearnRateFactor”,0,“Padding”,[1 1 1 1],“Bias”,trainingSetup.res3b_branch2a.Bias,“Weights”,trainingSetup.res3b_branch2a.Weights) |
batchNormalizationLayer(“Name”,“bn3b_branch2a”,“Offset”,trainingSetup.bn3b_branch2a.Offset,“Scale”,trainingSetup.bn3b_branch2a.Scale,“TrainedMean”,trainingSetup.bn3b_branch2a.TrainedMean,“TrainedVariance”,trainingSetup.bn3b_branch2a.TrainedVariance) |
reluLayer(“Name”,“res3b_branch2a_relu”) |
convolution2dLayer([3 3],128,“Name”,“res3b_branch2b”,“BiasLearnRateFactor”,0,“Padding”,[1 1 1 1],“Bias”,trainingSetup.res3b_branch2b.Bias,“Weights”,trainingSetup.res3b_branch2b.Weights) |
batchNormalizationLayer(“Name”,“bn3b_branch2b”,“Offset”,trainingSetup.bn3b_branch2b.Offset,“Scale”,trainingSetup.bn3b_branch2b.Scale,“TrainedMean”,trainingSetup.bn3b_branch2b.TrainedMean,“TrainedVariance”,trainingSetup.bn3b_branch2b.TrainedVariance)]; |
lgraph = addLayers(lgraph,tempLayers); |
tempLayers = [ |
additionLayer(2,“Name”,“res3b”) |
reluLayer(“Name”,“res3b_relu”)]; |
lgraph = addLayers(lgraph,tempLayers); |
tempLayers = [ |
convolution2dLayer([3 3],256,“Name”,“res4a_branch2a”,“BiasLearnRateFactor”,0,“Padding”,[1 1 1 1],“Stride”,[2 2],“Bias”,trainingSetup.res4a_branch2a.Bias,“Weights”,trainingSetup.res4a_branch2a.Weights) |
batchNormalizationLayer(“Name”,“bn4a_branch2a”,“Offset”,trainingSetup.bn4a_branch2a.Offset,“Scale”,trainingSetup.bn4a_branch2a.Scale,“TrainedMean”,trainingSetup.bn4a_branch2a.TrainedMean,“TrainedVariance”,trainingSetup.bn4a_branch2a.TrainedVariance) |
reluLayer(“Name”,“res4a_branch2a_relu”) |
convolution2dLayer([3 3],256,“Name”,“res4a_branch2b”,“BiasLearnRateFactor”,0,“Padding”,[1 1 1 1],“Bias”,trainingSetup.res4a_branch2b.Bias,“Weights”,trainingSetup.res4a_branch2b.Weights) |
batchNormalizationLayer(“Name”,“bn4a_branch2b”,“Offset”,trainingSetup.bn4a_branch2b.Offset,“Scale”,trainingSetup.bn4a_branch2b.Scale,“TrainedMean”,trainingSetup.bn4a_branch2b.TrainedMean,“TrainedVariance”,trainingSetup.bn4a_branch2b.TrainedVariance)]; |
lgraph = addLayers(lgraph,tempLayers); |
tempLayers = [ |
convolution2dLayer([1 1],256,“Name”,“res4a_branch1”,“BiasLearnRateFactor”,0,“Stride”,[2 2],“Bias”,trainingSetup.res4a_branch1.Bias,“Weights”,trainingSetup.res4a_branch1.Weights) |
batchNormalizationLayer(“Name”,“bn4a_branch1”,“Offset”,trainingSetup.bn4a_branch1.Offset,“Scale”,trainingSetup.bn4a_branch1.Scale,“TrainedMean”,trainingSetup.bn4a_branch1.TrainedMean,“TrainedVariance”,trainingSetup.bn4a_branch1.TrainedVariance)]; |
lgraph = addLayers(lgraph,tempLayers); |
tempLayers = [ |
additionLayer(2,“Name”,“res4a”) |
reluLayer(“Name”,“res4a_relu”)]; |
lgraph = addLayers(lgraph,tempLayers); |
tempLayers = [ |
convolution2dLayer([3 3],256,“Name”,“res4b_branch2a”,“BiasLearnRateFactor”,0,“Padding”,[1 1 1 1],“Bias”,trainingSetup.res4b_branch2a.Bias,“Weights”,trainingSetup.res4b_branch2a.Weights) |
batchNormalizationLayer(“Name”,“bn4b_branch2a”,“Offset”,trainingSetup.bn4b_branch2a.Offset,“Scale”,trainingSetup.bn4b_branch2a.Scale,“TrainedMean”,trainingSetup.bn4b_branch2a.TrainedMean,“TrainedVariance”,trainingSetup.bn4b_branch2a.TrainedVariance) |
reluLayer(“Name”,“res4b_branch2a_relu”) |
convolution2dLayer([3 3],256,“Name”,“res4b_branch2b”,“BiasLearnRateFactor”,0,“Padding”,[1 1 1 1],“Bias”,trainingSetup.res4b_branch2b.Bias,“Weights”,trainingSetup.res4b_branch2b.Weights) |
batchNormalizationLayer(“Name”,“bn4b_branch2b”,“Offset”,trainingSetup.bn4b_branch2b.Offset,“Scale”,trainingSetup.bn4b_branch2b.Scale,“TrainedMean”,trainingSetup.bn4b_branch2b.TrainedMean,“TrainedVariance”,trainingSetup.bn4b_branch2b.TrainedVariance)]; |
lgraph = addLayers(lgraph,tempLayers); |
tempLayers = [ |
additionLayer(2,“Name”,“res4b”) |
reluLayer(“Name”,“res4b_relu”)]; |
lgraph = addLayers(lgraph,tempLayers); |
tempLayers = [ |
convolution2dLayer([3 3],512,“Name”,“res5a_branch2a”,“BiasLearnRateFactor”,0,“Padding”,[1 1 1 1],“Stride”,[2 2],“Bias”,trainingSetup.res5a_branch2a.Bias,“Weights”,trainingSetup.res5a_branch2a.Weights) |
batchNormalizationLayer(“Name”,“bn5a_branch2a”,“Offset”,trainingSetup.bn5a_branch2a.Offset,“Scale”,trainingSetup.bn5a_branch2a.Scale,“TrainedMean”,trainingSetup.bn5a_branch2a.TrainedMean,“TrainedVariance”,trainingSetup.bn5a_branch2a.TrainedVariance) |
reluLayer(“Name”,“res5a_branch2a_relu”) |
convolution2dLayer([3 3],512,“Name”,“res5a_branch2b”,“BiasLearnRateFactor”,0,“Padding”,[1 1 1 1],“Bias”,trainingSetup.res5a_branch2b.Bias,“Weights”,trainingSetup.res5a_branch2b.Weights) |
batchNormalizationLayer(“Name”,“bn5a_branch2b”,“Offset”,trainingSetup.bn5a_branch2b.Offset,“Scale”,trainingSetup.bn5a_branch2b.Scale,“TrainedMean”,trainingSetup.bn5a_branch2b.TrainedMean,“TrainedVariance”,trainingSetup.bn5a_branch2b.TrainedVariance)]; |
lgraph = addLayers(lgraph,tempLayers); |
tempLayers = [ |
convolution2dLayer([1 1],512,“Name”,“res5a_branch1”,“BiasLearnRateFactor”,0,“Stride”,[2 2],“Bias”,trainingSetup.res5a_branch1.Bias,“Weights”,trainingSetup.res5a_branch1.Weights) |
batchNormalizationLayer(“Name”,“bn5a_branch1”,“Offset”,trainingSetup.bn5a_branch1.Offset,“Scale”,trainingSetup.bn5a_branch1.Scale,“TrainedMean”,trainingSetup.bn5a_branch1.TrainedMean,“TrainedVariance”,trainingSetup.bn5a_branch1.TrainedVariance)]; |
lgraph = addLayers(lgraph,tempLayers); |
tempLayers = [ |
additionLayer(2,“Name”,“res5a”) |
reluLayer(“Name”,“res5a_relu”)]; |
lgraph = addLayers(lgraph,tempLayers); |
tempLayers = [ |
convolution2dLayer([3 3],512,“Name”,“res5b_branch2a”,“BiasLearnRateFactor”,0,“Padding”,[1 1 1 1],“Bias”,trainingSetup.res5b_branch2a.Bias,“Weights”,trainingSetup.res5b_branch2a.Weights) |
batchNormalizationLayer(“Name”,“bn5b_branch2a”,“Offset”,trainingSetup.bn5b_branch2a.Offset,“Scale”,trainingSetup.bn5b_branch2a.Scale,“TrainedMean”,trainingSetup.bn5b_branch2a.TrainedMean,“TrainedVariance”,trainingSetup.bn5b_branch2a.TrainedVariance) |
reluLayer(“Name”,“res5b_branch2a_relu”) |
convolution2dLayer([3 3],512,“Name”,“res5b_branch2b”,“BiasLearnRateFactor”,0,“Padding”,[1 1 1 1],“Bias”,trainingSetup.res5b_branch2b.Bias,“Weights”,trainingSetup.res5b_branch2b.Weights) |
batchNormalizationLayer(“Name”,“bn5b_branch2b”,“Offset”,trainingSetup.bn5b_branch2b.Offset,“Scale”,trainingSetup.bn5b_branch2b.Scale,“TrainedMean”,trainingSetup.bn5b_branch2b.TrainedMean,“TrainedVariance”,trainingSetup.bn5b_branch2b.TrainedVariance)]; |
lgraph = addLayers(lgraph,tempLayers); |
tempLayers = [ |
additionLayer(2,“Name”,“res5b”) |
reluLayer(“Name”,“res5b_relu”) |
globalAveragePooling2dLayer(“Name”,“pool5”) |
fullyConnectedLayer(2,“Name”,“fc”) |
softmaxLayer(“Name”,“prob”) |
classificationLayer(“Name”,“classoutput”)]; |
lgraph = addLayers(lgraph,tempLayers); |
% clean up helper variable |
clear tempLayers; |
➄ Connect Layer Branches: |
lgraph = connectLayers(lgraph,“pool1”,“res2a_branch2a”); |
lgraph = connectLayers(lgraph,“pool1”,“res2a/in2”); |
lgraph = connectLayers(lgraph,“bn2a_branch2b”,“res2a/in1”); |
lgraph = connectLayers(lgraph,“res2a_relu”,“res2b_branch2a”); |
lgraph = connectLayers(lgraph,“res2a_relu”,“res2b/in2”); |
lgraph = connectLayers(lgraph,“bn2b_branch2b”,“res2b/in1”); |
lgraph = connectLayers(lgraph,“res2b_relu”,“res3a_branch2a”); |
lgraph = connectLayers(lgraph,“res2b_relu”,“res3a_branch1”); |
lgraph = connectLayers(lgraph,“bn3a_branch2b”,“res3a/in1”); |
lgraph = connectLayers(lgraph,“bn3a_branch1”,“res3a/in2”); |
lgraph = connectLayers(lgraph,“res3a_relu”,“res3b_branch2a”); |
lgraph = connectLayers(lgraph,“res3a_relu”,“res3b/in2”); |
lgraph = connectLayers(lgraph,“bn3b_branch2b”,“res3b/in1”); |
lgraph = connectLayers(lgraph,“res3b_relu”,“res4a_branch2a”); |
lgraph = connectLayers(lgraph,“res3b_relu”,“res4a_branch1”); |
lgraph = connectLayers(lgraph,“bn4a_branch2b”,“res4a/in1”); |
lgraph = connectLayers(lgraph,“bn4a_branch1”,“res4a/in2”); |
lgraph = connectLayers(lgraph,“res4a_relu”,“res4b_branch2a”); |
lgraph = connectLayers(lgraph,“res4a_relu”,“res4b/in2”); |
lgraph = connectLayers(lgraph,“bn4b_branch2b”,“res4b/in1”); |
lgraph = connectLayers(lgraph,“res4b_relu”,“res5a_branch2a”); |
lgraph = connectLayers(lgraph,“res4b_relu”,“res5a_branch1”); |
lgraph = connectLayers(lgraph,“bn5a_branch2b”,“res5a/in1”); |
lgraph = connectLayers(lgraph,“bn5a_branch1”,“res5a/in2”); |
lgraph = connectLayers(lgraph,“res5a_relu”,“res5b_branch2a”); |
lgraph = connectLayers(lgraph,“res5a_relu”,“res5b/in2”); |
lgraph = connectLayers(lgraph,“bn5b_branch2b”,“res5b/in1”); |
➅ Train Network: |
[net, traininfo] = trainNetwork(augimdsTrain,lgraph,opts); |
Additional code |
➆ Grad-CAM: |
label = classify(trainedNetwork_1,Image) |
scoreMap = gradCAM(trainedNetwork_1,Image,label); |
figure |
imshow(Image) |
hold on |
imagesc(scoreMap,‘AlphaData’,0.5) |
colormap jet |
➇ ImageLIME: |
label = classify(trainedNetwork_1,Image) |
scoreMap = imageLIME(trainedNetwork_1,Image,label); |
figure |
imshow(Image) |
hold on |
imagesc(scoreMap,‘AlphaData’,0.5) |
colormap jet |
➈ Occlusion sensitivity: |
label = classify(trainedNetwork_1,Image) |
scoreMap = occlusionSensitivity(trainedNetwork_1,Image,label); |
figure |
imshow(Image) |
hold on |
imagesc(scoreMap,‘AlphaData’,0.5) |
colormap jet |