Передайте изучение с Deep Network Designer

Этот пример показывает, как в интерактивном режиме подготовить сеть к изучению передачи с помощью приложения Deep Network Designer. Изучение передачи является процессом взятия предварительно обученной нейронной сети для глубокого обучения и подстройки его, чтобы изучить новую задачу. Используя передачу, учащуюся, обычно намного быстрее и легче, чем обучение сети с нуля, потому что можно быстро передать изученные функции новой задаче с помощью меньшего числа учебных изображений.

Используйте обучение с переносом путем выполнения этих шагов:

  1. Выберите предварительно обученную сеть и импортируйте ее в приложение.

  2. Замените последние слои на новые слои, адаптированные к новому набору данных:

    1. Задайте новое количество классов в ваших учебных изображениях.

    2. Установите темпы обучения учиться быстрее в новых слоях, чем в переданных слоях.

  3. Экспортируйте сеть для обучения в командной строке.

Выберите предварительно обученную сеть

Deep Learning Toolbox™ обеспечивает выбор предварительно обученных сетей классификации изображений, которые изучили богатые представления функции, подходящие для широкого спектра изображений. Изучение передачи работает лучше всего, если ваши изображения подобны изображениям, первоначально раньше обучал сеть. Если ваши учебные изображения являются естественными изображениями как те в базе данных ImageNet, то любая из предварительно обученных сетей подходит. Чтобы попробовать более быструю сеть сначала, используйте googlenet или squeezenet. Для списка доступных сетей и как сравнить их, смотрите Предварительно обученные Глубокие нейронные сети.

Если ваши данные очень отличаются от данных ImageNet, может быть лучше обучить новую сеть. Например, если вы имеете крошечные изображения, спектрограммы, или не отображаете данные, затем смотрите вместо этого Сети Сборки с Deep Network Designer.

Загрузите предварительно обученную сеть GoogLeNet. Если необходимо загрузить сеть, то функция обеспечивает ссылку на Add-On Explorer.

net = googlenet;

Сеть импорта в Deep Network Designer

Чтобы открыть Deep Network Designer, на вкладке Apps, под Machine Learning and Deep Learning, кликают по значку приложения. Также можно открыть приложение из командной строки.

deepNetworkDesigner

Нажмите Import и выберите сеть, чтобы загрузить из рабочей области. Deep Network Designer отображает уменьшивший масштаб представление целой сети.

Исследуйте сетевой график. Чтобы увеличить масштаб с мышью, используйте Ctrl +scroll колесо. К панорамированию используйте клавиши со стрелками, или удерживайте колесико прокрутки и перетащите мышь. Выберите слой, чтобы просмотреть его свойства. Отмените выбор всех слоев, чтобы просмотреть сетевые сводные данные в панели Properties.

Сеть редактирования для изучения передачи

Сеть классифицирует входные изображения с помощью последнего learnable слоя и итогового слоя классификации. Чтобы переобучить предварительно обученную сеть, чтобы классифицировать новые изображения, замените эти последние слои на новые слои, адаптированные к новому набору данных.

Измените количество классов

Чтобы использовать предварительно обученную сеть для изучения передачи, необходимо изменить количество классов, чтобы совпадать новым набором данных. Во-первых, найдите последний learnable слой в сети. Для GoogLeNet и большинства предварительно обученных сетей, последний learnable слой является полносвязным слоем. Кликните по слою loss3-classifier и просмотрите его свойства.

Свойство OutputSize задает количество классов для проблем классификации. Панель Properties указывает, что предварительно обученная сеть может классифицировать изображения в 1 000 классов. Вы не можете отредактировать OutputSize.

Чтобы изменить количество классов, перетащите новый fullyConnectedLayer от Layer Library на холст. Отредактируйте свойство OutputSize к количеству классов в ваших данных. В данном примере введите 5. Удалите исходный слой loss3-classifier и соедините свой новый слой в его месте.

Выберите последний слой, слой классификации. В панели Свойств свойство слоя OutputSize показывает 1 000 классов и первые несколько имен классов.

Для изучения передачи необходимо заменить выходной слой. Прокрутите в конец Layer Library и перетащите новый classificationLayer на холст. Удалите исходный слой output и соедините свой новый слой в его месте. Для нового выходного слоя вы не должны устанавливать OutputSize. В учебное время trainNetwork автоматически устанавливает выходные классы слоя от данных.

Заставьте новые слои учиться быстрее

Отредактируйте темпы обучения, чтобы учиться быстрее в новом слое, чем в переданных слоях. На вашем новом слое fullyConnectedLayer, набор WeightLearnRateFactor и BiasLearnRateFactor к 10.

Проверяйте сеть

Чтобы проверять сеть и исследовать больше деталей слоев, нажмите Analyze. Отредактированная сеть готова к обучению, если Нейронная сеть для глубокого обучения Анализатор сообщает о нулевых ошибках.

Сеть экспорта для обучения

Чтобы экспортировать сеть в рабочую область, возвратитесь к Deep Network Designer и нажмите Export. Deep Network Designer экспортирует сеть в новую переменную, содержащую отредактированные сетевые слои, названные lgraph_1. После экспорта можно предоставить переменную слоя к функции trainNetwork. Можно также сгенерировать код MATLAB®, который воссоздает сетевую архитектуру и возвращает ее как переменную в рабочей области. Для получения дополнительной информации смотрите, Генерируют код MATLAB от Deep Network Designer.

Обучите сеть экспортируемые от Deep Network Designer

Этот пример показывает, как использовать сеть, экспортируемую от Deep Network Designer для изучения передачи. После подготовки сети в приложении вы должны:

  • Измените размер изображений.

  • Задайте опции обучения.

  • Обучите сеть.

Измените размер изображений для изучения передачи

Для изучения передачи измените размер своих изображений, чтобы совпадать с входным размером предварительно обученной сети. Чтобы найти входной размер изображений сети, в Deep Network Designer, исследуют imageInputLayer. Для GoogLeNet InputSize является 224x224.

Разархивируйте и загрузите изображения как datastore изображений. Этот очень небольшой набор данных содержит только 75 изображений в 5 классах. Разделите данные на 70% для обучения и 30% для валидации.

unzip('MerchData.zip');
imds = imageDatastore('MerchData', ...
    'IncludeSubfolders',true, ...
    'LabelSource','foldernames'); 
[imdsTrain,imdsValidation] = splitEachLabel(imds,0.7);

Если ваши учебные изображения находятся в папке с подпапками для каждого класса, можно создать datastore для данных, заменив MerchData на местоположение папки. Проверяйте количество классов - необходимо подготовить сеть к передаче, учащейся с количеством классов совпадать данными.

Измените размер изображений в хранилищах данных изображений, чтобы совпадать с предварительно обученной сетью GoogLeNet.

augimdsTrain = augmentedImageDatastore([224 224],imdsTrain);
augimdsValidation = augmentedImageDatastore([224 224],imdsValidation);

Можно также применить преобразования к изображениям, чтобы помочь препятствовать тому, чтобы сеть сверхсоответствовала. Для получения дополнительной информации смотрите imageDataAugmenter.

Установите опции обучения для изучения передачи

Перед обучением задайте опции обучения.

  • Для изучения передачи, набор InitialLearnRate к маленькому значению, чтобы замедлить изучение в переданных слоях. В приложении вы увеличили факторы темпа обучения для полносвязного слоя, чтобы ускорить изучение в новых последних слоях. Эта комбинация настроек темпа обучения приводит к быстрому изучению только в новых слоях и более медленном изучении в других слоях.

  • Задайте небольшое количество эпох. Эпоха является полным учебным циклом на целом обучающем наборе данных. Для изучения передачи вы не должны обучаться для как много эпох. Переставьте данные каждая эпоха.

  • Задайте мини-пакетный размер, то есть, сколько изображений, чтобы использовать в каждой итерации.

  • Задайте данные о валидации и частоту валидации.

  • Включите учебный график контролировать прогресс, в то время как вы обучаетесь.

options = trainingOptions('sgdm', ...
    'MiniBatchSize',10, ...
    'MaxEpochs',6, ...
    'InitialLearnRate',1e-4, ...
    'Shuffle','every-epoch', ...
    'ValidationData',augimdsValidation, ...
    'ValidationFrequency',6, ...
    'Verbose',false, ...
    'Plots','training-progress');

Обучение сети

Чтобы обучить сеть, предоставьте слои, которые вы экспортировали из приложения, здесь названного lgraph_1, вашими измененными изображениями и опциями обучения, к функции trainNetwork. По умолчанию trainNetwork использует графический процессор при наличии (требует Parallel Computing Toolbox™). В противном случае это использует центральный процессор. Обучение быстро, потому что набор данных является настолько небольшим.

net = trainNetwork(augimdsTrain,lgraph_1,options);

Тест обучил сеть путем классификации изображений валидации

Используйте подстроенную сеть, чтобы классифицировать изображения валидации и вычислить точность классификации.

[YPred,probs] = classify(net,augimdsValidation);
accuracy = mean(YPred == imdsValidation.Labels)
accuracy = 0.9000

Отобразите четыре демонстрационных изображения валидации с предсказанными метками и предсказанными вероятностями.

idx = randperm(numel(imdsValidation.Files),4);
figure
for i = 1:4
    subplot(2,2,i)
    I = readimage(imdsValidation,idx(i));
    imshow(I)
    label = YPred(idx(i));
    title(string(label) + ", " + num2str(100*max(probs(idx(i),:)),3) + "%");
end

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

Похожие темы