Я пытаюсь перенести VGG19 с Matlab для распознавания пола (на основе изображений лиц примата, не являющегося человеком).У меня есть 5000 тренировочных изображений (1500 женщин и 3500 мужчин), и мне нужно предсказать пол для 4000 тестовых изображений (которые, как я знаю, являются ВСЕМИ женщинами - на самом деле меня интересуют результаты классификации), которые я также использую для проверки, каждый20 итераций (чтобы понять, что происходит).
Сеть хорошо учится, слишком хорошо ... и достигает 100% для точности мини-партии.Установите коэффициент отсева 0,7, а не 0,5, в двух слоях отсева VGG ничего не изменится.Хорошо Почему бы и нет.Однако тестовые изображения назначаются случайным образом (примерно 50% после 50 эпох).Как ни странно, в начале обучения точность тестовых изображений колеблется от 20% до 80%.Назначение только 20% изображений женщинам (опять же, которые все представляют женщин) не может произойти случайно, поэтому я изначально думал, что это потому, что два учебных класса можно разделить по нескольким измерениям (не только женщины против мужчин).Но тогда почему после нескольких эпох точность проверки (= теста) стабилизировалась бы около 50%?Я не понимаю, что происходит.Вот как выглядит мониторинг обучения (PS: сеть уже прошла предварительную подготовку за одну эпоху, используя те же параметры, объясняя, почему точность мини-пакета уже составляет 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);