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

Этот пример показывает, как использовать передачу, учащуюся переобучать 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

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

| |

Похожие темы