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

В этом примере показано, как создать пользовательское Он, инициализация веса функционирует для слоев свертки, сопровождаемых текучими слоями ReLU.

Он инициализатор для слоев свертки, сопровождаемых текучими выборками слоев ReLU от нормального распределения с нулевым средним значением и отклонением σ2=2(1+a2)n, где шкалы текучего слоя ReLU, который следует за слоем свертки и n = FilterSize(1) * FilterSize(2) * NumChannels.

Для learnable слоев, при установке опций 'WeightsInititializer', 'InputWeightsInitializer', или 'RecurrentWeightsInitializer' к 'he', программное обеспечение использует a=0. Чтобы установить на различное значение, создайте пользовательскую функцию, чтобы использовать в качестве инициализатора весов.

Загрузка данных

Загрузите выборочные данные цифры как datastore изображений. imageDatastore функционируйте автоматически помечает изображения на основе имен папок.

digitDatasetPath = fullfile(matlabroot,'toolbox','nnet','nndemos', ...
    'nndatasets','DigitDataset');
imds = imageDatastore(digitDatasetPath, ...
    'IncludeSubfolders',true, ...
    'LabelSource','foldernames');

Разделите данные на наборы данных обучения и валидации, так, чтобы каждая категория в наборе обучающих данных содержала 750 изображений, и набор валидации содержит остающиеся изображения от каждой метки. splitEachLabel разделяет datastore в два новых хранилища данных для обучения и валидации.

numTrainFiles = 750;
[imdsTrain,imdsValidation] = splitEachLabel(imds,numTrainFiles,'randomize');

Архитектура сети Define

Задайте архитектуру сверточной нейронной сети:

  • Отобразите входной размер слоя [28 28 1], размер входных изображений

  • Три 2D слоя свертки с размером фильтра 3 и с 8, 16, и 32 фильтра соответственно

  • Текучий слой ReLU после каждого сверточного слоя

  • Полносвязный слой размера 10, количество классов

  • Слой Softmax

  • Слой Classification

Для каждого из сверточных слоев, набор инициализатор весов к leakyHe функция. leakyHe функция, перечисленная в конце примера, берет вход sz (размер весов слоя), и возвращает массив весов, данных Им Инициализатор для слоев свертки, сопровождаемых текучим слоем ReLU.

inputSize = [28 28 1];
numClasses = 10;

layers = [
    imageInputLayer(inputSize)
    convolution2dLayer(3,8,'WeightsInitializer',@leakyHe)
    leakyReluLayer
    convolution2dLayer(3,16,'WeightsInitializer',@leakyHe)
    leakyReluLayer
    convolution2dLayer(3,32,'WeightsInitializer',@leakyHe)
    leakyReluLayer
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer];

Обучение сети

Задайте опции обучения и обучите сеть. Обучайтесь в течение четырех эпох. Чтобы препятствовать тому, чтобы градиенты взорвались, установите порог градиента к 2. Проверьте сеть однажды в эпоху. Просмотрите график процесса обучения.

По умолчанию, trainNetwork использует графический процессор, если вы доступны, в противном случае, он использует центральный процессор. Обучение на графическом процессоре требует Parallel Computing Toolbox™ и поддерживаемого устройства графического процессора. Для получения информации о поддерживаемых устройствах смотрите Поддержку графического процессора Релизом (Parallel Computing Toolbox). Можно также задать среду выполнения при помощи 'ExecutionEnvironment' аргумент пары "имя-значение" trainingOptions.

maxEpochs = 4;
miniBatchSize = 128;
numObservations = numel(imdsTrain.Files);
numIterationsPerEpoch = floor(numObservations / miniBatchSize);

options = trainingOptions('sgdm', ...
    'MaxEpochs',maxEpochs, ...
    'MiniBatchSize',miniBatchSize, ...
    'GradientThreshold',2, ...
    'ValidationData',imdsValidation, ...
    'ValidationFrequency',numIterationsPerEpoch, ...
    'Verbose',false, ...
    'Plots','training-progress');

[netDefault,infoDefault] = trainNetwork(imdsTrain,layers,options);

Тестирование сети

Классифицируйте данные о валидации и вычислите точность классификации.

YPred = classify(netDefault,imdsValidation);
YValidation = imdsValidation.Labels;
accuracy = mean(YPred == YValidation)
accuracy = 0.9684

Задайте дополнительные опции

leakyHe функция принимает дополнительный входной параметр scale. Чтобы ввести дополнительные переменные в пользовательскую функцию инициализации веса, задайте функцию как анонимную функцию, которая принимает один вход sz. Для этого замените экземпляры @leakyHe с @(sz) leakyHe(sz,scale). Здесь, анонимная функция принимает один входной параметр sz только и вызовы leakyHe функция с заданным scale входной параметр.

Создайте и обучите ту же сеть как прежде со следующими изменениями:

  • Для текучих слоев ReLU задайте масштабный множитель 0,01.

  • Инициализируйте веса сверточных слоев с leakyHe функционируйте и также задайте масштабный множитель.

scale = 0.01;

layers = [
    imageInputLayer(inputSize)
    convolution2dLayer(3,8,'WeightsInitializer',@(sz) leakyHe(sz,scale))
    leakyReluLayer(scale)
    convolution2dLayer(3,16,'WeightsInitializer',@(sz) leakyHe(sz,scale))
    leakyReluLayer(scale)
    convolution2dLayer(3,32,'WeightsInitializer',@(sz) leakyHe(sz,scale))
    leakyReluLayer(scale)
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer];

[netCustom,infoCustom] = trainNetwork(imdsTrain,layers,options);

Классифицируйте данные о валидации и вычислите точность классификации.

YPred = classify(netCustom,imdsValidation);
YValidation = imdsValidation.Labels;
accuracy = mean(YPred == YValidation)
accuracy = 0.9456

Сравните результаты

Извлеките точность валидации из информационных структур выход от trainNetwork функция.

validationAccuracy = [
    infoDefault.ValidationAccuracy;
    infoCustom.ValidationAccuracy];

Векторы из точности валидации содержат NaN для итераций, что точность валидации не была вычислена. Удалите NaN значения.

idx = all(isnan(validationAccuracy));
validationAccuracy(:,idx) = [];

Для каждой из сетей постройте числа эпохи против точности валидации.

figure
epochs = 0:maxEpochs;
plot(epochs,validationAccuracy)
title("Validation Accuracy")
xlabel("Epoch")
ylabel("Validation Accuracy")
legend(["Leaky He (Default)" "Leaky He (Custom)"],'Location','southeast')

Пользовательская функция инициализации веса

leakyHe функционируйте берет вход sz (размер весов слоя), и возвращает массив весов, данных Им Инициализатор для слоев свертки, сопровождаемых текучим слоем ReLU. Функция также принимает дополнительный входной параметр scale который задает масштабный множитель для текучего слоя ReLU.

function weights = leakyHe(sz,scale)

% If not specified, then use default scale = 0.1
if nargin < 2
    scale = 0.1;
end

filterSize = [sz(1) sz(2)];
numChannels = sz(3);
numIn = filterSize(1) * filterSize(2) * numChannels;

varWeights = 2 / ((1 + scale^2) * numIn);
weights = randn(sz) * sqrt(varWeights);

end

Библиография

  1. Он, Kaiming, Сянюй Чжан, Шаоцин Жэнь и Цзянь Сунь. "Копаясь глубоко в выпрямителях: Превосходная эффективность человеческого уровня на imagenet классификации". В Продолжениях международной конференции IEEE по вопросам компьютерного зрения, стр 1026-1034. 2015.

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

|

Похожие темы