主要内容

dlupdate

使用自定义功能更新参数

描述

例子

DLNET.= dlupdate(乐趣DLNET.更新节点的可学习参数dlnetwork对象DLNET.通过对函数求值乐趣将每个可学习参数作为输入。乐趣是接受一个形参数组作为输入参数并返回更新的形参数组的函数的句柄。

参数个数= dlupdate(乐趣参数个数中可学习参数的更新参数个数通过对函数求值乐趣将每个可学习参数作为输入。

___) = dlupdate (乐趣___A1,......,一个除了前面语法中的输入参数外,还指定了其他的输入参数乐趣是一个函数的函数句柄需要n + 1输入值。

___X1,…,Xm) = dlupdate (乐趣___返回多个输出X1,…,Xm乐趣是返回的函数的函数句柄M + 1输出值。

例子

全部折叠

在参数梯度的结构上执行L1正则化。

创建示例输入数据。

dlX = dlarray (rand (100100 3),SSC的);

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

Params.weights = Dlarray(Rand(10,10,3,50));params.bias = dlarray(rand(50,1));

使用辅助函数计算卷积操作的梯度COMPRADENTERS.,在本例的最后定义。

梯度= dlfeval (@convGradients、dlX params);

定义正则化因子。

l1factor = 0.001;

创建一个正规化渐变的匿名函数。通过使用匿名功能将标量常量传递给函数,可以避免必须将常量值扩展到与参数变量相同的大小和结构。

L1Regularizer = @(grad,param) grad + L1Factor.*sign(param);

dlupdate对每个梯度应用正则化函数。

梯度= dlupdate(l1regularizer,梯度,params);

梯度毕业生现在是根据函数规格化的吗L1Regularizer

COMPRADENTERS.功能

COMPRADENTERS.辅助功能采用卷积操作的学习参数和迷你批次输入数据dlX,并返回相对于可学习参数的梯度。

功能= dlconv(dlX,params. weights,params. bias);海底=总和(海底,“所有”);梯度= dlgradient(海底,params);结束

dlupdate使用自定义更新函数训练网络,该函数实现随机梯度下降算法(无动量)。

负载培训数据

加载数字训练数据。

[XTrain, YTrain] = digitTrain4DArrayData;类=类别(YTrain);numClasses =元素个数(类);

定义网络

定义网络架构并指定图像平均值“的意思是”选项在图像输入层。

[imageInputLayer([28 28 1],]),“名字”“输入”“的意思是”意味着(XTrain 4)) convolution2dLayer(5年,20年“名字”'conv1') reluLayer (“名字”“relu1”)卷积2dlayer(3,20,“填充”, 1“名字”“conv2”) reluLayer (“名字”'relu2')卷积2dlayer(3,20,“填充”, 1“名字”'conv3') reluLayer (“名字”'relu3')全连接列(numcrasses,“名字”'fc') softmaxLayer (“名字”'softmax')];Lgraph = LayerGraph(层);

创建一个dlnetwork对象从层图。

dlnet = dlnetwork (lgraph);

定义模型梯度函数

创建helper函数modelGradients,列在本例的最后。函数接受dlnetwork对象DLNET.和迷你输​​入数据dlX与相应的标签Y,并返回损失和损失相对于中可学习参数的梯度DLNET.

定义随机梯度下降函数

创建helper函数sgdfunction.,列在本例的最后。的函数参数参数,分别为一个可学习参数和损失相对于该参数的梯度,并使用随机梯度下降算法返回更新后的参数,表示为

θ l + 1 θ - α E θ l

在哪里 l 为迭代数, α > 0 为学习速率, θ 是参数向量,和 E θ 为损失函数。

指定培训选项

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

minibatchsize = 128;numepochs = 30;numobservations = numel(ytrain);numiterationsperepoch =楼层(numobservations./minibatchsize);

指定学习率。

学习= 0.01;

在GPU上训练(如果有的话)。使用GPU需要并行计算工具箱™和支持的GPU设备。金宝app有关支持的设备的信息,请参见金宝appGPU支金宝app持情况(并行计算工具箱)

executionEnvironment =“汽车”

在一个情节中想象训练的进展。

情节=“培训 - 进展”

列车网络的

使用自定义训练循环训练模型。对于每个epoch,将数据和循环换掉迷你批次的数据。通过调用更新网络参数dlupdate与函数sgdfunction.在本例的最后定义。在每个纪元的末尾,展示训练的进展情况。

初始化培训进度情节。

如果plots ==“培训 - 进展”图lineloSstrain =动画线(“颜色”[0.85 0.325 0.098]);ylim([0正])包含(“迭代”)ylabel(“损失”网格)结束

培训网络。

迭代= 0;开始=抽搐;epoch = 1:numepochs%Shuffle数据。IDX = RANDPERM(NUMER(YTRAIN));XTrain = XTrain(:,:,:,IDX);YTrain = YTrain(IDX);i = 1:numiterationsperepoch迭代=迭代+ 1;读取小批数据,并将标签转换为假%变量。idx =(张)* miniBatchSize + 1:我* miniBatchSize;X = XTrain (:,:,:, idx);Y = 0 (numClasses, miniBatchSize,“单一”);c = 1:numClasses Y(c,YTrain(idx))==class (c)) = 1;结束%转换小批数据到美元。dlX = dlarray(单(X),“SSCB”);%如果在GPU上进行训练,则将数据转换为gpuArray。如果(executionEnvironment = =“汽车”&& canUseGPU) || executionEnvironment ==“GPU”dlx = gpuarray(dlx);结束%使用dlfeval和dlfeval评估模型渐变和损失%模型梯度辅助功能。[渐变,损失] = DLFeval(@ Maposgradients,Dlnet,DLX,Y);%使用中定义的SGD算法更新网络参数% sgdFunction辅助函数。updatefcn = @(dlnet,渐变)sgdfunction(dlnet,渐变,学习);dlnet = dlupdate(updatefcn,dlnet,渐变);%显示训练进度。如果plots ==“培训 - 进展”d =持续时间(0,0,toc(start),“格式”“hh: mm: ss”);addpoints (lineLossTrain、迭代、双(收集(extractdata(损失))))标题(“时代:”+时代+”,过去:“+字符串(d))绘制结束结束结束

测试网络

通过比较真实标签的测试集的预测来测试模型的分类准确性。

[XTest, YTest] = digitTest4DArrayData;

将数据转换为adlarray使用维度格式“SSCB”.对于GPU预测,也将数据转换为gpuArray

dlXTest = dlarray (XTest,“SSCB”);如果(executionEnvironment = =“汽车”&& canUseGPU) || executionEnvironment ==“GPU”dlxtest = gpuarray(dlxtest);结束

对图像进行分类dlnetwork对象,使用预测函数并找到具有最高分的类。

dlYPred =预测(dlnet dlXTest);[~, idx] = max (extractdata (dlYPred), [], 1);YPred =类(idx);

评估分类精度。

精度=意味着(YPred = =次)
精度= 0.9386

模型梯度函数

辅助函数modelGradients需要一个dlnetwork对象DLNET.和迷你输​​入数据dlX与相应的标签Y,并返回损失和损失相对于中可学习参数的梯度DLNET..要自动计算梯度,请使用dlgradient.函数。

功能[梯度,损失] = Maposgradients(DLNET,DLX,Y)Dlypry =前进(DLNET,DLX);损失=联语(Dlypred,Y);梯度= Dlgradient(损失,DLNET.LEALNABLE);结束

随机梯度下降函数

辅助函数sgdfunction.接受可学习参数参数,即该参数相对于损耗的梯度坡度,以及学习速度学习,并使用随机梯度下降算法返回更新后的参数,表示为

θ l + 1 θ - α E θ l

在哪里 l 为迭代数, α > 0 为学习速率, θ 是参数向量,和 E θ 为损失函数。

功能parameter = sgdFunction(parameter,gradient,learnRate);结束

输入参数

全部折叠

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

dlupdate评估乐趣使用每个网络被动参数作为输入。乐趣中的可学习参数数组被评估的次数等于DLNET.或者参数个数

网络,指定为adlnetwork目的。

函数更新dlnet。可学的财产的dlnetwork目的。dlnet。可学的是一个包含三个变量的表:

  • - 图层名称,指定为字符串标量。

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

  • 价值- 参数值,指定为包含一个单元数组dlarray

网络可学习参数,指定为dlarray,数字阵列,小区阵列,结构或表。

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

  • - 图层名称,指定为字符串标量。

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

  • 价值- 参数值,指定为包含一个单元数组dlarray

您可以指定参数个数作为使用单元格数组,结构或表或嵌套单元格阵列或结构的网络的可读参数的容器。必须是小区阵列,结构或表中的学习参数dlarray或数据类型的数值或者单身的

输入论点A1,......,一个必须提供完全相同的数据类型、顺序和字段(对于结构)或变量(对于表)参数个数

数据类型:单身的||结构体|桌子|细胞

附加的输入参数乐趣,指定为dlarray对象、数字数组、单元格数组、结构或表价值多变的。

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

输入 可学的参数 A1,......,一个
DLNET. 表格dlnet。可学的包含参数, 和价值变量。的价值变量由包含每个被学习参数的单元阵列组成dlarray 具有相同数据类型、变量和顺序的表dlnet。可学的A1,......,一个必须有一个价值变量,由包含函数的附加输入参数的单元格数组组成乐趣适用于每个学习参数。
参数个数 dlarray dlarray具有相同的数据类型和顺序参数个数
数字数组 具有相同数据类型和顺序的数字数组参数个数
单元阵列 具有相同的数据类型、结构和顺序的单元格数组参数个数
结构 结构,具有相同的数据类型、字段和顺序参数个数
参数, 和价值变量。的价值变量必须由包含每个可学习参数的单元格数组组成dlarray 表与相同的数据类型,变量和订购参数个数A1,......,一个必须有一个价值变量,由包含函数的附加输入参数的单元格数组组成乐趣适用于每个学习参数。

输出参数

全部折叠

网络,返回为dlnetwork目的。

函数更新dlnet。可学的财产的dlnetwork目的。

更新的网络可学习参数,返回为dlarray、数字数组、单元格数组、结构或具有价值变量,包含更新后的网络可学习参数。

函数的附加输出参数乐趣,在那里乐趣函数句柄是否为返回多个输出的函数dlarray对象、数字数组、单元格数组、结构或表价值多变的。

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

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

扩展能力

介绍了R2019b