我正尝试将VGG19与Matlab一起进行性别识别(基于非人类灵长类动物的面部图像)。我有5,000张训练图像(1,500位女性和3,500位男性),并且我需要预测4,000张测试图像的性别(我知道是所有女性,实际上我对分类得分很感兴趣),我还将其用于验证每个20次迭代(以了解发生了什么)。
网络学习得也很好,并且达到了迷你批次精度的100%。在VGG的两个辍学阶段中,将辍学率设置为0.7而不是0.5,不会有任何改变。好啊,为什么不。但是,测试图像是随机分配的(50个周期后约占50%)。奇怪的是,在训练开始时,测试图像的准确性在20%到80%之间波动。仅将20%的图像分配给女性(再次全部代表女性)是不可能偶然发生的,因此我最初认为这是因为这两个培训课程可以在多个维度上划分(不仅是女性与男性)。但是,为什么在多个时期之后,验证(=测试)的准确性会稳定在50%左右呢?我不明白发生了什么。这是训练监控的样子 (PS:net之前已经使用相同的参数进行了预训练,这说明了为什么小批量精度在第一次迭代时就已经达到90%)
这是代码:
% Data augmentation
pixelRange = [-10 10];
rotRange = [-10 10];
scaleRange = [0.8 1.1];
% Network parameters
miniBatchSize = 42 %max that my GPU can take;
maxEpochs = 100;
initialLearnRate = 1e-3;
validationFrequency = 20;
% Load dataset
imdsLearning = imageDatastore(fullfile(sprintf(learningdata)),...
'IncludeSubfolders',true,'LabelSource','foldernames');
imdsTesting = imageDatastore(fullfile(sprintf(testingdata)),...
'IncludeSubfolders',true,'LabelSource','foldernames');
load net.mat
inputSize = net.Layers(1).InputSize;
imageAugmenter = imageDataAugmenter( ...
'RandXReflection',true, ...
'RandXTranslation',pixelRange, ...
'RandRotation',rotRange, ...
'RandYTranslation',pixelRange, ...
'RandScale',scaleRange);
augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsLearning, ...
'DataAugmentation',imageAugmenter);
augimdsTesting = augmentedImageDatastore(inputSize(1:2),imdsTesting);
options = trainingOptions('sgdm', ...
'ExecutionEnvironment','gpu', ...
'MiniBatchSize',miniBatchSize, ...
'MaxEpochs',maxEpochs, ...
'Shuffle','every-epoch' ,...
'InitialLearnRate',initialLearnRate, ...
'ValidationData',augimdsTesting, ...
'ValidationFrequency',validationFrequency, ...
'ValidationPatience',Inf, ...
'Verbose',true, ...
'Plots','training-progress', ...
'OutputFcn',@(info)stopIfAccuracyLevelReached(info,80));
net2 = trainNetwork(augimdsTrain,net.Layers,options);