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