这个例子展示了如何为卷积层和漏的ReLU层创建一个自定义He权重初始化函数。
卷积层和泄漏ReLU层的He初始化式来自于均值和方差为零的正态分布
,在那里一个是在卷积层之后漏出的ReLU层的规模和n = FilterSize(1) * FilterSize(2) * NumChannels
.
对于可学习的层,当设置选项“WeightsInititializer”
,“InputWeightsInitializer”
,或“RecurrentWeightsInitializer”
来“他”
,该软件使用一个= 0.设置一个对于不同的值,创建一个自定义函数作为权重初始化器使用。
将数字样本数据加载为图像数据存储。的imageDatastore
函数根据文件夹名称自动为图像标上标签。
digitDatasetPath = fullfile (matlabroot,“工具箱”,“nnet”,“nndemos”,...“nndatasets”,“DigitDataset”);imd = imageDatastore (digitDatasetPath,...“IncludeSubfolders”,真的,...“LabelSource”,“foldernames”);
将数据划分为训练和验证数据集,这样,训练集中的每个类别包含750张图像,验证集包含每个标签的剩余图像。splitEachLabel
将数据存储分割为两个新的数据存储,用于培训和验证。
numTrainFiles = 750;[imdsTrain, imdsValidation] = splitEachLabel (imd, numTrainFiles“随机”);
定义卷积神经网络体系结构:
图像输入层大小为[28 28 1]
,输入图像的大小
三个二维卷积层,分别为3和8、16和32个滤波器
在每个卷积层后面有一个泄漏的ReLU层
全连通层大小为10,班级数
Softmax层
分类层
对于每个卷积层,将权值初始化式设置为leakyHe
函数。的leakyHe
函数(列在示例末尾)接受输入深圳
(层权重的大小),并返回由卷积层的He初始化器给出的权重数组,后面是一个泄漏的ReLU层。
inputSize = [28 28 1];numClasses = 10;图层= [imageInputLayer(inputSize)]卷积2dlayer (3,8,“WeightsInitializer”@leakyHe) leakyReluLayer convolution2dLayer(3, 16岁,“WeightsInitializer”32岁的@leakyHe) leakyReluLayer convolution2dLayer (3“WeightsInitializer”,@leakyHe) leakyReluLayer fullconnectedlayer (numClasses) softmaxLayer classificationLayer];
指定培训选项并培训网络。为四个时代训练。为了防止梯度爆炸,设置梯度阈值为2。每个时代验证一次网络。查看培训进度图。
默认情况下,trainNetwork
如果有,使用GPU,否则使用CPU。GPU上的培训需要并行计算工具箱™和支持的GPU设备。金宝app有关支持的设备的信息,请参见金宝app不同版本金宝app的GPU支持(并行计算工具箱).方法还可以指定执行环境“ExecutionEnvironment”
的名称-值对参数trainingOptions
.
maxEpochs = 4;miniBatchSize = 128;numObservations =元素个数(imdsTrain.Files);numIterationsPerEpoch = floor(numObservations / miniBatchSize);选择= trainingOptions (“个”,...“MaxEpochs”maxEpochs,...“MiniBatchSize”miniBatchSize,...“GradientThreshold”,2,...“ValidationData”imdsValidation,...“ValidationFrequency”numIterationsPerEpoch,...“详细”假的,...“阴谋”,“训练进步”);[netDefault, infoDefault] = trainNetwork (imdsTrain层,选项);
对验证数据进行分类,计算分类精度。
YPred =分类(netDefault imdsValidation);YValidation = imdsValidation.Labels;精度=平均值(YPred == YValidation)
精度= 0.9684
的leakyHe
函数接受可选的输入参数规模
.要在自定义权重初始化函数中输入额外的变量,请将该函数指定为接受单个输入的匿名函数深圳
.为此,请替换实例@leakyHe
与@(深圳)leakyHe(深圳、规模)
.在这里,匿名函数接受单个输入参数深圳
只调用leakyHe
使用指定的规模
输入参数。
创建和训练与之前相同的网络,进行以下更改:
对于泄漏的ReLU层,指定刻度倍增器为0.01。
初始化卷积层的权值leakyHe
函数,并指定缩放倍增器。
规模= 0.01;图层= [imageInputLayer(inputSize)]卷积2dlayer (3,8,“WeightsInitializer”,@(sz) leakyReluLayer(scale)卷积2dlayer (3,16,“WeightsInitializer”,@(sz) leakyReluLayer(scale)卷积2dlayer (3,32,“WeightsInitializer”,@(sz) leakyHe(sz,scale)) leakyReluLayer(scale) fullconnectedlayer (numClasses) softmaxLayer classificationLayer];[netCustom, infoCustom] = trainNetwork (imdsTrain层,选项);
对验证数据进行分类,计算分类精度。
YPred =分类(netCustom imdsValidation);YValidation = imdsValidation.Labels;精度=平均值(YPred == YValidation)
精度= 0.9456
的信息结构输出提取验证准确性trainNetwork
函数。
validationAccuracy = [infoDefault.ValidationAccuracy;infoCustom.ValidationAccuracy];
验证精度的向量包含南
对于没有计算验证精度的迭代。删除南
值。
idx =所有(isnan (validationAccuracy));validationAccuracy (:, idx) = [];
对于每个网络,根据验证精度绘制epoch号。
figure epochs = 0:maxEpochs;情节(时代,validationAccuracy)标题(“验证准确性”)包含(“时代”) ylabel (“验证准确性”)传说([“他漏(默认)”“他漏(自定义)”),“位置”,“东南”)
的leakyHe
函数接受输入深圳
(层权重的大小),并返回由卷积层的He初始化器给出的权重数组,后面是一个泄漏的ReLU层。该函数还接受可选的输入参数规模
它指定了漏电ReLU层的放大倍数。
函数重量= leakyHe(深圳、规模)%如果没有指定,则使用默认比例= 0.1如果Nargin < 2量表= 0.1;结束filterSize = [sz(1) sz(2)];numChannels =深圳(3);numIn = filterSize(1) * filterSize(2) * numChannels;varWeights = 2 / ((1 + scale^2) * numIn);/ /权重= randn(sz) *√(varWeights);结束
何凯明,张翔宇,任少清,孙健。“深入研究整流器:在图像网络分类方面超越人类水平的表现”在IEEE计算机视觉国际会议论文集, 1026 - 1034页。2015.