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

В этом примере показано, как сравнить точность обучения нейронные сети с 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');

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

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

  • Случайным образом масштабируйте изображения максимум на 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 опция обучения и задает функцию, которая обновляет график с предоставленной учебной информацией.

Создайте функцию, которая берет информационную структуру, обеспеченную учебным процессом, и обновляет анимированный линейный график. 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 и слоями свиста, имеющими немного выше значения. Используя свист слои активации включает сходимость в меньшем количестве итераций. Когда по сравнению с другими слоями активации, использование слоев ELU заставляет точность валидации сходиться в большем количестве итераций и требует большего количества времени вычисления.

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

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

function updatePlot(info,line)

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

end

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

| | | |

Похожие темы