2016-12-08 10 views
2

Я использую пример, который я получил из веб-семинара. это код: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

, и она работала хорошо с моими изображениями. Итак, я не понимаю, что не так с моей тонкой настройкой. Благодарю.

+0

Вы нормализуете данные? –

+0

Да, слой ввода делает это сам, поскольку вы можете видеть по ссылке –

ответ