exponenta event banner

Укажите пользовательскую функцию инициализации веса

В этом примере показано, как создать пользовательскую функцию инициализации He weight для слоев свертки, за которыми следуют протекающие слои ReLU.

Инициализатор He для слоев свертки, за которыми следуют протекающие слои ReLU, отсчитывает из нормального распределения с нулевым средним и дисперсией, (1 + a2) n, где a - масштаб протекающего слоя ReLU, который следует за слоем свертки иn = FilterSize(1) * FilterSize(2) * NumChannels.

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

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

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

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

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

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

Определение сетевой архитектуры

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

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

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

  • Протекающий слой ReLU, следующий за каждым сверточным слоем

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

  • Слой Softmax

  • Классификационный слой

Для каждого из сверточных слоев установите инициализатор весов в значение leakyHe функция. leakyHe функция, перечисленная в конце примера, принимает входные данные sz (размер весов слоя) и возвращает массив весов, задаваемый инициализатором He для слоев свертки, за которым следует слой 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 использует графический процессор, если он доступен, в противном случае использует центральный процессор. Для обучения графическому процессору требуются параллельные вычислительные 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 (размер весов слоя) и возвращает массив весов, задаваемый инициализатором He для слоев свертки, за которым следует слой 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. Он, Каймин, Сянъу Чжан, Шаоцин Жэнь и Цзянь Сунь. «Углубляясь в выпрямители: Превосходя показатели человеческого уровня по классификации имаженетов». В трудах международной конференции IEEE по компьютерному зрению, стр. 1026-1034. 2015.

См. также

|

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