В этом примере показано, как использовать передачу обучения, чтобы переобучить SqueezeNet, предварительно обученную сверточную нейронную сеть, чтобы классифицировать новый набор изображений. Попробуйте этот пример, чтобы видеть, как простой это должно начать с глубоким обучением в MATLAB®.
Передача обучения обычно используется в применении глубокого обучения. Можно взять предварительно обученную сеть и использовать ее в качестве начальной точки, чтобы изучить новую задачу. Подстройка сети с передачей обучения обычно намного быстрее и легче, чем обучение сети со случайным образом инициализированными весами с нуля. Можно быстро передать изученные функции новой задаче с помощью меньшего числа учебных изображений.
В рабочей области извлеките набор данных MathWorks Merch. Это - небольшой набор данных, содержащий 75 изображений товаров MathWorks, принадлежа пяти различным классам (дно, куб, игра в карты, отвертка и факел).
unzip("MerchData.zip");
Открытый Deep Network Designer.
deepNetworkDesigner
Выберите SqueezeNet из списка предварительно обученных сетей и нажмите Open.
Deep Network Designer отображает уменьшивший масштаб представление целой сети.
Исследуйте сетевой график. Чтобы увеличить масштаб с мышью, используйте колесо Ctrl+scroll. К панорамированию используйте клавиши со стрелками, или удерживайте колесико прокрутки и перетащите мышь. Выберите слой, чтобы просмотреть его свойства. Отмените выбор всех слоев, чтобы просмотреть сетевые сводные данные в панели Свойств.
Чтобы загрузить данные в Deep Network Designer, на вкладке Data, нажимают Import Data> Import Image Data. Диалоговое окно Import Image Data открывается.
В списке Источников данных выберите Folder. Нажмите Browse и выберите извлеченную папку MerchData.
Разделите данные на 70% обучающих данных и 30%-х данных о валидации.
Задайте операции увеличения, чтобы выполнить на учебных изображениях. Увеличение данных помогает препятствовать тому, чтобы сеть сверхсоответствовала и запомнила точные детали учебных изображений. В данном примере примените случайное отражение в оси X, случайное вращение из области значений [-90,90] степени и случайное перемасштабирование из области значений [1,2].
Нажмите Import, чтобы импортировать данные в Deep Network Designer.
Чтобы переобучить SqueezeNet, чтобы классифицировать новые изображения, замените последний 2D сверточный слой и итоговый слой классификации сети. В SqueezeNet эти слои имеют имена 'conv10'
и 'ClassificationLayer_predictions'
, соответственно.
На панели Разработчика перетащите новый convolution2dLayer
на холст. Чтобы совпадать с исходным сверточным слоем, установите FilterSize
к 1,1
. Отредактируйте NumFilters
быть количеством классов в новых данных, в этом примере, 5
.
Измените скорости обучения так, чтобы изучение было быстрее в новом слое, чем в переданных слоях установкой WeightLearnRateFactor
и BiasLearnRateFactor
к 10
.
Удалите последний 2D сверточный слой и соедините свой новый слой вместо этого.
Замените выходной слой. Прокрутите в конец Библиотеки Слоя и перетащите новый classificationLayer
на холст. Удалите исходный выходной слой и соедините свой новый слой в его месте.
Чтобы выбрать опции обучения, выберите вкладку Training и нажмите Training Options. Установите начальную букву, изучают уровень маленькому значению, чтобы замедлить изучение в переданных слоях. На предыдущем шаге вы увеличили факторы скорости обучения для 2D сверточного слоя, чтобы ускорить изучение в новых последних слоях. Эта комбинация настроек скорости обучения приводит к быстрому изучению только в новых слоях и более медленном изучении в других слоях.
В данном примере установите InitialLearnRate на 0.0001
, ValidationFrequency к 5
, MaxEpochs к 8
. Как существует 55 наблюдений, установите MiniBatchSize на 11
разделить обучающие данные равномерно и гарантировать целый набор обучающих данных используются в течение каждой эпохи.
Чтобы обучить сеть с заданными опциями обучения, нажмите Close и затем нажмите Train.
Deep Network Designer позволяет вам визуализировать и контролировать процесс обучения. Можно затем отредактировать опции обучения и переобучить сеть при необходимости.
Чтобы экспортировать результаты обучения, на вкладке Training, выбирают Export> Export Trained Network и Results. Deep Network Designer экспортирует обучивший сеть как переменную trainedNetwork_1
и учебная информация как переменная trainInfoStruct_1
.
Можно также сгенерировать код MATLAB, который воссоздает сеть и используемые опции обучения. На вкладке Training выберите Export> Generate Code for Training. Исследуйте код MATLAB, чтобы изучить, как программно подготовить данные к обучению, создать сетевую архитектуру и обучить сеть.
Загрузите новое изображение, чтобы классифицировать использование обучившего сеть.
I = imread("MerchDataTest.jpg");
Измените размер тестового изображения, чтобы совпадать с сетевым входным размером.
I = imresize(I, [227 227]);
Классифицируйте тестовое изображение с помощью обучившего сеть.
[YPred,probs] = classify(trainedNetwork_1,I); imshow(I) label = YPred; title(string(label) + ", " + num2str(100*max(probs),3) + "%");
[1] ImageNet. http://www.image-net.org
[2] Iandola, Форрест Н., ханьцы Песни, Метью В. Москевич, Халид Ашраф, Уильям Дж. Далли и Курт Койцер. "SqueezeNet: точность AlexNet-уровня с 50x меньше параметров и <размер модели на 0,5 Мбайта". Предварительно распечатайте, представленный 4 ноября 2016. https://arxiv.org/abs/1602.07360.
[3] Iandola, Форрест Н. "SqueezeNet". https://github.com/forresti/SqueezeNet.
trainNetwork
| trainingOptions
| squeezenet
| Deep Network Designer