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

Этот пример показывает, как создать пользовательское Он, инициализация веса функционирует для слоев свертки, сопровождаемых текучими слоями 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

  • Слой Classificaiton

Для каждого из сверточных слоев, набор инициализатор весов к функции 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™, и CUDA® включил графический процессор с, вычисляют возможность 3.0 или выше). В противном случае это использует центральный процессор. Можно также задать среду выполнения при помощи аргумента пары "имя-значение" '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.

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

|

Похожие темы