В этом примере показано, как сравнить точность обучения нейронные сети с 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
trainingOptions
| trainNetwork
| reluLayer
| leakyReluLayer
| swishLayer