В этом примере показано, как создать пользовательское Он, инициализация веса функционирует для слоев свертки, сопровождаемых текучими слоями ReLU.
Он инициализатор для слоев свертки, сопровождаемых текучими выборками слоев ReLU от нормального распределения с нулевым средним значением и отклонением , где шкалы текучего слоя 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');Задайте архитектуру сверточной нейронной сети:
Отобразите входной размер слоя [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™, и 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
Он, Kaiming, Сянюй Чжан, Шаоцин Жэнь и Цзянь Сунь. "Копаясь глубоко в выпрямителях: Превосходная производительность человеческого уровня на imagenet классификации". В Продолжениях международной конференции IEEE по вопросам компьютерного зрения, стр 1026-1034. 2015.
trainNetwork | trainingOptions