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