dlupdate.

使用自定义函数更新参数

描述

例子

dlnet= dlupdate (有趣的dlnet更新可知的参数数据链路网络目的dlnet通过评估功能有趣的将每个可学习参数作为输入。有趣的函数的函数句柄,该函数将一个参数数组作为输入参数,并返回更新的参数数组。

参数= dlupdate (有趣的参数更新中的可学习参数参数通过评估功能有趣的将每个可学习参数作为输入。

[___] = dlupdate(有趣的___A1,…,一个在以下情况下,除了先前语法中的输入参数外,还指定其他输入参数:有趣的是一个函数句柄,该函数需要n + 1输入值。

[___X1,…,Xm] = dlupdate(有趣的___返回多个输出X1,…,Xm什么时候有趣的函数句柄是返回函数的句柄吗m + 1输出值。

例子

全部收缩

对参数梯度结构执行L1正则化。

创建示例输入数据。

dlX=dlarray(兰特(100100,3),'SSC');

初始化卷积操作的可学习参数。

参数个数。重量= dlarray(兰德(10、10 3 50));参数个数。偏见= dlarray(兰德(50,1));

使用辅助函数计算卷积运算的梯度convGradients,在此示例结束时定义。

毕业生= dlfeval (@convGradients、dlX params);

定义正则化因子。

L1Factor = 0.001;

创建一个匿名函数来规范梯度。通过使用匿名函数向函数传递标量常量,可以避免将常量值扩展为与参数变量相同的大小和结构。

l1regularizer = @(毕业,param)毕业+ l1factor。*符号(param);

使用dlupdate.将正则化函数应用于每个渐变。

Grads = Dlupdate(L1Regularizer,Grads,Params);

的梯度毕业生现在已根据函数对其进行正则化L1Regularizer.

convGradients函数

convGradients辅助函数接受卷积操作的可学习参数和一小批输入数据DLX.,并相对于可知参数返回梯度。

函数d = dlconv(dlX,params. weights,params. bias);海底=总和(海底,'全部');梯度=dlgradient(dlY,params);结尾

使用dlupdate.使用自定义更新函数培训网络,该函数实现随机梯度下降算法(没有势头)。

负荷训练数据

加载数字训练数据。

[xtrain,ytrain] = DigitTrain4darraydata;Classes =类别(YTrain);numclasses = numel(类);

定义网络

定义网络架构并使用该网络架构指定平均图像值“中庸”图像输入层中的选项。

层=[imageInputLayer([28 1],'姓名''输入'“中庸”,平均(XTrain,4))卷积2层(5,20,'姓名'“conv1”)剥离('姓名'“relu1”)卷积2层(3,20,“填充”1.'姓名''conv2')剥离('姓名'“relu2”)卷积2层(3,20,“填充”1.'姓名''conv3')剥离('姓名'“relu3”) fullyConnectedLayer (numClasses'姓名'“俱乐部”));lgraph = layerGraph(层);

创建一个数据链路网络对象从图层图中删除。

dlnet = dlnetwork(3);

定义模型渐变函数

创建helper函数模型梯度,列在本例末尾。该函数a数据链路网络目的dlnet以及一小批输入数据DLX.有相应的标签y,并返回关于可学习参数的丢失和损失的渐变dlnet

定义随机梯度下降函数

创建helper函数sgdFunction,列在本例末尾。该函数paramparamGradient,可学习参数和相对于该参数的损耗的渐变,并使用随机梯度血换算法返回更新的参数,表示为

θ L. + 1 = θ - α E. θ L.

在哪里 L. 是迭代号码, α > 0. 是学习率, θ 是参数矢量,还有 E. θ 是损失函数。

指定培训选项

指定培训期间要使用的选项。

miniBatchSize = 128;numEpochs = 20;numObservations =元素个数(YTrain);numIterationsPerEpoch =地板(numObservations. / miniBatchSize);

在GPU上训练(如果有)。使用GPU需要并行计算工具箱™ 以及支持CUDA®的NVIDIA®GPU,具有3.0或更高的计算能力。

executionenvironment =“自动”;

初始化速度参数。

learnRate=0.001;

初始化培训进度图。

plots =.“训练进步”;如果情节= =“训练进步”迭代= 1;figure lineLossTrain = animatedline;包含(“总迭代”) ylabel (“损失”结尾

火车网络

使用自定义训练循环训练模型。对于每个epoch,洗牌数据并在小批数据上循环。通过调用来更新网络参数dlupdate.用这个功能sgdFunction在本例末尾定义。在每个历元末尾,显示培训进度。

为了时代= 1:numEpochs%洗牌数据。idx = randperm(元素个数(YTrain));XTrain = XTrain (:,:,:, idx);YTrain = YTrain (idx);为了我= 1:numIterationsPerEpoch%读取迷你批次数据并将标签转换为虚拟%变量。IDX =(I-1)*小匹匹配+ 1:i *小匹匹配;x = XTrain(::::,IDX);y =零(numcrasses,minibatchsize,“单身”);为了c = 1:numclasses y(c,ytrain(idx)==类(c))= 1;结尾%将小批量数据转换为dlarray。dlx = dlarray(单(x),“SSCB”);%如果在GPU上培训,则将数据转换为GPUArray。如果(b)执行环境==“自动”&& canusegpu)||executionenvironment ==.“图形”dlX = gpuArray (dlX);结尾使用dlfeval和%MASEMGRADENTERS帮助函数。[毕业,损失] = dlfeval(@ maposgradients,dlnet,dlx,y);%使用中定义的SGD算法更新网络参数%sgdFunction辅助函数。dlnet = dlupdate(@ sgdfunction,dlnet,毕业);%显示培训进度。如果情节= =“训练进步”Addpoints(LineLoStrain,迭代,Double(收集(提取数据(丢失))))标题(“训练期间的损失:历元-+ epoch +“迭代——”+ i)绘制迭代=迭代+ 1;结尾结尾结尾

测试网络

通过将测试集上的预测与真实标签进行比较,检验模型的分类精度。

[XTest,YTest]=Digittest4ArrayData;

将数据转换为dlarray.具有维度格式“SSCB”。对于GPU预测,还将数据转换为agpuArray

dlxtest = dlarray(xtest,“SSCB”);如果(b)执行环境==“自动”&& canusegpu)||executionenvironment ==.“图形”dlXTest = gpuArray (dlXTest);结尾

使用a对图像进行分类数据链路网络对象,使用预测函数查找得分最高的类。

dlypred =预测(Dlnet,dlxtest);[〜,idx] = max(提取数据(dlypred),[],1);Ypred =类(IDX);

评估分类准确度。

精度=均值(Ypred == ytest)
精度=0.7282

模型梯度函数

辅助函数模型梯度需要一个数据链路网络目的dlnet以及一小批输入数据DLX.有相应的标签y,并返回关于可学习参数的丢失和损失的渐变dlnet。要自动计算渐变,请使用dlgradient功能。

函数[gradient,loss] = modelGradients(dlnet,dlX,Y)dlYPred = softmax (dlYPred);损失= crossentropy (dlYPred Y);梯度= dlgradient(损失、dlnet.Learnables);结尾

随机梯度下降功能

辅助函数sgdFunction需要paramparamGradient,分别得到一个可学习参数和损失相对于该参数的梯度,并使用随机梯度下降算法返回更新后的参数,表示为

θ L. + 1 = θ - α E. θ L.

在哪里 L. 是迭代号码, α > 0. 是学习率, θ 是参数矢量,还有 E. θ 是损失函数。

函数param = sgdfunction(param,paramgradient)学习= 0.01;param = param  - 学习。* paramgradient;结尾

输入参数

全部收缩

要应用于可学习参数的函数,指定为函数句柄。

dlupate评估有趣的使用每个网络被动参数作为输入。有趣的根据有多少次评估,因为有学习参数阵列dlnet参数

网络,指定为数据链路网络对象。

函数更新dlnet.learnables.财产数据链路网络对象。dlnet.learnables.是一个带有三个变量的表:

  • —层名,指定为字符串标量。

  • 范围-参数名称,指定为字符串标量。

  • 价值—parameter的值,指定为包含a的单元格数组dlarray.

网络学习参数,指定为adlarray.,数值数组、单元格数组、结构或表。

如果您指定参数作为一个表,它必须包含以下三个变量。

  • —层名,指定为字符串标量。

  • 范围-参数名称,指定为字符串标量。

  • 价值—parameter的值,指定为包含a的单元格数组dlarray.

您可以指定参数使用单元格数组、结构或表或嵌套单元格数组或结构作为网络的可学习参数的容器。单元格数组、结构或表中的可学习参数必须为dlarray.或数据类型的数值双重的

输入参数研究生必须提供完全相同的数据类型,排序和字段(用于结构)或变量(表格)参数

数据类型:|双重的|塑造|表格|细胞

额外的输入参数有趣的,指明为dlarray.对象,数字阵列,单元格阵列,结构或表格价值变量。

确切的形式A1,…,一个取决于输入网络或可学习参数。下表显示了A1,…,一个对于可能的输入dlupdate.

输入 可学习参数 A1,…,一个
dlnet 桌子dlnet.learnables.包含范围,价值变量价值变量由包含每个可学习参数的单元格数组组成dlarray. 表与相同的数据类型,变量和订购为dlnet.learnables.A1,…,一个必须有一个价值由包含函数附加输入参数的单元格数组组成的变量有趣的应用于每个可学习的参数。
参数 dlarray. dlarray.具有相同的数据类型和订购参数
数字数组 数字数组与相同的数据类型和订购为参数
细胞阵列 数据类型、结构和顺序与参数
结构 结构的数据类型、字段和顺序与参数
范围,价值变量价值变量必须由包含每个可学习参数的单元格数组组成dlarray. 表具有相同的数据类型、变量和排序参数A1,…,一个必须有一个价值由包含函数附加输入参数的单元格数组组成的变量有趣的应用于每个可学习的参数。

输出参数

全部收缩

网络,作为一个返回数据链路网络对象。

函数更新dlnet.learnables.财产数据链路网络对象。

更新了网络学习参数,返回为adlarray.,数值数组、单元格数组、结构或带有价值包含网络更新的可学习参数的变量。

来自函数的其他输出参数有趣的哪里有趣的是返回多个输出的函数的函数句柄,返回为dlarray.对象,数字阵列,单元格阵列,结构或表格价值变量。

确切的形式X1,…,Xm取决于输入网络或学习参数。下表显示了返回的格式X1,…,Xm对于可能的输入dlupdate.

输入 可学习参数 X1,…,Xm
dlnet 桌子dlnet.learnables.包含范围,价值变量价值变量由包含每个可学习参数的单元格数组组成dlarray. 表与相同的数据类型,变量和订购为dlnet.learnables.X1,…,Xm有一个价值由包含函数附加输出参数的单元格数组组成的变量有趣的应用于每个可学习参数。
参数 dlarray. dlarray.具有相同的数据类型和订购参数
数字数组 数字数组与相同的数据类型和订购为参数
细胞阵列 数据类型、结构和顺序与参数
结构 结构的数据类型、字段和顺序与参数
范围,价值变量价值变量必须由包含每个可学习参数的单元格数组组成dlarray. 表与相同的数据类型,变量。并订购参数X1,…,Xm有一个价值变量,由包含函数的附加输出参数的单元格数组组成有趣的应用于每个可学习参数。

扩展能力

在R2019B中介绍