Колебание точности классификации тестовых изображений - VGG - передача обучения - PullRequest
0 голосов
/ 27 марта 2019

Я пытаюсь перенести VGG19 с Matlab для распознавания пола (на основе изображений лиц примата, не являющегося человеком).У меня есть 5000 тренировочных изображений (1500 женщин и 3500 мужчин), и мне нужно предсказать пол для 4000 тестовых изображений (которые, как я знаю, являются ВСЕМИ женщинами - на самом деле меня интересуют результаты классификации), которые я также использую для проверки, каждый20 итераций (чтобы понять, что происходит).

Сеть хорошо учится, слишком хорошо ... и достигает 100% для точности мини-партии.Установите коэффициент отсева 0,7, а не 0,5, в двух слоях отсева VGG ничего не изменится.Хорошо Почему бы и нет.Однако тестовые изображения назначаются случайным образом (примерно 50% после 50 эпох).Как ни странно, в начале обучения точность тестовых изображений колеблется от 20% до 80%.Назначение только 20% изображений женщинам (опять же, которые все представляют женщин) не может произойти случайно, поэтому я изначально думал, что это потому, что два учебных класса можно разделить по нескольким измерениям (не только женщины против мужчин).Но тогда почему после нескольких эпох точность проверки (= теста) стабилизировалась бы около 50%?Я не понимаю, что происходит.Вот как выглядит мониторинг обучения (PS: сеть уже прошла предварительную подготовку за одну эпоху, используя те же параметры, объясняя, почему точность мини-пакета уже составляет 90% на первой итерации)

enter image description here

и вот код:

% 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...