-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSingleCNN10foldsGradCAM.m
More file actions
172 lines (145 loc) · 5.49 KB
/
Copy pathSingleCNN10foldsGradCAM.m
File metadata and controls
172 lines (145 loc) · 5.49 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
function [Info, gadfFeatures, vLossGADF, scoreMaps, imageMaps, labelMaps] = SingleCNN10foldsGradCAM(dataset, Neural, numClasses, SIZE, ENVIRONMENT, tFilesGADF, vFilesGADF, ME)
folds = 10;
%%
%Informações das CNN
infoResNet50GADF = cell(1,folds);
scoreMaps = cell(1,10);
imageMaps = cell(1,10);
labelMaps = cell(1,10);
%%
%Hiper Parâmetros
MiniBatch = 32;
ILR = 0.01;
LRDP = 2;
LRDF = 0.75;
L2R = 0.0001;
%ME = 10;
%%
%Probabilidades Softmax
gadfFeatures = cell(1, folds);
Info = cell(1, 1);
%%
%Matrizes de confusão
ConfusionMatricesGADF = cell(1, folds);
%imageAugmenter = imageDataAugmenter('RandRotation',[0,360], 'RandXReflection', true, 'RandYReflection', true);
%%
%Principal
for i = 1:folds
%Ler folds a partir dos arquivos
imdsValidationGADF = vFilesGADF{1, i};
imdsTrainGADF = tFilesGADF{1, i};
%Número de amostras de treinamento
trainingSamples = countEachLabel(imdsTrainGADF);
trainingSamples = table2cell(trainingSamples);
t_num = 0;
for j = 1:numClasses
t_num = t_num + trainingSamples{j,2};
end
%Número de amostras de validação
validationSamples = countEachLabel(imdsValidationGADF); %Number of validation samples
validationSamples = table2cell(validationSamples);
v_num = 0;
for j = 1:numClasses
v_num = v_num + validationSamples{j,2};
end
scoreMapList = cell(1, v_num);
imageMapList = cell(1, v_num);
labelList = cell(1,v_num);
%Matriz de confusão base (100% True)
confusionTrue = zeros(1, v_num);
for j = 1:v_num
str = imdsValidationGADF.Files{j, 1};
if dataset==1 %CR
if contains(str, 'Benign')
confusionTrue(1, j) = 1;
else
confusionTrue(1, j) = 2;
end
elseif dataset==2 %LA
if contains (str, '\1\')
confusionTrue(1, j) = 1;
elseif contains (str, '\2\')
confusionTrue(1, j) = 2;
elseif contains (str, '\3\')
confusionTrue(1, j) = 3;
else
confusionTrue(1, j) = 4;
end
elseif dataset==3 %LG
if contains(str, '\1\')
confusionTrue(1, j) = 1;
else
confusionTrue(1, j) = 2;
end
elseif dataset==4 %NHL
if contains(str, '\CLL\')
confusionTrue(1, j) = 1;
elseif contains(str, '\FL\')
confusionTrue(1, j) = 2;
else
confusionTrue(1, j) = 3;
end
elseif dataset==5 %UCSB
if contains(str, '\Benign\')
confusionTrue(1, j) = 1;
else
confusionTrue(1, j) = 2;
end
elseif dataset==6 %DIS
if contains (str, 'Healthy')
confusionTrue(1, j) = 1;
elseif contains (str, 'Mild')
confusionTrue(1, j) = 2;
elseif contains (str, 'Moderate')
confusionTrue(1, j) = 3;
else
confusionTrue(1, j) = 4;
end
end
end
%Matrizes de confusão das predições
confusionPredGADF = zeros(1, v_num);
%Ajustar tamanho das imagens para input da CNN
trainResizeGADF = augmentedImageDatastore(SIZE, imdsTrainGADF);%, 'DataAugmentation', imageAugmenter);
validationResizeGADF = augmentedImageDatastore(SIZE, imdsValidationGADF);
%Configuração da CNN
optionsGADF = trainingOptions('sgdm', 'MiniBatchSize',MiniBatch, 'MaxEpochs',ME, 'InitialLearnRate',ILR, 'LearnRateSchedule','piecewise', 'LearnRateDropPeriod', LRDP, 'LearnRateDropFactor', LRDF, 'Shuffle','every-epoch', 'ValidationData',validationResizeGADF, 'ValidationFrequency',10, 'Verbose',false, 'Plots','none', 'ExecutionEnvironment',ENVIRONMENT, 'L2Regularization', L2R);
%Now this is where the fun begins
tic
try
[netGADF, infoResNet50GADF{1,i}] = trainNetwork(trainResizeGADF,Neural,optionsGADF);
catch
warning('Problem using GPU. Trying CPU this iteration');
options = trainingOptions('sgdm', 'MiniBatchSize',MiniBatch, 'MaxEpochs',ME, 'InitialLearnRate',ILR, 'LearnRateSchedule','piecewise', 'LearnRateDropPeriod', LRDP, 'LearnRateDropFactor', LRDF, 'Shuffle','every-epoch', 'ValidationData',validationResizeGADF, 'ValidationFrequency',10, 'Verbose',false, 'Plots','none', 'ExecutionEnvironment','cpu', 'L2Regularization', L2R);
[netGADF, infoResNet50GADF{1,i}] = trainNetwork(trainResizeGADF,Neural,options);
end
%ScoreMap
ims = validationResizeGADF.read();
nMaps = size(ims, 1);
for j = 1:nMaps
X = ims.input{j,1};
label = classify(netGADF, X);
scoreMapList{1,j} = gradCAM(netGADF, X, label);
labelList{1,j} = label;
imageMapList{1,j} = X;
end
scoreMaps{1,i} = scoreMapList;
imageMaps{1,i} = imageMapList;
labelMaps{1,i} = labelList;
%Obter probabilidades da camada Softmax
featuresTestSoftmaxGADF = activations(netGADF,validationResizeGADF,'softmax','OutputAs','rows');
%Verificar número de acertos
for j = 1:v_num
[M, ICNNGADF] = max(featuresTestSoftmaxGADF(j, :));
confusionPredGADF(1, j) = ICNNGADF;
end
ConfusionMatricesGADF{1, i} = confusionmat(confusionTrue, confusionPredGADF);
gadfFeatures{1, i} = featuresTestSoftmaxGADF;
toc
end
Info{1, 1} = ConfusionMatricesGADF;
vLossGADF = 0;
for i = 1:folds
vLossGADF = vLossGADF + infoResNet50GADF{1, i}.ValidationLoss(end);
end
end