dlupdate

使用自定义功能更新参数

描述

dlnet= dlupdate(开玩笑dlnet更新的可学习的参数dlnetwork宾语dlnet通过评估功能开玩笑使用每个可学习的参数作为输入。开玩笑是函数的函数句柄,该函数接受一个参数数组作为输入参数并返回更新后的参数数组。

PARAMS= dlupdate(开玩笑PARAMS更新可学习的参数PARAMS通过评估功能开玩笑使用每个可学习的参数作为输入。

[___] = dlupdate(开玩笑___A1,...,一还指定了除以前语法中的输入参数外的其他输入参数开玩笑是一个函数句柄需要一个函数n + 1个输入值。

[___X1,…, Xm] = dlupdate(开玩笑___返回多个输出X1,…, Xm开玩笑是一个函数句柄函数返回m + 1个输出值。

例子

全部收缩

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

创建示例的输入数据。

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

初始化卷积运算的可以学习的参数。

params.Weights = dlarray(兰特(10,10,3,50));params.Bias = dlarray(兰特(50,1));

使用辅助函数计算卷积运算的梯度convGradients在本实施例的端部限定。

梯度= dlfeval(@ convGradients,DLX,则params);

定义正则化因子。

L1Factor = 0.001;

创建一个规则化的梯度匿名函数。通过使用匿名功能传递一个标量常数的函数,就可以避免扩大恒定值相同的尺寸和结构作为参数变量。

L1Regularizer = @(毕业,PARAM)毕业+ L1Factor *符号(PARAM)。

利用dlupdate将正则化函数应用到每个梯度上。

梯度= dlupdate(L1Regularizer,梯度,则params);

在梯度毕业生现在是根据函数正则化了吗L1Regularizer

convGradients功能

convGradients辅助函数使用卷积运算的可以学习的参数和一个小批量的输入数据的DLX,并返回梯度相对于所述可学习参数。

功能梯度= convGradients(DLX,则params)DLY = dlconv(DLX,params.Weights,params.Bias);DLY =总和(DLY,'所有');毕业生= dlgradient(海底,params);结束

利用dlupdate使用自定义更新功能来训练网络实现的随机梯度下降算法(没有动量)。

负荷训练数据

加载数字训练数据。

[XTrain,YTrain] = digitTrain4DArrayData;类=类别(YTrain);numClasses = numel(类);

定义网络

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

图层= [imageInputLayer([28281]),'名称'“输入”“的意思是”意味着(XTrain 4)) convolution2dLayer(5年,20年'名称''CONV1')reluLayer('名称'“relu1”)convolution2dLayer(3,20,“填充”,1'名称''CONV2')reluLayer('名称''relu2')convolution2dLayer(3,20,“填充”,1'名称''conv3')reluLayer('名称''relu3')fullyConnectedLayer(numClasses,'名称''FC')];lgraph = layerGraph(层);

创建一个dlnetwork对象从层图。

dlnet = dlnetwork(lgraph);

定义模型梯度函数

创建辅助函数modelGradients,列于本例末尾。该功能需要一个dlnetwork宾语dlnet和小批量的输入数据的DLX与相应的标签ÿ,返回损耗和损失相对于在梯度的可学习参数dlnet

定义随机梯度下降功能

创建辅助函数sgdFunction,列于本例末尾。的函数参数paramGradient中,可学习参数和损失相对于该参数,分别与返回更新的参数使用随机梯度下降算法的梯度,表示为

θ + 1 = θ - α Ë θ

哪里 是迭代次数, α > 0 是学习率, θ 是参数向量,并 Ë θ 为损失函数。

指定培训选项

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

miniBatchSize = 128;numEpochs = 20;numObservations = numel(YTrain);numIterationsPerEpoch =地板(numObservations./miniBatchSize);

在GPU上训练,如果有的话。使用GPU需要并行计算工具箱™和CUDA®启用NVIDIA®GPU计算能力3.0或更高。

执行环境=“汽车”;

初始化速度参数。

learnRate = 0.001;

初始化训练进度情节。

地块=“训练进度”;如果地块==“训练进度”迭代= 1;图lineLossTrain = animatedline;xlabel(“总迭代”)ylabel(“失利”结束

列车网络

培养使用自定义的训练循环模型。对于每一个时代,洗牌对数据的小批量数据和循环。更新通过调用网络参数dlupdate与功能sgdFunction定义在本例的末尾。在每个epoch结束时,显示训练进度。

对于历元= 1:numEpochs%随机数据。IDX = randperm(numel(YTrain));XTrain = XTrain(:,:,:,IDX);YTrain = YTrain(IDX);对于I = 1:numIterationsPerEpoch数据的读%小批量和转换标签哑%变量。IDX =(I-1)* miniBatchSize + 1:我* miniBatchSize;X = XTrain(:,:,:,IDX);Y =零(numClasses,miniBatchSize,“单一”);对于C = 1:numClasses Y(C,YTrain(IDX)==类(C))= 1;结束将小批数据转换为dlarray。DLX = dlarray(单(X),'SSCB');%如果在GPU上训练,然后数据转换为gpuArray。如果(executionEnvironment = =“汽车”&& canUseGPU)||执行环境==“GPU”DLX = gpuArray(DLX);结束%评估模型梯度和损失使用dlfeval和%modelGradients助手功能。[毕业,损耗] = dlfeval(@ modelGradients,dlnet,DLX,Y);%更新使用SGD算法的网络参数中所定义的% sgdFunction辅助函数。dlnet = dlupdate(@ sgdFunction,dlnet,毕业);%显示训练进度。如果地块==“训练进度”addpoints(lineLossTrain,迭代,双(聚(ExtractData由(亏损))))标题(“训练中的损失:新纪元-”+划时代+”;迭代——“+ I)的DrawNow迭代=迭代+ 1;结束结束结束

测试网络

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

[XTest, YTest] = digitTest4DArrayData;

转换数据到dlarray与尺寸格式'SSCB'。对于GPU的预测,也将数据转换为gpuArray

dlXTest = dlarray(XTEST,'SSCB');如果(executionEnvironment = =“汽车”&& canUseGPU)||执行环境==“GPU”dlXTest = gpuArray(dlXTest);结束

要使用图像分类dlnetwork对象,使用预测工作,并找到得分最高的类。

dlYPred =预测(dlnet,dlXTest);[〜,IDX] = MAX(ExtractData由(dlYPred),[],1);YPred =类(IDX);

评估分类的准确性。

精度=平均值(YPred == YTest)
精度= 0.7282

型号渐变功能

辅助函数modelGradients需要dlnetwork宾语dlnet和小批量的输入数据的DLX与相应的标签ÿ,返回损耗和损失相对于在梯度的可学习参数dlnet。自动计算梯度,使用dlgradient功能。

功能[梯度,损耗] = modelGradients(dlnet,DLX,Y)= dlYPred向前(dlnet,DLX);dlYPred = SOFTMAX(dlYPred);损耗= crossentropy(dlYPred,Y);梯度= dlgradient(损失,dlnet.Learnables);结束

随机梯度下降功能

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

θ + 1 = θ - α Ë θ

哪里 是迭代次数, α > 0 是学习率, θ 是参数向量,并 Ë θ 为损失函数。

功能PARAM = sgdFunction(PARAM,paramGradient)learnRate = 0.01;。PARAM =参数 -  learnRate * paramGradient;结束

输入参数

全部收缩

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

dlupate评估板开玩笑与每个网络可学习参数作为输入。开玩笑被评价为因为有在可学习的参数的阵列多次dlnet要么PARAMS

网络,指定为dlnetwork宾语。

功能更新dlnet.Learnables财产的dlnetwork宾语。dlnet.Learnables是三个变量的表:

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

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

  • - 参数的值,指定为包含单元阵列的dlarray

网络可学习参数,指定为dlarray,数字阵列,单元阵列,结构,或一个表。

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

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

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

  • - 参数的值,指定为包含单元阵列的dlarray

您可以指定PARAMS作为使用单元阵列,结构或表,或嵌套单元阵列或结构为网络可以学习的参数的容器。单元阵列内的可学习参数,结构或表必须dlarray数据类型的或数值要么

输入参数毕业必须提供完全相同的数据类型,排序和字段(结构)或变量(表)作为PARAMS

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

附加的输入参数开玩笑,指定为dlarray的物体,数字阵列,单元阵列,结构,或与表变量。

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

输入 可学的参数 A1,...,一
dlnet 表格dlnet.Learnables参数变量。该变量由包含每个可学习的参数作为单元阵列的dlarray 表使用相同的数据类型,变量和排序为dlnet.LearnablesA1,...,一必须有一个由单元格数组组成的变量,该单元格数组包含函数的附加输入参数开玩笑适用于每一个可以学习的参数。
PARAMS dlarray dlarray具有相同的数据类型和排序为PARAMS
数值数组 数值数组相同的数据类型和排序为PARAMS
单元阵列 具有与之相同的数据类型、结构和顺序的单元格数组PARAMS
结构体 使用与之相同的数据类型、字段和顺序的结构PARAMS
参数变量。该变量必须由单元格数组组成,其中包含作为参数的每个可学习参数dlarray 表具有相同的数据类型,变量和排序为PARAMSA1,...,一必须有一个由单元格数组组成的变量,该单元格数组包含函数的附加输入参数开玩笑适用于每一个可以学习的参数。

输出参数

全部收缩

网络,返回为dlnetwork宾语。

功能更新dlnet.Learnables财产的dlnetwork宾语。

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

从该函数的附加输出参数开玩笑,在那里开玩笑是一个函数句柄返回多个输出,返回作为函数dlarray的物体,数字阵列,单元阵列,结构,或与表变量。

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

输入 可学的参数 X1,…, Xm
dlnet 表格dlnet.Learnables参数变量。该变量由包含每个可学习的参数作为单元阵列的dlarray 表使用相同的数据类型,变量和排序为dlnet.LearnablesX1,…, Xm有个由单元格数组组成的变量,该单元格数组包含函数的附加输出参数开玩笑应用于每个可学习的参数。
PARAMS dlarray dlarray具有相同的数据类型和排序为PARAMS
数值数组 数值数组相同的数据类型和排序为PARAMS
单元阵列 具有与之相同的数据类型、结构和顺序的单元格数组PARAMS
结构体 使用与之相同的数据类型、字段和顺序的结构PARAMS
参数变量。该变量必须由单元格数组组成,其中包含作为参数的每个可学习参数dlarray 表使用相同的数据类型,变量。和订购为PARAMSX1,…, Xm有个变量由包含该函数的附加输出参数单元阵列的开玩笑应用于每个可学习的参数。

扩展功能

介绍了在R2019b