Запуск с изучением передачи

В этом примере показано, как использовать передачу, учащуюся переобучать ResNet-18, предварительно обученную сверточную нейронную сеть, чтобы классифицировать новый набор изображений. Попробуйте этот пример, чтобы видеть, как простой это должно начать с глубоким обучением в MATLAB®.

Изучение передачи обычно используется в применении глубокого обучения. Можно взять предварительно обученную сеть и использовать ее в качестве начальной точки, чтобы изучить новую задачу. Подстройка сети с передачей, учащейся, обычно намного быстрее и легче, чем обучение сети со случайным образом инициализированными весами с нуля. Можно быстро передать изученные функции новой задаче с помощью меньшего числа учебных изображений.

Загрузка данных

Разархивируйте и загрузите новые изображения как datastore изображений. Разделите данные на наборы данных обучения и валидации. Используйте 70% изображений для обучения и 30% для валидации.

unzip('MerchData.zip');
imds = imageDatastore('MerchData','IncludeSubfolders',true,'LabelSource','foldernames');
[imdsTrain,imdsValidation] = splitEachLabel(imds,0.7,'randomized');

Загрузите предварительно обученную сеть

Загрузите предварительно обученную сеть ResNet-18. Если Модель Deep Learning Toolbox™ для Сети ResNet-18 не установлена, то программное обеспечение обеспечивает ссылку на загрузку. ResNet-18 был обучен на более чем миллионе изображений и может классифицировать изображения в 1 000 категорий объектов (таких как клавиатура, кофейная кружка, карандаш и многие животные). Сеть изучила богатые представления функции для широкого спектра изображений. Сеть берет изображение в качестве входа и выводит метку для объекта в изображении вместе с вероятностями для каждой из категорий объектов. Чтобы использовать обучение с переносом с помощью различных предварительно обученных сетей, смотрите, Обучают Нейронную сеть для глубокого обучения Классифицировать Новые Изображения.

net = resnet18;

Замените последние слои

Чтобы переобучить ResNet-18, чтобы классифицировать новые изображения, замените последний полносвязный слой и итоговый слой классификации сети. В ResNet-18 эти слои имеют имена 'fc1000' и 'ClassificationLayer_predictions', соответственно. Установите новый полносвязный слой иметь тот же размер как количество классов в новом наборе данных (5 в этом примере). Чтобы учиться быстрее в новых слоях, чем в переданных слоях, увеличьте факторы темпа обучения полносвязного слоя.

numClasses = numel(categories(imdsTrain.Labels));
lgraph = layerGraph(net);

newFCLayer = fullyConnectedLayer(numClasses,'Name','new_fc','WeightLearnRateFactor',10,'BiasLearnRateFactor',10);
lgraph = replaceLayer(lgraph,'fc1000',newFCLayer);

newClassLayer = classificationLayer('Name','new_classoutput');
lgraph = replaceLayer(lgraph,'ClassificationLayer_predictions',newClassLayer);

Обучение сети

Сеть требует входных изображений размера 224 224 3, но изображения в datastore изображений имеют различные размеры. Используйте увеличенный datastore изображений, чтобы автоматически изменить размер учебных изображений. Можно также использовать imageDataAugmenter задавать дополнительные операции увеличения, чтобы выполнить на обучении отображает, чтобы помочь препятствовать тому, чтобы сеть сверхсоответствовала.

inputSize = net.Layers(1).InputSize;
augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain);
augimdsValidation = augmentedImageDatastore(inputSize(1:2),imdsValidation);

Задайте опции обучения, включая мини-пакетный размер и данные о валидации. Установите InitialLearnRate к маленькому значению, чтобы замедлить изучение в переданных слоях. На предыдущем шаге вы увеличили факторы темпа обучения для полносвязного слоя, чтобы ускорить изучение в новых последних слоях. Эта комбинация настроек темпа обучения приводит к быстрому изучению только в новых слоях и более медленном изучении в других слоях.

options = trainingOptions('sgdm', ...
    'MiniBatchSize',10, ...
    'MaxEpochs',8, ...
    'InitialLearnRate',1e-4, ...
    'Shuffle','every-epoch', ...
    'ValidationData',augimdsValidation, ...
    'ValidationFrequency',5, ...
    'Verbose',false, ...
    'Plots','training-progress');

Обучите сеть с помощью обучающих данных. По умолчанию, trainNetwork использует графический процессор, если вы доступны (требует Parallel Computing Toolbox™, и CUDA® включил графический процессор с, вычисляют возможность 3.0 или выше). В противном случае это использует центральный процессор.

trainedNet = trainNetwork(augimdsTrain,lgraph,options);

Классифицируйте изображения валидации

Классифицируйте изображения валидации с помощью подстроенной сети и вычислите точность классификации.

YPred = classify(trainedNet,augimdsValidation);
accuracy = mean(YPred == imdsValidation.Labels)
accuracy = 1

Узнать больше

Чтобы использовать обучение с переносом с помощью различных предварительно обученных сетей, смотрите, Обучают Нейронную сеть для глубокого обучения Классифицировать Новые Изображения. Чтобы попробовать изучение передачи с помощью приложения Deep Network Designer, смотрите, что Передача Учится с Deep Network Designer. Для списка и сравнения предварительно обученных сетей, смотрите Предварительно обученные Глубокие нейронные сети.

Ссылки

[1] Krizhevsky, Алекс, Илья Сутскевер и Джеффри Э. Хинтон. "Классификация ImageNet с Глубокими Сверточными нейронными сетями". Усовершенствования в нейронных системах обработки информации. 2012.

[2] Модель BVLC AlexNet. https://github.com/BVLC/caffe/tree/master/models/bvlc_alexnet

Смотрите также

| |

Похожие темы