В этом примере показано, как использовать обучение с переносом в интерактивном режиме с помощью приложения Deep Network Designer.
Передача обучения является процессом взятия предварительно обученной нейронной сети для глубокого обучения и подстройки его, чтобы изучить новую задачу. Используя передачу обучения обычно быстрее и легче, чем обучение сети с нуля. Можно быстро передать изученные функции новой задаче с помощью меньшего объема данных.
Используйте Deep Network Designer, чтобы использовать обучение с переносом для классификации изображений путем выполнения этих шагов:
Откройте приложение Deep Network Designer и выберите предварительно обученную сеть.
Импортируйте новый набор данных.
Замените последние слои на новые слои, адаптированные к новому набору данных.
Установите скорости обучения так, чтобы изучение было быстрее в новых слоях, чем в переданных слоях.
Обучите сеть с помощью Deep Network Designer или экспортируйте сеть для обучения в командной строке.
В рабочей области извлеките набор данных MathWorks Merch. Это - небольшой набор данных, содержащий 75 изображений товаров MathWorks, принадлежа пяти различным классам (дно, куб, игра в карты, отвертка и факел).
unzip("MerchData.zip");
Чтобы открыть Deep Network Designer, на вкладке Apps, под Машинным обучением и Глубоким обучением, кликают по значку приложения. В качестве альтернативы можно открыть приложение из командной строки:
deepNetworkDesigner
Deep Network Designer обеспечивает выбор предварительно обученных сетей классификации изображений, которые изучили богатые представления функции, подходящие для широкого спектра изображений. Передача обучения работает лучше всего, если ваши изображения похожи на изображения, первоначально раньше обучал сеть. Если ваши учебные изображения являются естественными изображениями как те в базе данных ImageNet, то любая из предварительно обученных сетей подходит. Для списка доступных сетей и как сравнить их, смотрите Предварительно обученные Глубокие нейронные сети.
Если ваши данные очень отличаются от данных ImageNet — например, если вы имеете крошечные изображения, спектрограммы, или не отображаете данные — обучение новой сети может быть лучше. Для примера, показывающего, как обучить сеть с помощью данных неизображений, смотрите, Создают Простую Сеть Классификации Последовательностей Используя Deep Network Designer.
SqueezeNet не требует дополнительного пакета поддержки. Для других предварительно обученных сетей, если у вас нет необходимого пакета поддержки установленным, затем приложение предоставляет возможность Установки.
Выберите SqueezeNet из списка предварительно обученных сетей и нажмите Open.
Deep Network Designer отображает уменьшивший масштаб представление целой сети в панели Разработчика.
Исследуйте сетевой график. Чтобы увеличить масштаб с мышью, используйте колесо Ctrl+scroll. К панорамированию используйте клавиши со стрелками, или удерживайте колесико прокрутки и перетащите мышь. Выберите слой, чтобы просмотреть его свойства. Отмените выбор всех слоев, чтобы просмотреть сетевые сводные данные в панели Свойств.
Чтобы загрузить данные в Deep Network Designer, на вкладке Data, нажимают Import Data. Диалоговое окно Import Data открывается.
В списке Источников данных выберите Folder. Нажмите Browse и выберите извлеченную папку MerchData.
Можно принять решение применить увеличение изображений к обучающим данным. Приложение Deep Network Designer предоставляет следующие возможности увеличения:
Случайное отражение в оси X
Случайное отражение в оси Y
Случайное вращение
Случайное перемасштабирование
Случайный горизонтальный перевод
Случайный вертикальный перевод
Можно эффективно увеличить сумму обучающих данных путем применения рандомизированного увеличения к данным. Увеличение также позволяет вам обучить нейронные сети, чтобы быть инвариантными к искажениям в данных изображения. Например, можно добавить рандомизированные вращения, чтобы ввести изображения так, чтобы сеть была инвариантной к присутствию вращения во входных изображениях.
В данном примере примените случайное отражение в оси X, случайное вращение из области значений [-90,90] степени и случайное перемасштабирование из области значений [1,2].
Можно также принять решение импортировать данные о валидации или путем разделения его от обучающих данных, или путем импорта его из другого источника. Валидация оценивает производительность модели на новых данных по сравнению с обучающими данными и помогает вам контролировать производительность и защитить от сверхподбора кривой.
В данном примере используйте 30% изображений для валидации.
Нажмите Import, чтобы импортировать данные в Deep Network Designer.
Используя Deep Network Designer, можно визуально смотреть распределение данных об обучении и валидации в панели Данных. Вы видите, что в этом примере существует пять классов в наборе данных.
Отредактируйте сеть в панели Разработчика, чтобы задать новое количество классов в ваших данных. Чтобы подготовить сеть к передаче обучения, замените последний learnable слой и итоговый слой классификации.
Чтобы использовать предварительно обученную сеть в передаче обучения, необходимо изменить количество классов, чтобы совпадать новым набором данных. Во-первых, найдите последний learnable слой в сети. Для SqueezeNet последний learnable слой является последним сверточным слоем, 'conv10
'. В этом случае замените сверточный слой на новый сверточный слой с количеством фильтров, равных количеству классов.
Перетащите новый convolutional2dLayer
на холст. Чтобы совпадать с исходным сверточным слоем, установите FilterSize
к 1,1
.
NumFilters
свойство задает количество классов для проблем классификации. Измените NumFilters
к количеству классов в новых данных, в этом примере, 5
.
Измените скорости обучения так, чтобы изучение было быстрее в новом слое, чем в переданных слоях путем установки, устанавливает WeightLearnRateFactor
и BiasLearnRateFactor
к 10.
Удалите последний 2D сверточный слой и соедините свой новый слой вместо этого.
Для передачи обучения необходимо заменить выходной слой. Прокрутите в конец Библиотеки Слоя и перетащите новый classificationLayer
на холст. Удалите исходный output
слой и подключение ваш новый слой в его месте.
Для нового выходного слоя вы не должны устанавливать OutputSize
. В учебное время Deep Network Designer автоматически устанавливает выходные классы слоя из данных.
Чтобы проверять, что сеть готова к обучению, нажмите Analyze. Если Нейронная сеть для глубокого обучения нулевые ошибки отчетов Анализатора, то отредактированная сеть готова к обучению.
Приложение Deep Network Designer позволяет вам обучить сети классификации изображений, импортированные или созданные в приложении. Для других типов данных можно создать сеть в Deep Network Designer и затем экспортировать сеть для обучения. Для примера показа, как использовать Deep Network Designer, чтобы создать сеть последовательности и затем экспортировать результаты для обучения, смотрите, Создают Простую Сеть Классификации Последовательностей Используя Deep Network Designer.
Чтобы обучить сеть с настройками по умолчанию, на вкладке Training, нажимают Train. Опции обучения по умолчанию лучше подходят для больших наборов данных, поскольку небольшие наборы данных уменьшают MiniBatchSize
и ValidationFrequency
.
Если вы хотите большее управление обучением, нажмите Training Options и выберите настройки, чтобы обучаться с.
Установите InitialLearnRate
к маленькому значению, чтобы замедлить изучение в переданных слоях.
Задайте ValidationFrequency
так, чтобы точность на данных о валидации была вычислена один раз в эпоху.
Задайте небольшое количество эпох. Эпоха является полным учебным циклом на целом обучающем наборе данных. Для передачи обучения вы не должны обучаться для как много эпох.
Задайте мини-пакетный размер, то есть, сколько изображений, чтобы использовать в каждой итерации. Гарантировать целый набор данных используется в течение каждой эпохи, установите мини-пакетный размер равномерно делить количество обучающих выборок.
В данном примере установите InitialLearnRate
к 0.0001
, ValidationFrequency
к 5
, и MaxEpochs
к 8
. Как существует 55 наблюдений, установите MiniBatchSize
к 11, чтобы разделить обучающие данные равномерно и убедиться вы используете целый набор данных в течение каждой эпохи. Для получения дополнительной информации о выборе опций обучения смотрите trainingOptions
.
Чтобы обучить сеть с заданными опциями обучения, нажмите Close и затем нажмите Train.
Deep Network Designer позволяет вам визуализировать и контролировать процесс обучения. Можно затем отредактировать опции обучения и переобучить сеть при необходимости.
Чтобы экспортировать сетевую архитектуру с обученными весами, на вкладке Training, выбирают Export> Export Trained Network и Results. Deep Network Designer экспортирует обучивший сеть как переменную trainedNetwork_1
и учебная информация как переменная trainInfoStruct_1
.
trainInfoStruct_1
trainInfoStruct_1 = struct with fields:
TrainingLoss: [1×40 double]
TrainingAccuracy: [1×40 double]
ValidationLoss: [4.8267 NaN NaN NaN 2.1034 NaN NaN NaN NaN 1.2332 NaN NaN NaN NaN 0.6614 NaN NaN NaN NaN 0.4312 NaN NaN NaN NaN 0.2878 NaN NaN NaN NaN 0.2472 NaN NaN NaN NaN 0.2647 NaN NaN NaN NaN 0.2893]
ValidationAccuracy: [10 NaN NaN NaN 10 NaN NaN NaN NaN 40 NaN NaN NaN NaN 80 NaN NaN NaN NaN 90 NaN NaN NaN NaN 95 NaN NaN NaN NaN 95 NaN NaN NaN NaN 95 NaN NaN NaN NaN 95]
BaseLearnRate: [1×40 double]
FinalValidationLoss: 0.2893
FinalValidationAccuracy: 95
Можно также сгенерировать код MATLAB, который воссоздает сеть и используемые опции обучения. На вкладке Training выберите Export> Generate Code for Training. Исследуйте код MATLAB, чтобы изучить, как программно подготовить данные к обучению, создать сетевую архитектуру и обучить сеть.
Загрузите новое изображение, чтобы классифицировать использование обучившего сеть.
I = imread("MerchDataTest.jpg");
Deep Network Designer изменяет размер изображений во время обучения совпадать с сетевым входным размером. Чтобы просмотреть сетевой входной размер, перейдите к Разработчику, разделяют на области и выбирают imageInputLayer
(первый слой). Эта сеть имеет входной размер 227 227.
Измените размер тестового изображения, чтобы совпадать с сетевым входным размером.
I = imresize(I, [227 227]);
Классифицируйте тестовое изображение с помощью обучившего сеть.
[YPred,probs] = classify(trainedNetwork_1,I); imshow(I) label = YPred; title(string(label) + ", " + num2str(100*max(probs),3) + "%");