这个例子展示了如何为卷积层创建自定义权重初始化函数,然后是有漏洞的ReLU层。
卷积层的He初始化器和泄漏的ReLU层从均值和方差为零的正态分布中采样
,在那里一个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 Initializer给出的权值数组,该数组由卷积层的He Initializer和一个有漏洞的ReLU层组成。
inputSize = [28 28 1];numClasses = 10;imageInputLayer = [imageInputLayer(inputSize)]“WeightsInitializer”@leakyHe) leakyReluLayer convolution2dLayer(3, 16岁,“WeightsInitializer”32岁的@leakyHe) leakyReluLayer convolution2dLayer (3“WeightsInitializer”,@ leakyReluLayer fulllyconnectedlayer (numClasses) softmaxLayer classificationLayer];
指定培训选项并对网络进行培训。为四个时代而训练。为了防止渐变发生爆炸,设置渐变阈值为2。每个epoch验证一次网络。查看训练进度图。
默认情况下,trainNetwork
如果GPU可用,则使用GPU,否则使用CPU。GPU上的培训需要并行计算工具箱™和支持的GPU设备。万博1manbetx有关支持的设备的信息,请参见万博1manbetxGPU支万博1manbetx持情况(并行计算工具箱).属性也可以指定执行环境“ExecutionEnvironment”
的名称-值对参数trainingOptions
.
maxEpochs = 4;miniBatchSize = 128;numObservations =元素个数(imdsTrain.Files);numIterationsPerEpoch = floor(nummobations / 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 = [imageInputLayer(inputSize)]“WeightsInitializer”,@(sz) leakyReluLayer(sz,scale) leakyReluLayer(scale) convolution2dLayer(3,16,)“WeightsInitializer”,@(sz) leakyReluLayer(sz,scale) leakyReluLayer(scale) convolution2dLayer(3,32,)“WeightsInitializer”,@(sz) leakyHe(sz,scale) leakyReluLayer(scale) fulllyconnectedlayer (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) = [];
对于每个网络,根据验证精度绘制历元数。
图epochs = 0:maxEpochs;情节(时代,validationAccuracy)标题(“验证准确性”)包含(“时代”) ylabel (“验证准确性”)传说([“他漏(默认)”“他漏(自定义)”],“位置”,“东南”)
的leakyHe
函数接受输入深圳
(层权值的大小),并返回一个由He Initializer给出的权值数组,该数组由卷积层的He Initializer和一个有漏洞的ReLU层组成。该函数还接受可选的输入参数规模
为漏出的ReLU层指定缩放倍增器。
函数重量= leakyHe(深圳、规模)%如果没有指定,则使用默认比例= 0.1如果Nargin < 2 scale = 0.1;结束filterSize = [sz(1) sz(2)];numChannels =深圳(3);numIn = filterSize(1) * filterSize(2) * numChannels;varWeights = 2 / ((1 + scale^2) * numIn);= sz * sqrt(varWeights);结束
何开明,张翔宇,任少青,孙健。《深入整流器:在图像网分类上超越人类水平的表现》在计算机视觉国际会议论文集, 1026 - 1034页。2015.