В этом примере показано, как выполнить передачу обучения в интерактивном режиме с помощью приложения Deep Network Designer.
Передача обучения - это процесс взятия предварительно обученной нейронной сети для глубокого обучения и подстройки ее, чтобы узнать новую задачу. Использование передачи обучения обычно быстрее и проще, чем обучение сети с нуля. Можно быстро перенести выученные функции в новую задачу, используя меньший объем данных.
Используйте Deep Network Designer для выполнения передачи обучения для классификации изображений следующими шагами:
Откройте приложение Deep Network Designer и выберите предварительно обученную сеть.
Импортируйте новый набор данных.
Замените окончательные слои новыми слоями, адаптированными к новому набору данных.
Установите скорости обучения так, чтобы обучение было быстрее в новых слоях, чем в переданных слоях.
Обучите сеть с помощью Deep Network Designer, или экспортируйте сеть для обучения в командной строке.
В рабочей области извлеките набор данных MathWorks Merch. Это небольшой набор данных, содержащий 75 изображений товаров MathWorks, принадлежащих пяти различным классам (прописная буква, cube, игральные карты, отвертка и факел).
unzip("MerchData.zip");
Чтобы открыть Deep Network Designer, на вкладке Apps, в разделе Машинное обучение и Глубокое Обучение, щелкните значок приложения. Также можно открыть приложение из командной строки:
deepNetworkDesigner
Deep Network Designer предоставляет выбор предварительно обученных сетей классификации изображений, которые научились представлять богатые функции, подходящие для широкой области значений изображений. Передача обучения работает лучше всего, если ваши изображения похожи на изображения, первоначально используемые для обучения сети. Если ваши обучающие изображения являются естественными изображениями, подобными изображениям в базе данных ImageNet, то подходит любая предварительно обученная сеть. Список доступных сетей и способы их сравнения смотрите в Pretrained Глубокие Нейронные Сети.
Если ваши данные сильно отличаются от данных ImageNet - например, если у вас есть крошечные изображения, спектрограммы или неизображения - обучение новой сети может оказаться лучше. Для примеров, показывающих, как обучить сеть с нуля, смотрите Создать сеть классификации простых последовательностей с помощью Deep Network Designer и Создать простую сеть семантической сегментации в Deep Network Designer.
SqueezeNet не требует дополнительного пакета поддержки. Для других предварительно обученных сетей, если у вас нет установленного необходимого пакета поддержки, то приложение предоставляет опцию Install.
Выберите SqueezeNet из списка предварительно обученных сетей и нажмите кнопку Открыть.
Deep Network Designer отображает представление масштабирования всей сети на панели Designer.
Исследуйте сетевой график. Для масштабирования мышью используйте колесо прокрутки Ctrl +. Для панорамирования используйте клавиши со стрелами или удерживайте за колесо прокрутки и перетащите мышь. Выберите слой для просмотра его свойств. Отмените выбор всех слоев, чтобы просмотреть сводные данные по сети на панели свойств.
Чтобы загрузить данные в Deep Network Designer, на вкладке Data, выберите Import Data > Import Image Data. Откроется диалоговое окно Импорт изображений (Import Image Data).
В списке Источник данных выберите Папка. Нажмите кнопку Обзор и выберите извлеченную папку MerchData.
Можно принять решение применить увеличение изображения к обучающим данным. Приложение Deep Network Designer предоставляет следующие опции увеличения:
Случайное отражение по оси X
Случайное отражение по оси Y
Случайное вращение
Случайное перемасштабирование
Случайный горизонтальный перемещение
Случайный вертикальный перемещение
Можно эффективно увеличить объем обучающих данных, применяя рандомизированное увеличение к своим данным. Увеличение также позволяет вам обучать сети, чтобы быть инвариантными к искажениям в данных изображения. Для примера можно добавить рандомизированные повороты к входным изображениям, так что сеть инвариантна наличию вращения на вход изображениях.
В этом примере примените случайное отражение в оси X, случайное вращение из области значений [ -90,90 ] степеней и случайное перемасштабирование из области значений [1,2].
Можно также принять решение импортировать данные валидации либо путем разделения их от обучающих данных, либо путем импорта из другого источника. Валидация оценивает производительность модели по новым данным по сравнению с обучающими данными и помогает вам контролировать эффективность и защищать от сверхподбора кривой.
В данном примере используйте для валидации 30% изображений.
Щелкните Импорт, чтобы импортировать данные в Deep Network Designer.
Используя Deep Network Designer, можно визуально просмотреть распределение данных обучения и валидации на вкладке Данные. Можно увидеть, что в этом примере в наборе данных пять классов. Вы также можете увидеть случайные наблюдения от каждого класса.
Отредактируйте сеть на панели Designer, чтобы указать новое количество классов в данных. Чтобы подготовить сеть к передаче обучения, замените последний усвояемый слой и конечный слой классификации.
Чтобы использовать предварительно обученную сеть для передачи обучения, необходимо изменить количество классов, чтобы оно совпадало с вашим новым набором данных. Во-первых, найдите последний обучаемый слой в сети. Для SqueezeNet последний усвояемый слой является последним сверточным слоем, 'conv10'
. В этом случае замените сверточный слой на новый сверточный слой с количеством фильтров, равным количеству классов.
Перетащите новый convolution2dLayer
на холст. Чтобы соответствовать исходному сверточному слою, задайте FilterSize
на 1,1
.
The NumFilters
свойство определяет количество классов для задач классификации. Изменение NumFilters
к количеству классов в новых данных, в этом примере, 5
.
Измените скорости обучения так, чтобы обучение было быстрее в новом слое, чем в переданных слоях, путем установки WeightLearnRateFactor
и BiasLearnRateFactor
на 10
.
Удалите последний 2-D сверточный слой и соедините вместо этого новый слой.
Для передачи обучения необходимо заменить слой выхода. Прокрутка до конца библиотеки слоев и перетаскивание нового classificationLayer
на холст. Удалите исходный слой классификации и соедините ваш новый слой вместо него.
Для нового выходного слоя вам не нужно устанавливать OutputSize
. Во время обучения Deep Network Designer автоматически устанавливает классы выхода слоя из данных.
Чтобы проверить, что сеть готова к обучению, нажмите Анализировать. Если анализатор Нейронной сети для глубокого обучения сообщает о нулевых ошибках, отредактированная сеть готова к обучению.
В Deep Network Designer можно обучать сети, импортированные или созданные в приложении.
Чтобы обучить сеть настройкам по умолчанию, на вкладке Обучение, нажмите Обучить. Опции обучения по умолчанию лучше подходят для больших наборов данных, для небольших наборов данных уменьшают размер мини-пакета и частоту валидации.
Если требуется усилить контроль над обучением, щелкните Опции обучения и выберите параметры для обучения.
Установите начальную скорость обучения на небольшое значение, чтобы замедлить обучение в перенесенных слоях.
Задайте частоту валидации, чтобы точность данных валидации вычислялась один раз в каждую эпоху.
Задайте небольшое количество эпох. Эпоха - это полный цикл обучения на целом наборе обучающих данных. Для передачи обучения не нужно тренироваться на столько эпох.
Задайте размер мини-пакета, то есть сколько изображений использовать в каждой итерации. Чтобы гарантировать использование всего набора данных в каждую эпоху, установите размер мини-пакета, чтобы равномерно разделить количество обучающих выборок.
В данном примере установите InitialLearnRate на 0.0001
, ValidationFrequency для 5
, и MaxEpochs, чтобы 8
. Поскольку наблюдений 55, установите значение MiniBatchSize 11
чтобы разделить обучающие данные равномерно и убедиться, что вы используете весь набор обучающих данных в каждую эпоху. Для получения дополнительной информации о выборе опций обучения смотрите trainingOptions
.
Чтобы обучить сеть с заданными опциями обучения, нажмите кнопку Закрыть и затем щелкните Обучить.
Deep Network Designer позволяет визуализировать и контролировать процесс обучения. Затем можно отредактировать опции обучения и при необходимости переобучить сеть.
Чтобы экспортировать сетевую архитектуру с обученными весами, на вкладке Обучение выберите Экспорт > Экспорт обученной сети и результатов. Deep Network Designer экспортирует обученную сеть как переменную trainedNetwork_1
и обучающую информацию как переменную trainInfoStruct_1
.
trainInfoStruct_1
trainInfoStruct_1 = struct with fields:
TrainingLoss: [1×40 double]
TrainingAccuracy: [1×40 double]
ValidationLoss: [4.3374 NaN NaN NaN 2.4329 NaN NaN NaN NaN 1.3966 NaN NaN NaN NaN 0.7526 NaN NaN NaN NaN 0.6424 NaN NaN NaN NaN 0.6349 NaN NaN NaN NaN 0.5940 NaN NaN NaN NaN 0.5490 NaN NaN NaN NaN 0.5179]
ValidationAccuracy: [10 NaN NaN NaN 15 NaN NaN NaN NaN 40 NaN NaN NaN NaN 70 NaN NaN NaN NaN 85 NaN NaN NaN NaN 90 NaN NaN NaN NaN 85 NaN NaN NaN NaN 90 NaN NaN NaN NaN 95]
BaseLearnRate: [1×40 double]
FinalValidationLoss: 0.5179
FinalValidationAccuracy: 95
Можно также сгенерировать код MATLAB, который воссоздает сеть и используемые опции обучения. На вкладке Обучение выберите Экспорт > Сгенерировать код для обучения. Исследуйте код MATLAB, чтобы узнать, как программно подготовить данные к обучению, создать сетевую архитектуру и обучить сеть.
Загрузите новое изображение для классификации с помощью обученной сети.
I = imread("MerchDataTest.jpg");
Deep Network Designer изменяет размер изображений во время обучения, чтобы соответствовать размеру входа сети. Чтобы просмотреть размер входа сети, перейдите на панель 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) + "%");