exponenta event banner

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

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

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

В этом примере показано, как сравнивать точность проверки при обучении нейронной сети SqueeEc при использовании уровней ReLU, leaky ReLU, ELU и swish-активации, а также сравнивать точность, заданную набором подтверждающих изображений.

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

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

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

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

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

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

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

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

Разделите хранилище данных таким образом, чтобы в каждой категории обучающего набора было 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);

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

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

Создание пользовательской функции печати

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

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

Укажите параметры обучения

Укажите параметры обучения:

  • Поезд с использованием мини-партии размером 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, leaky ReLU, ELU и swish выполните обучение сети SqueeeNet.

Укажите типы слоев активации.

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 создает слой активации.

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

  • Замените конечный сверточный слой нейросети на слой, указывающий количество классов входных данных.

  • Обновите график точности проверки, установив OutputFcn свойство объекта training options к дескриптору функции, представляющему 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 и swish, имеющими несколько более высокие значения. Использование слоев активации swish сходится в меньшем количестве итераций. По сравнению с другими слоями активности использование слоев ЗЭС делает точность проверки сходимой в большем количестве итераций и требует большего времени вычислений.

Функция печати

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

function updatePlot(info,line)

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

end

См. также

| | | |

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