主要内容

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的);

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

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

计算梯度使用helper函数卷积运算convGradients定义在这个例子。

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

定义正则化因子。

L1Factor = 0.001;

创建一个匿名函数的梯度。通过使用一个匿名函数通过函数标量常数,可以避免扩大恒定值相同的大小和结构作为参数变量。

param L1Regularizer = @(研究生)毕业生+ L1Factor。*标志(参数);

使用dlupdate应用正则化函数的梯度。

梯度= dlupdate (L1Regularizer、渐变参数);

的梯度毕业生现在根据函数正规化L1Regularizer

convGradients函数

convGradientshelper函数卷积操作的可学的参数和mini-batch输入数据dlX,并返回梯度对可学的参数。

函数梯度= convGradients (dlX params)海底= 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”20岁的)convolution2dLayer (3“填充”,1“名字”,“conv2”)reluLayer (“名字”,“relu2”20岁的)convolution2dLayer (3“填充”,1“名字”,“conv3”)reluLayer (“名字”,“relu3”)fullyConnectedLayer (numClasses“名字”,“俱乐部”)softmaxLayer (“名字”,“softmax”));lgraph = layerGraph(层);

创建一个dlnetwork对象的层图。

dlnet = dlnetwork (lgraph);

定义模型梯度函数

创建一个helper函数modelGradients年底上市,这个例子。函数接受一个dlnetwork对象dlnet和mini-batch输入数据dlX与相应的标签Y,并返回损失和损失的梯度对可学的参数dlnet

定义了随机梯度下降功能

创建一个helper函数sgdFunction年底上市,这个例子。的函数参数paramGradient可学的参数和损失对参数的梯度,分别并返回更新后的参数使用随机梯度下降算法,表示为

θ l + 1 = θ - - - - - - α E ( θ l )

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

指定培训选项

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

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

指定学习速率。

learnRate = 0.01;

火车在GPU上,如果一个是可用的。使用GPU需要并行计算工具箱™和支持GPU设备。金宝app支持设备的信息,请参阅金宝appGPU的金宝app支持版本(并行计算工具箱)

executionEnvironment =“汽车”;

可视化培训进展阴谋。

情节=“训练进步”;

列车网络的

火车模型使用自定义训练循环。对于每一个时代,洗牌和遍历mini-batches数据的数据。通过调用更新网络参数dlupdate与函数sgdFunction定义在这个例子。在每个时代,显示培训进展。

初始化培训进展阴谋。

如果情节= =“训练进步”图lineLossTrain = animatedline (“颜色”[0.85 0.325 0.098]);ylim([0正])包含(“迭代”)ylabel (“损失”网格)结束

培训网络。

迭代= 0;开始=抽搐;时代= 1:numEpochs%洗牌数据。idx = randperm(元素个数(YTrain));XTrain = XTrain (:,:,:, idx);YTrain = YTrain (idx);i = 1: numIterationsPerEpoch迭代=迭代+ 1;%读mini-batch数据和标签转换为假%变量。idx =(张)* miniBatchSize + 1:我* miniBatchSize;X = XTrain (:,:,:, idx);Y = 0 (numClasses miniBatchSize,“单一”);c = 1: numClasses Y (c, YTrain (idx) = =类(c)) = 1;结束% dlarray mini-batch的数据转换。dlX = dlarray(单(X),“SSCB”);%如果训练在GPU,然后将数据转换成一个gpuArray。如果(executionEnvironment = =“汽车”& & canUseGPU) | | executionEnvironment = =“图形”dlX = gpuArray (dlX);结束%计算模型使用dlfeval和梯度和损失% modelGradients helper函数。(渐变,亏损)= dlfeval (@modelGradients, dlnet dlX Y);%更新网络参数使用SGD算法中定义% sgdFunction helper函数。updateFcn = @ (dlnet梯度)sgdFunction (dlnet、渐变learnRate);dlnet = dlupdate (updateFcn dlnet,梯度);%显示培训进展。如果情节= =“训练进步”D =持续时间(0,0,toc(开始),“格式”,“hh: mm: ss”);addpoints (lineLossTrain、迭代、双(收集(extractdata(损失))))标题(”时代:“+时代+”,过去:“+ drawnow字符串(D))结束结束结束

测试网络

测试模型的分类精度通过比较测试集上的预测与真正的标签。

[XTest,欧美]= digitTest4DArrayData;

将数据转换成dlarray维度的格式“SSCB”。GPU预测,也将数据转换成gpuArray

dlXTest = dlarray (XTest,“SSCB”);如果(executionEnvironment = =“汽车”& & canUseGPU) | | executionEnvironment = =“图形”dlXTest = gpuArray (dlXTest);结束

使用分类图像dlnetwork对象,使用预测函数和找到类最高的分数。

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

评估分类精度。

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

模型梯度函数

辅助函数modelGradients需要一个dlnetwork对象dlnet和mini-batch输入数据dlX与相应的标签Y,并返回损失和损失的梯度对可学的参数dlnet。自动计算梯度,使用dlgradient函数。

函数(渐变,亏损)= modelGradients向前(dlnet dlX Y) dlYPred = (dlnet dlX);损失= crossentropy (dlYPred Y);梯度= dlgradient(损失、dlnet.Learnables);结束

随机梯度下降函数

辅助函数sgdFunction需要可学的参数参数的梯度参数对损失梯度和学习速率learnRate,并返回更新后的参数使用随机梯度下降算法,表示为

θ l + 1 = θ - - - - - - α E ( θ l )

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

函数参数= sgdFunction(参数梯度,learnRate)参数=参数- learnRate。*梯度;结束

输入参数

全部折叠

功能适用于可学的参数,指定为一个函数处理。

dlupdate评估有趣的每个网络可学的参数作为输入。有趣的评估多少次就有可学的参数数组dlnet参数个数

网络,作为一个指定dlnetwork对象。

功能更新dlnet.Learnables财产的dlnetwork对象。dlnet.Learnables是一个表有三个变量:

  • ——层名称指定为一个字符串标量。

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

  • 价值值的参数,指定为一个细胞包含一个数组dlarray

网络可学的参数,指定为一个dlarray细胞,一个数值数组,数组,一个结构或一个表。

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

  • ——层名称指定为一个字符串标量。

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

  • 价值值的参数,指定为一个细胞包含一个数组dlarray

您可以指定参数个数作为一个容器的使用单元阵列可学的你的网络参数,结构,或表,或嵌套细胞数组或结构。细胞内的可学的参数数组,结构,或表必须dlarray或数值数据类型

输入参数A1,…,一个必须提供相同的数据类型,排序,和字段(结构)或变量(表)参数个数

数据类型:||结构体||细胞

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

的具体形式A1,…,一个取决于输入网络或可学的参数。下面的表显示了所需的格式A1,…,一个可能的输入dlupdate

输入 可学的参数 A1,…,一个
dlnet dlnet.Learnables包含,参数,价值变量。的价值变量由细胞包含每个可学的参数作为数组dlarray 表具有相同数据类型、变量和订购dlnet.LearnablesA1,…,一个必须有一个价值包含额外的变量组成的细胞数组函数的输入参数有趣的适用于每个可学的参数。
参数个数 dlarray dlarray相同的数据类型和顺序参数个数
数字数组 数字数组具有相同数据类型和顺序参数个数
单元阵列 单元阵列具有相同的数据类型,结构,和订购参数个数
结构 结构相同的数据类型、字段和订购参数个数
,参数,价值变量。的价值变量必须包含细胞包含每个可学的参数作为数组dlarray 表具有相同数据类型、变量和排序参数个数A1,…,一个必须有一个价值包含额外的变量组成的细胞数组函数的输入参数有趣的适用于每个可学的参数。

输出参数

全部折叠

网络,作为一个返回dlnetwork对象。

功能更新dlnet.Learnables财产的dlnetwork对象。

网络可学的参数更新,作为一个返回dlarray细胞,一个数值数组,数组,结构,或一个表价值包含网络的更新可学的参数变量。

额外的输出参数的函数有趣的,在那里有趣的是一个函数句柄函数返回多个输出,返回dlarray对象、数字阵列单元数组,结构,或表价值变量。

的具体形式X1,…, Xm取决于输入网络或可学的参数。下面的表显示了返回的格式X1,…, Xm可能的输入dlupdate

输入 可学的参数 X1,…, Xm
dlnet dlnet.Learnables包含,参数,价值变量。的价值变量由细胞包含每个可学的参数作为数组dlarray 表具有相同数据类型、变量和订购dlnet.LearnablesX1,…, Xm有一个价值包含额外的变量组成的细胞阵列输出参数的函数有趣的对每个可学的应用参数。
参数个数 dlarray dlarray相同的数据类型和顺序参数个数
数字数组 数字数组具有相同数据类型和顺序参数个数
单元阵列 单元阵列具有相同的数据类型,结构,和订购参数个数
结构 结构相同的数据类型、字段和订购参数个数
,参数,价值变量。的价值变量必须包含细胞包含每个可学的参数作为数组dlarray 表具有相同的数据类型,变量。和订购参数个数X1,…, Xm有一个价值包含额外的变量组成的细胞阵列输出参数的函数有趣的对每个可学的应用参数。

扩展功能

介绍了R2019b