В этом примере показано, как подстроить предварительно обученную сверточную нейронную сеть GoogLeNet, чтобы выполнить классификацию на новом наборе изображений.
GoogLeNet был обучен на более чем миллионе изображений и может классифицировать изображения в 1 000 категорий объектов (таких как клавиатура, кофейная кружка, карандаш и многие животные). Сеть изучила богатые представления функции для широкого спектра изображений. Сеть берет изображение в качестве входа и выводит метку для объекта в изображении вместе с вероятностями для каждой из категорий объектов.
Передача обучения обычно используется в применении глубокого обучения. Можно взять предварительно обученную сеть и использовать ее в качестве начальной точки, чтобы изучить новую задачу. Подстройка сети с передачей обучения обычно намного быстрее и легче, чем обучение сети со случайным образом инициализированными весами с нуля. Можно быстро передать изученные функции новой задаче с помощью меньшего числа учебных изображений.
Разархивируйте и загрузите новые изображения как datastore изображений. imageDatastore
автоматически помечает изображения на основе имен папок и хранит данные как ImageDatastore
объект. Datastore изображений позволяет вам сохранить большие данные изображения, включая данные, которые не умещаются в памяти, и эффективно считать пакеты изображений во время обучения сверточной нейронной сети.
unzip('MerchData.zip'); imds = imageDatastore('MerchData', ... 'IncludeSubfolders',true, ... 'LabelSource','foldernames');
Разделите данные на наборы данных обучения и валидации. Используйте 70% изображений для обучения и 30% для валидации. splitEachLabel
разделяет datastore изображений в два новых хранилища данных.
[imdsTrain,imdsValidation] = splitEachLabel(imds,0.7,'randomized');
Этот очень небольшой набор данных теперь содержит 55 учебных изображений и 20 изображений валидации. Отобразите некоторые демонстрационные изображения.
numTrainImages = numel(imdsTrain.Labels); idx = randperm(numTrainImages,16); figure for i = 1:16 subplot(4,4,i) I = readimage(imdsTrain,idx(i)); imshow(I) end
Загрузите предварительно обученную нейронную сеть GoogLeNet. Если Модель Deep Learning Toolbox™ для Сети GoogLeNet не установлена, то программное обеспечение обеспечивает ссылку на загрузку.
net = googlenet;
Используйте deepNetworkDesigner
отобразить интерактивную визуализацию сетевой архитектуры и подробной информации о слоях сети.
deepNetworkDesigner(net)
Первый слой, который является входным слоем изображений, требует входных изображений размера 224 224 3, где 3 количество цветовых каналов.
inputSize = net.Layers(1).InputSize
inputSize = 1×3
224 224 3
Полносвязный слой и слой классификации предварительно обученной сети net
сконфигурированы для 1 000 классов. Эти два слоя, loss3-classifier
и output
в GoogLeNet содержите информацию о том, как сочетать функции, которые сеть извлекает в вероятности класса, значение потерь и предсказанные метки. Чтобы переобучить предварительно обученную сеть, чтобы классифицировать новые изображения, замените эти два слоя на новые слои, адаптированные к новому набору данных.
Извлеките график слоев из обучившего сеть.
lgraph = layerGraph(net);
Замените полносвязный слой на новый полносвязный слой, который имеет количество выходных параметров, равных количеству классов. Чтобы сделать изучение быстрее в новых слоях, чем в переданных слоях, увеличьте WeightLearnRateFactor
и BiasLearnRateFactor
значения полносвязного слоя.
numClasses = numel(categories(imdsTrain.Labels))
numClasses = 5
newLearnableLayer = fullyConnectedLayer(numClasses, ... 'Name','new_fc', ... 'WeightLearnRateFactor',10, ... 'BiasLearnRateFactor',10); lgraph = replaceLayer(lgraph,'loss3-classifier',newLearnableLayer);
Слой классификации задает выходные классы сети. Замените слой классификации на новый без меток класса. trainNetwork
автоматически устанавливает выходные классы слоя в учебное время.
newClassLayer = classificationLayer('Name','new_classoutput'); lgraph = replaceLayer(lgraph,'output',newClassLayer);
Сеть требует входных изображений размера 224 224 3, но изображения в хранилищах данных изображений имеют различные размеры. Используйте увеличенный datastore изображений, чтобы автоматически изменить размер учебных изображений. Задайте дополнительные операции увеличения, чтобы выполнить на учебных изображениях: случайным образом инвертируйте учебные изображения вдоль вертикальной оси, и случайным образом переведите их до 30 пикселей горизонтально и вертикально. Увеличение данных помогает препятствовать тому, чтобы сеть сверхсоответствовала и запомнила точные детали учебных изображений.
pixelRange = [-30 30]; imageAugmenter = imageDataAugmenter( ... 'RandXReflection',true, ... 'RandXTranslation',pixelRange, ... 'RandYTranslation',pixelRange); augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain, ... 'DataAugmentation',imageAugmenter);
Чтобы автоматически изменить размер изображений валидации, не выполняя дальнейшее увеличение данных, используйте увеличенный datastore изображений, не задавая дополнительных операций предварительной обработки.
augimdsValidation = augmentedImageDatastore(inputSize(1:2),imdsValidation);
Задайте опции обучения. Для передачи обучения сохраните функции от ранних слоев предварительно обученной сети (переданные веса слоя). Чтобы замедлить изучение в переданных слоях, установите начальную скорость обучения на маленькое значение. На предыдущем шаге вы увеличили факторы скорости обучения для полносвязного слоя, чтобы ускорить изучение в новых последних слоях. Эта комбинация настроек скорости обучения приводит к быстрому изучению только в новых слоях и более медленном изучении в других слоях. При использовании обучение с переносом вы не должны обучаться для как много эпох. Эпоха является полным учебным циклом на целом обучающем наборе данных. Задайте мини-пакетный размер и данные о валидации. Программное обеспечение проверяет сеть каждый ValidationFrequency
итерации во время обучения.
options = trainingOptions('sgdm', ... 'MiniBatchSize',10, ... 'MaxEpochs',6, ... 'InitialLearnRate',1e-4, ... 'Shuffle','every-epoch', ... 'ValidationData',augimdsValidation, ... 'ValidationFrequency',3, ... 'Verbose',false, ... 'Plots','training-progress');
Обучите сеть, состоящую из переданных и новых слоев. По умолчанию, trainNetwork
использует графический процессор, если вы доступны. Это требует Parallel Computing Toolbox™ и поддерживаемого устройства графического процессора. Для получения информации о поддерживаемых устройствах смотрите Поддержку графического процессора Релизом (Parallel Computing Toolbox). В противном случае это использует центральный процессор. Можно также задать среду выполнения при помощи 'ExecutionEnvironment'
аргумент пары "имя-значение" trainingOptions
.
netTransfer = trainNetwork(augimdsTrain,lgraph,options);
Классифицируйте изображения валидации с помощью подстроенной сети.
[YPred,scores] = classify(netTransfer,augimdsValidation);
Отобразите четыре демонстрационных изображения валидации с их предсказанными метками.
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)); end
Вычислите точность классификации на набор валидации. Точность является частью меток, которые сеть предсказывает правильно.
YValidation = imdsValidation.Labels; accuracy = mean(YPred == YValidation)
accuracy = 1
Для советов на улучшающейся точности классификации смотрите Советы Глубокого обучения и Приемы.
[1] Krizhevsky, Алекс, Илья Сутскевер и Джеффри Э. Хинтон. "Классификация ImageNet с Глубокими Сверточными нейронными сетями". Усовершенствования в нейронных системах обработки информации 25 (2012).
[2] Szegedy, христианин, Вэй Лю, Янцин Цзя, Пьер Сермане, Скотт Рид, Драгомир Ангуелов, Dumitru Erhan, Винсент Вэнхук и Эндрю Рэбинович. "Идя глубже со свертками". Продолжения конференции по IEEE по компьютерному зрению и распознаванию образов (2015): 1–9.
[3] "Модель BVLC GoogLeNet". https://github.com/BVLC/caffe/tree/master/models/bvlc_googlenet.
trainNetwork
| trainingOptions
| squeezenet
| googlenet
| analyzeNetwork
| Deep Network Designer