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