Этот пример показывает, как использовать передачу обучения для переобучения SqueezeNet, предварительно обученной сверточной нейронной сети, чтобы классифицировать новый набор изображений. Попробуйте этот пример, чтобы увидеть, насколько просто начать глубокое обучение в MATLAB ®.
Передача обучения обычно используется в применениях глубокого обучения. Можно взять предварительно обученную сеть и использовать ее как начальная точка для изучения новой задачи. Подстройка сети с передачей обучения обычно намного быстрее и проще, чем обучение сети со случайным образом инициализированными весами с нуля. Можно быстро перенести выученные функции в новую задачу с помощью меньшего количества обучающих изображений.
В рабочей области извлеките набор данных MathWorks Merch. Это небольшой набор данных, содержащий 75 изображений товаров MathWorks, принадлежащих пяти различным классам (прописная буква, cube, игральные карты, отвертка и факел).
unzip("MerchData.zip");
Откройте Deep Network Designer.
deepNetworkDesigner
Выберите SqueezeNet из списка предварительно обученных сетей и нажмите кнопку Открыть.
Deep Network Designer отображает представление масштабирования всей сети.
Исследуйте сетевой график. Для масштабирования мышью используйте колесо прокрутки Ctrl +. Для панорамирования используйте клавиши со стрелами или удерживайте за колесо прокрутки и перетащите мышь. Выберите слой для просмотра его свойств. Отмените выбор всех слоев, чтобы просмотреть сводные данные по сети на панели свойств.
Чтобы загрузить данные в Deep Network Designer, на вкладке Data, выберите Import Data > Import Image Data. Откроется диалоговое окно Импорт изображений (Import Image Data).
В списке Источник данных выберите Папка. Нажмите кнопку Обзор и выберите извлеченную папку MerchData.
Разделите данные на 70% обучающих данных и 30% валидационных данных.
Задайте операции увеличения для выполнения с обучающими изображениями. Увеличение количества данных помогает предотвратить сверхподбор кривой сети и запоминание точных деталей обучающих изображений. В этом примере примените случайное отражение в оси X, случайное вращение из области значений [ -90,90 ] степеней и случайное перемасштабирование из области значений [1,2].
Щелкните Импорт, чтобы импортировать данные в Deep Network Designer.
Чтобы переобучить SqueezeNet для классификации новых изображений, замените последний 2-D сверточный слой и конечный классификационный слой сети. В SqueezeNet эти слои имеют имена 'conv10'
и 'ClassificationLayer_predictions'
, соответственно.
На панели Designer перетащите мышью новую convolution2dLayer
на холст. Чтобы соответствовать исходному сверточному слою, задайте FilterSize
на 1,1
. Редактирование NumFilters
количество классов в новых данных, в данном примере 5
.
Измените скорости обучения так, чтобы обучение было быстрее в новом слое, чем в переданных слоях, путем установки WeightLearnRateFactor
и BiasLearnRateFactor
на 10
.
Удалите последний 2-D сверточный слой и соедините вместо этого новый слой.
Замените слой выхода. Прокрутка до конца библиотеки слоев и перетаскивание нового classificationLayer
на холст. Удалите исходный выходной слой и соедините ваш новый слой вместо него.
Чтобы выбрать опции обучения, перейдите на вкладку Обучение и нажмите Опции обучения. Установите начальную скорость обучения на небольшое значение, чтобы замедлить обучение в перенесенных слоях. На предыдущем шаге вы увеличили коэффициенты скорости обучения для 2-D сверточного слоя, чтобы ускорить обучение в новых конечных слоях. Эта комбинация настроек скорости обучения приводит к быстрому обучению только в новых слоях и более медленному обучению в других слоях.
В данном примере установите InitialLearnRate на 0.0001
, ValidationFrequency для 5
, MaxEpochs для 8
. Поскольку наблюдений 55, установите значение MiniBatchSize 11
чтобы разделить обучающие данные равномерно и убедиться, что весь набор обучающих данных используется в каждую эпоху.
Чтобы обучить сеть с заданными опциями обучения, нажмите кнопку Закрыть и затем щелкните Обучить.
Deep Network Designer позволяет вам визуализировать и контролировать процесс обучения. Затем можно отредактировать опции обучения и при необходимости переобучить сеть.
Чтобы экспортировать результаты из обучения, на вкладке Обучение выберите Экспорт > Экспорт обученной сети и результатов. Deep Network Designer экспортирует обученную сеть как переменную trainedNetwork_1
и обучающую информацию как переменную trainInfoStruct_1
.
Можно также сгенерировать код MATLAB, который воссоздает сеть и используемые опции обучения. На вкладке Обучение выберите Экспорт > Сгенерировать код для обучения. Исследуйте код 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, Forrest N., Song Han, Matthew W. Moskewicz, Khalid Ashraf, William J. Dally, and Kurt Keutzer. SqueezeNet: точность уровня AlexNet с 50-кратным меньшим количеством параметров и размером модели < 0,5 МБ ". Препринт, представленный 4 ноября 2016 года. https://arxiv.org/abs/1602.07360 .
[3] Иандола, Форрест Н. «SqueezeNet». https://github.com/forresti/SqueezeNet.
Deep Network Designer | squeezenet
| trainingOptions
| trainNetwork