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

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

Когда обучение, нейронная сеть для глубокого обучения, инициализация весов слоя и смещения могут оказать большое влияние на то, как хорошо сеть обучается. Выбор инициализатора оказывает большее влияние на сети без слоев нормализации партии. Для получения дополнительной информации об инициализаторах веса смотрите, Сравнивают Инициализаторы Веса Слоя.

Открытый эксперимент

Во-первых, откройте пример. Experiment Manager загружает проект с предварительно сконфигурированным экспериментом, который можно смотреть и запустить. Чтобы открыть эксперимент, в панели Браузера Эксперимента, дважды кликают имя эксперимента (WeightInitializerExperiment).

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

Поле Description содержит текстовое описание эксперимента. В данном примере описание:

Perform transfer learning by initializing the weights of convolution and
fully connected layers in a pretrained network.

Раздел Hyperparameters задает стратегию (Exhaustive Sweep) и гиперзначения параметров, чтобы использовать для эксперимента. Когда вы запускаете эксперимент, Experiment Manager обучает сеть с помощью каждой комбинации гиперзначений параметров, заданных в гипертаблице параметров. Этот пример использует гиперпараметры WeightsInitializer и BiasInitializer задавать вес и инициализаторы смещения для свертки и полносвязных слоев в предварительно обученной сети. Для получения дополнительной информации об этих инициализаторах, смотрите WeightsInitializer и BiasInitializer.

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

  • Загружает предварительно обученную сеть GoogLeNet.

lgraph = googlenet(Weights="none");
  • Загрузки и извлечения Цветочный набор данных, который составляет приблизительно 218 Мбайт. Для получения дополнительной информации об этом наборе данных смотрите Наборы Данных изображения.

url = "http://download.tensorflow.org/example_images/flower_photos.tgz";
downloadFolder = tempdir;
filename = fullfile(downloadFolder,"flower_dataset.tgz");
imageFolder = fullfile(downloadFolder,"flower_photos");
if ~exist(imageFolder,"dir")
    disp("Downloading Flower Dataset (218 MB)...")
    websave(filename,url);
    untar(filename,downloadFolder)
end
imds = imageDatastore(imageFolder, ...
    IncludeSubfolders=true, ...
    LabelSource="foldernames");
[imdsTrain,imdsValidation] = splitEachLabel(imds,0.9);
inputSize = net.Layers(1).InputSize;
augimdsTrain = augmentedImageDatastore(inputSize,imdsTrain);
augimdsValidation = augmentedImageDatastore(inputSize,imdsValidation);
  • Инициализирует входной вес в свертке и полносвязных слоях при помощи инициализаторов, заданных в гипертаблице параметров. Вспомогательный функциональный findLayersToReplace, то, которое перечислено в Приложении 2 в конце этого примера, определяет слои в сетевой архитектуре, которая может быть изменена для передачи обучения.

numClasses = numel(categories(imdsTrain.Labels));
weightsInitializer = params.WeightsInitializer;
biasInitializer = params.BiasInitializer;
learnableLayer = findLayersToReplace(lgraph);
newLearnableLayer = fullyConnectedLayer(numClasses,Name="new_fc");
lgraph = replaceLayer(lgraph,learnableLayer.Name,newLearnableLayer);
for i = 1:numel(lgraph.Layers)
    layer = lgraph.Layers(i);
     if class(layer) == "nnet.cnn.layer.Convolution2DLayer" || ...
             class(layer) == "nnet.cnn.layer.FullyConnectedLayer"
         layerName = layer.Name;
         newLayer = layer;
         newLayer.WeightsInitializer = weightsInitializer;
         newLayer.BiasInitializer = biasInitializer;
         lgraph = replaceLayer(lgraph,layerName,newLayer);
     end
 end
  • Задает trainingOptions объект для эксперимента. Пример обучает сеть в течение 10 эпох, с помощью мини-пакетного размера 128 и проверяя сеть каждые 5 эпох.

miniBatchSize = 128;
validationFrequencyEpochs = 5;
numObservations = augimdsTrain.NumObservations;
numIterationsPerEpoch = floor(numObservations/miniBatchSize);
validationFrequency = validationFrequencyEpochs * numIterationsPerEpoch;
options = trainingOptions("sgdm", ...
    MaxEpochs=10, ...
    MiniBatchSize=miniBatchSize, ...
    Shuffle="every-epoch", ...
    ValidationData=augimdsValidation, ...
    ValidationFrequency=validationFrequency, ...
    Verbose=false);

Чтобы смотреть функцию настройки, под Функцией Setup, нажимают Edit. Функция настройки открывается в Редакторе MATLAB®. Кроме того, код для функции настройки появляется в Приложении 1 в конце этого примера.

Раздел Metrics задает дополнительные функции, которые оценивают результаты эксперимента. Этот пример не включает пользовательских метрических функций.

Запустите эксперимент

Когда вы запускаете эксперимент, Experiment Manager обучает сеть, заданную функцией настройки многократно. Каждое испытание использует различную комбинацию гиперзначений параметров. По умолчанию Experiment Manager запускает одно испытание за один раз. Если у вас есть Parallel Computing Toolbox™, можно запустить несколько испытаний одновременно. Для лучших результатов, прежде чем вы запустите свой эксперимент, начинают параллельный пул со стольких же рабочих сколько графические процессоры. Для получения дополнительной информации смотрите Использование Experiment Manager, чтобы Обучить нейронные сети параллельно и Поддержка графического процессора Релизом (Parallel Computing Toolbox).

  • Чтобы запустить один суд над экспериментом за один раз, на панели инструментов Experiment Manager, нажимают Run.

  • Чтобы запустить несколько испытаний одновременно, нажмите Use Parallel и затем Запуск. Если нет никакого текущего параллельного пула, Experiment Manager запускает тот с помощью кластерного профиля по умолчанию. Experiment Manager затем выполняет несколько одновременных испытаний, в зависимости от количества параллельных доступных рабочих.

Таблица результатов показывает точность и потерю для каждого испытания. В то время как эксперимент запускается, нажмите Training Plot, чтобы отобразить учебный график и отследить прогресс каждого испытания. Нажмите Confusion Matrix, чтобы отобразить матрицу беспорядка для данных о валидации в каждом завершенном испытании.

Обратите внимание на то, что, для испытаний, которые используют Его инициализатор веса, Experiment Manager прерывает обучение, потому что потеря обучения и валидации становится неопределенной после нескольких итераций. Продолжение обучения тем испытаниям не приводит ни к каким полезным результатам.

Когда эксперимент заканчивается, можно отсортировать таблицу результатов по столбцу, испытаниям фильтра при помощи панели Фильтров, или записать наблюдения путем добавления аннотаций. Для получения дополнительной информации смотрите сортировку, Фильтр, и Аннотируйте Результаты Эксперимента.

Чтобы проверить производительность отдельного испытания, экспортируйте обучивший сеть или учебную информацию для испытания. На панели инструментов Experiment Manager выберите Export> Trained Network или Export> Training Information, соответственно. Для получения дополнительной информации смотрите сеть и информацию.

Закройте эксперимент

В панели Браузера Эксперимента щелкните правой кнопкой по имени проекта и выберите Close Project. Experiment Manager закрывает все эксперименты и результаты, содержавшиеся в проекте.

Приложение 1: функция Setup

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

Входной параметр

  • params структура с полями от гипертаблицы параметров Experiment Manager.

Вывод

  • augimdsTrain увеличенный объект datastore изображений для обучающих данных.

  • lgraph график слоев, который задает архитектуру нейронной сети.

  • options trainingOptions объект.

function [augimdsTrain,lgraph,options] = WeightInitializerExperiment_setup1(params)

lgraph = googlenet(Weights="none");

url = "http://download.tensorflow.org/example_images/flower_photos.tgz";
downloadFolder = tempdir;
filename = fullfile(downloadFolder,"flower_dataset.tgz");
imageFolder = fullfile(downloadFolder,"flower_photos");
if ~exist(imageFolder,"dir")
    disp("Downloading Flower Dataset (218 MB)...")
    websave(filename,url);
    untar(filename,downloadFolder)
end
imds = imageDatastore(imageFolder, ...
    IncludeSubfolders=true, ...
    LabelSource="foldernames");
[imdsTrain,imdsValidation] = splitEachLabel(imds,0.9);
inputSize = lgraph.Layers(1).InputSize;
augimdsTrain = augmentedImageDatastore(inputSize,imdsTrain);
augimdsValidation = augmentedImageDatastore(inputSize,imdsValidation);

numClasses = numel(categories(imdsTrain.Labels));
weightsInitializer = params.WeightsInitializer;
biasInitializer = params.BiasInitializer;
learnableLayer = findLayersToReplace(lgraph);
newLearnableLayer = fullyConnectedLayer(numClasses,Name="new_fc");
lgraph = replaceLayer(lgraph,learnableLayer.Name,newLearnableLayer);
for i = 1:numel(lgraph.Layers)
    layer = lgraph.Layers(i);
    
    if class(layer) == "nnet.cnn.layer.Convolution2DLayer" || ...
            class(layer) == "nnet.cnn.layer.FullyConnectedLayer"
        layerName = layer.Name;
        newLayer = layer;
        
        newLayer.WeightsInitializer = weightsInitializer;
        newLayer.BiasInitializer = biasInitializer;
        
        lgraph = replaceLayer(lgraph,layerName,newLayer);
    end
end

miniBatchSize = 128;
validationFrequencyEpochs = 5;
numObservations = augimdsTrain.NumObservations;
numIterationsPerEpoch = floor(numObservations/miniBatchSize);
validationFrequency = validationFrequencyEpochs * numIterationsPerEpoch;
options = trainingOptions("sgdm", ...
    MaxEpochs=10, ...
    MiniBatchSize=miniBatchSize, ...
    Shuffle="every-epoch", ...
    ValidationData=augimdsValidation, ...
    ValidationFrequency=validationFrequency, ...
    Verbose=false);

end

Приложение 2: найдите, что слои заменяют

Эта функция находит один слой классификации и предыдущее learnable (полностью соединенными или сверточными) слоем графика слоев lgraph.

function [learnableLayer,classLayer] = findLayersToReplace(lgraph)

if ~isa(lgraph,"nnet.cnn.LayerGraph")
    error("Argument must be a LayerGraph object.")
end

src = string(lgraph.Connections.Source);
dst = string(lgraph.Connections.Destination);
layerNames = string({lgraph.Layers.Name}');

isClassificationLayer = arrayfun(@(l) ...
    (isa(l,"nnet.cnn.layer.ClassificationOutputLayer")|isa(l,"nnet.layer.ClassificationLayer")), ...
    lgraph.Layers);

if sum(isClassificationLayer) ~= 1
    error("Layer graph must have a single classification layer.")
end
classLayer = lgraph.Layers(isClassificationLayer);

currentLayerIdx = find(isClassificationLayer);
while true
    
    if numel(currentLayerIdx) ~= 1
        error("Layer graph must have a single learnable layer preceding the classification layer.")
    end
    
    currentLayerType = class(lgraph.Layers(currentLayerIdx));
    isLearnableLayer = ismember(currentLayerType, ...
        ["nnet.cnn.layer.FullyConnectedLayer","nnet.cnn.layer.Convolution2DLayer"]);
    
    if isLearnableLayer
        learnableLayer =  lgraph.Layers(currentLayerIdx);
        return
    end
    
    currentDstIdx = find(layerNames(currentLayerIdx) == dst);
    currentLayerIdx = find(src(currentDstIdx) == layerNames);
end
end


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

Приложения

Функции

Похожие темы