Я использую пример, который я получил из веб-семинара. это код:Matlab Сверторная нейронная сеть не изучается
%% Fine Tuning A Deep Neural Network
clear; clc;close all;
imagenet_cnn = load('imagenet-cnn');
net = imagenet_cnn.convnet;
net.Layers
%% Perform net surgery
layers = net.Layers(1:end-3);
layers(end+1) = fullyConnectedLayer(12, 'Name', 'fc8_2')
layers(end+1) = softmaxLayer('Name','prob_2');
layers(end+1) = classificationLayer('Name','classificationLayer_2')
%% Setup learning rates for fine-tuning
% fc 8 - bump up learning rate for last layers
layers(end-2).WeightLearnRateFactor = 100;
layers(end-2).WeightL2Factor = 1;
layers(end-2).BiasLearnRateFactor = 20;
layers(end-2).BiasL2Factor = 0;
%% Load Image Data
rootFolder = fullfile('E:\Universidad\Tesis\Matlab', 'TesisDataBase');
categories = {'Avion','Banana','Carro','Gato', 'Mango','Perro','Sandia','Tijeras','Silla','Mouse','Calculadora','Arbol'};
imds = imageDatastore(fullfile(rootFolder, categories), 'LabelSource', 'foldernames');
tbl = countEachLabel(imds);
%% Equalize number of images of each class in training set
minSetCount = min(tbl{:,2}); % determine the smallest amount of images in a category
% Use splitEachLabel method to trim the set.
imds = splitEachLabel(imds, minSetCount);
% Notice that each set now has exactly the same number of images.
countEachLabel(imds)
[trainingDS, testDS] = splitEachLabel(imds, 0.7,'randomize');
% Convert labels to categoricals
trainingDS.Labels = categorical(trainingDS.Labels);
trainingDS.ReadFcn = @readFunctionTrain;
%% Setup test data for validation
testDS.Labels = categorical(testDS.Labels);
testDS.ReadFcn = @readFunctionValidation;
%% Fine-tune the Network
miniBatchSize = 32; % lower this if your GPU runs out of memory.
numImages = numel(trainingDS.Files);
numIterationsPerEpoch = 250;
maxEpochs = 62;
lr = 0.01;
opts = trainingOptions('sgdm', ...
'InitialLearnRate', lr,...
'LearnRateSchedule', 'none',...
'L2Regularization', 0.0005, ...
'MaxEpochs', maxEpochs, ...
'MiniBatchSize', miniBatchSize);
net = trainNetwork(trainingDS, layers, opts);
Как вы можете увидеть этот код, использует хорошо известный AlexNet как первый старт, то последние 3 слоя удаляются, для того, чтобы поставить 3 новые слои с числом нейронов необходимых для новой задачи.
чтения FUNC для тестирования и обучения такие же, здесь у вас есть один из них:
function Iout = readFunctionTrain(filename)
% Resize the flowers images to the size required by the network.
I = imread(filename);
% Some images may be grayscale. Replicate the image 3 times to
% create an RGB image.
if ismatrix(I)
I = cat(3,I,I,I);
end
% Resize the image as required for the CNN.
Iout = imresize(I, [227 227]);
этот код хорошо работает на вебинаре, они используют его для классификации автомобилей и подводных лодок, которые проходят через дверь matworks ,
Проблема заключается в том, что новая сеть не учится, когда я пытаюсь использовать ее с собственными изображениями, у меня есть набор данных из 12 категорий, каждый из которых имеет 1000 изображений более или менее, все эти изображения, загружаемые из ImageNET.
Сеть не увеличивает свою точность мини-партии, фактически несколько раз она делает это очень медленно.
Я также сделал учебник этой страницы Matlab Deep Learning ToolBox
, и она работала хорошо с моими изображениями. Итак, я не понимаю, что не так с моей тонкой настройкой. Благодарю.
Вы нормализуете данные? –
Да, слой ввода делает это сам, поскольку вы можете видеть по ссылке –