exponenta event banner

Передача обучения с использованием предварительно обученной сети

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

GoogLeNet был обучен более чем миллиону изображений и может классифицировать изображения на 1000 категорий объектов (таких как клавиатура, кофейная кружка, карандаш и многие животные). Сеть изучила богатые представления функций для широкого спектра изображений. Сеть принимает изображение в качестве входного и выводит метку для объекта в изображении вместе с вероятностями для каждой из категорий объектов.

Transfer learning обычно используется в приложениях для глубокого обучения. Предварительно подготовленную сеть можно использовать в качестве отправной точки для изучения новой задачи. Точная настройка сети с обучением переносу обычно намного быстрее и проще, чем обучение сети с произвольно инициализированными весами с нуля. Вы можете быстро перенести изученные функции на новую задачу, используя меньшее количество обучающих изображений.

Загрузить данные

Распакуйте и загрузите новые образы как хранилище данных образов. imageDatastore автоматически помечает изображения на основе имен папок и сохраняет данные в виде ImageDatastore объект. Хранилище данных изображения позволяет хранить большие данные изображения, включая данные, которые не помещаются в память, и эффективно считывать партии изображений во время обучения сверточной нейронной сети.

unzip('MerchData.zip');
imds = imageDatastore('MerchData', ...
    'IncludeSubfolders',true, ...
    'LabelSource','foldernames');

Разделите данные на наборы данных обучения и проверки. Используйте 70% изображений для обучения и 30% для проверки. splitEachLabel разбивает хранилище данных образа на два новых хранилища данных.

[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 сконфигурированы для 1000 классов. Эти два слоя, 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, но изображения в хранилищах данных изображений имеют разные размеры. Используйте хранилище данных дополненного изображения для автоматического изменения размеров обучающих изображений. Задайте дополнительные операции увеличения, выполняемые на обучающих изображениях: случайным образом переверните обучающие изображения вдоль вертикальной оси и перемещайте их случайным образом до 30 пикселей по горизонтали и вертикали. Увеличение объема данных помогает предотвратить переоборудование сети и запоминание точных деталей обучающих изображений.

pixelRange = [-30 30];
imageAugmenter = imageDataAugmenter( ...
    'RandXReflection',true, ...
    'RandXTranslation',pixelRange, ...
    'RandYTranslation',pixelRange);
augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain, ...
    'DataAugmentation',imageAugmenter);

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

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 использует графический процессор, если он доступен. Для этого требуется 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] Крижевский, Алекс, Илья Суцкевер, и Жоффруа Э. Хинтон. «ImageNet Classification с глубокими сверточными нейронными сетями». Достижения в системах обработки нейронной информации 25 (2012).

[2] Сегеди, Кристиан, Вэй Лю, Янцин Цзя, Пьер Серманет, Скотт Рид, Драгомир Ангуэлов, Думитру Эрхан, Венсан Ванхуке и Эндрю Рабинович. «Углубляюсь со свертками.» Материалы конференции IEEE по компьютерному зрению и распознаванию образов (2015 год): 1-9.

См. также

| | | | |

Связанные темы