| 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 |