Этот пример показывает, как использовать передачу, учащуюся переобучать 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 категорий объектов (таких как клавиатура, кофейная кружка, карандаш и многие животные). Сеть изучила богатые представления функции для широкого спектра изображений. Сеть берет изображение в качестве входа и выводит метку для объекта в изображении вместе с вероятностями для каждой из категорий объектов. Чтобы использовать обучение с переносом с помощью различных предварительно обученных сетей, смотрите Нейронную сеть для глубокого обучения Train, чтобы Классифицировать Новые Изображения.
net = resnet18;
Чтобы переобучить ResNet-18, чтобы классифицировать новые изображения, замените последний полносвязный слой и итоговый слой классификации сети. В ResNet-18 эти слои имеют имена 'fc1000'
и 'ClassificationLayer_predictions'
, repectively. Установите новый полносвязный слой иметь тот же размер как количество классов в новом наборе данных (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
Чтобы использовать обучение с переносом с помощью различных предварительно обученных сетей, смотрите Нейронную сеть для глубокого обучения Train, чтобы Классифицировать Новые Изображения. Чтобы попробовать изучение передачи с помощью приложения Deep Network Designer, смотрите, что Передача Учится с Deep Network Designer. Для списка и сравнения предварительно обученных сетей, смотрите Предварительно обученные Глубокие нейронные сети.
[1] Krizhevsky, Алекс, Илья Сутскевер и Джеффри Э. Хинтон. "Классификация ImageNet с Глубокими Сверточными Нейронными сетями". Усовершенствования в нейронных системах обработки информации. 2012.
[2] Модель BVLC AlexNet. https://github.com/BVLC/caffe/tree/master/models/bvlc_alexnet
alexnet
| trainNetwork
| trainingOptions