Сравните слои активации

В этом примере показано, как сравнить точность обучения нейронные сети с ReLU, текучим ReLU, ЭЛУ и слоями активаций свиста.

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

В этом примере показано, как сравнить точность валидации обучения нейронная сеть SqueezeNet при использовании любого ReLU, текучего ReLU, ЭЛУ и слоев активаций свиста и сравнивает точность, учитывая набор валидации изображений.

Загрузка данных

Загрузите Цветочный набор данных.

url = 'http://download.tensorflow.org/example_images/flower_photos.tgz';
downloadFolder = tempdir;
filename = fullfile(downloadFolder,'flower_dataset.tgz');

dataFolder = fullfile(downloadFolder,'flower_photos');
if ~exist(dataFolder,'dir')
    fprintf("Downloading Flowers data set (218 MB)... ")
    websave(filename,url);
    untar(filename,downloadFolder)
    fprintf("Done.\n")
end

Подготовка данных для обучения

Загрузите данные как datastore изображений с помощью imageDatastore функционируйте и задайте папку, содержащую данные изображения.

imds = imageDatastore(dataFolder, ...
    'IncludeSubfolders',true, ...
    'LabelSource','foldernames');

Просмотрите количество классов обучающих данных.

numClasses = numel(categories(imds.Labels))
numClasses = 5

Разделите datastore так, чтобы каждая категория в наборе обучающих данных имела 80% изображений, и набор валидации имеет остающиеся изображения от каждой метки.

[imdsTrain,imdsValidation] = splitEachLabel(imds,0.80,'randomize');

Задайте опции увеличения и создайте увеличенное хранилище данных изображения, содержащее учебные изображения.

  • Случайным образом отразите изображения на горизонтальной оси.

  • Случайным образом масштабируйте изображения максимум на 20%.

  • Случайным образом вращайтесь, изображения до 45 отступают.

  • Случайным образом переведите изображения максимум на 3 пикселя.

  • Измените размер изображений к входному размеру сети (227 227)

imageAugmenter = imageDataAugmenter( ...
    'RandXReflection',true, ...
    'RandScale',[0.8 1.2], ...
    'RandRotation',[-45,45], ...
    'RandXTranslation',[-3 3], ...
    'RandYTranslation',[-3 3]);

augimdsTrain = augmentedImageDatastore([227 227],imdsTrain,'DataAugmentation',imageAugmenter);

Создайте увеличенный datastore изображений для данных о валидации, которые изменяют размер изображений к входному размеру сети. Не применяйте никакие другие преобразования изображений к данным о валидации.

augimdsValidation = augmentedImageDatastore([227 227],imdsValidation);

Создайте пользовательскую функцию построения графика

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

Создайте функцию, которая берет информационный struct, обеспеченный учебным процессом, и обновляет анимированный линейный график. updatePlot функция, перечисленная в разделе Plotting Function примера, берет в качестве входа информационную структуру и обновляет заданную анимированную линию.

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

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

  • Обучите использование мини-пакетного размера 128 в течение 60 эпох.

  • Переставьте данные каждая эпоха.

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

miniBatchSize = 128;
numObservationsTrain = numel(imdsTrain.Files);
numIterationsPerEpoch = floor(numObservationsTrain / miniBatchSize);

options = trainingOptions('adam', ...
    'MiniBatchSize',miniBatchSize, ...
    'MaxEpochs',60, ...
    'Shuffle','every-epoch', ...
    'ValidationData',augimdsValidation, ...
    'ValidationFrequency',numIterationsPerEpoch, ...
    'Verbose',false);

Обучите нейронные сети

Для каждого из типов слоя активации ReLU, текучий ReLU, ЭЛУ и свист, обучают сеть SqueezeNet.

Задайте типы слоев активации.

activationLayerTypes = ["relu" "leaky-relu" "elu" "swish"];

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

figure

colors = colororder;

for i = 1:numel(activationLayerTypes)
    line(i) = animatedline('Color',colors(i,:));
end

ylim([0 100])

legend(activationLayerTypes,'Location','southeast');

xlabel("Iteration")
ylabel("Accuracy")
title("Validation Accuracy")
grid on

Цикл по каждому из типов слоя активации и обучает нейронную сеть. Для каждого типа слоя активации:

  • Создайте указатель на функцию activationLayer это создает слой активации.

  • Создайте новую сеть SqueezeNet без весов и замените слои активации (слои ReLU) со слоями типа слоя активации с помощью указателя на функцию activationLayer.

  • Замените итоговый слой свертки нейронной сети с одним определением количества классов входных данных.

  • Обновите график точности валидации путем установки OutputFcn свойство опций обучения возражает против указателя на функцию, представляющего updatePlot функция с анимированной линией, соответствующей типу слоя активации.

  • Обучайтесь и время сеть с помощью trainNetwork функция.

for i = 1:numel(activationLayerTypes)
    activationLayerType = activationLayerTypes(i);
    
    % Determine activation layer type.
    switch activationLayerType
        case "relu"
            activationLayer = @reluLayer;
        case "leaky-relu"
            activationLayer = @leakyReluLayer;
        case "elu"
            activationLayer = @eluLayer;
        case "swish"
            activationLayer = @swishLayer;
    end
    
    % Create SqueezeNet layer graph.
    lgraph = squeezenet('Weights','none');
    
    % Replace activation layers.
    if activationLayerType ~= "relu"
        layers = lgraph.Layers;
        for j = 1:numel(layers)
            if isa(layers(j),'nnet.cnn.layer.ReLULayer')
                layerName = layers(j).Name;
                layer = activationLayer('Name',activationLayerType+"_new_"+j);
                lgraph = replaceLayer(lgraph,layerName,layer);
            end
        end
    end
    
    % Specify number of classes in final convolution layer.
    layer = convolution2dLayer([1 1],numClasses,'Name','conv10');
    lgraph = replaceLayer(lgraph,'conv10',layer);
    
    % Specify custom plot function.
    options.OutputFcn = @(info) updatePlot(info,line(i));
    
    % Train the network.
    start = tic;
    [net{i},info{i}] = trainNetwork(augimdsTrain,lgraph,options);
    elapsed(i) = toc(start);
end

Визуализируйте учебные времена в столбчатой диаграмме.

figure
bar(categorical(activationLayerTypes),elapsed)
title("Training Time")
ylabel("Time (seconds)")

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

Функция построения графика

updatePlot функционируйте берет в качестве входа информационную структуру info и обновляет график валидации, заданный анимированной линией line.

function updatePlot(info,line)

if ~isempty(info.ValidationAccuracy)
    addpoints(line,info.Iteration,info.ValidationAccuracy);
    drawnow limitrate
end

end

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

| | | |

Похожие темы