主要内容

sgdmupdate

使用随机动量梯度下降(SGDM)更新参数

描述

在自定义训练循环中使用随机梯度动量下降(SGDM)算法更新网络可学习参数。

笔记

该函数在使用定义为的网络的自定义训练循环中,应用SGDM优化算法更新网络参数dlnetwork对象或模型函数。如果要训练定义为数组或作为分层图,使用以下功能:

实例

[数据链路,韦尔]=sgdmupdate(数据链路,毕业生,韦尔)更新网络的可学习参数数据链路使用SGDM算法。在训练循环中使用此语法以迭代方式更新定义为dlnetwork对象

实例

[params,韦尔]=sgdmupdate(params,毕业生,韦尔)更新中的可学习参数params使用SGDM算法。在训练循环中使用此语法以迭代方式更新使用函数定义的网络的可学习参数。

实例

[___]=sgdmupdate(___学习者,推进力)除了前面语法中的输入参数外,还指定要用于全局学习速率和动量的值。

例子

全部崩溃

执行单个SGDM更新步骤,全局学习率为0.05以及0.95

将参数和参数渐变创建为数字数组。

参数=兰德(3,3,4);梯度=一(3,3,4);

初始化第一次迭代的参数速度。

韦尔= [];

指定全局学习速率和动量的自定义值。

learnRate=0.05;动量=0.95;

使用更新可学习的参数sgdmupdate

(params,韦尔)= sgdmupdate (params,研究生,或者,learnRate,动量);

使用sgdmupdate使用SGDM算法训练网络。

负荷训练数据

加载数字训练数据。

[XTrain,YTrain]=digittrain4daraydata;class=categories(YTrain);numclass=numel(classes);

定义网络

定义网络体系结构,并使用“的意思是”选项在图像输入层。

[imageInputLayer([28 28 1],]),“姓名”,“输入”,“的意思是”意味着(XTrain 4)) convolution2dLayer(5年,20年“姓名”,“conv1”)雷卢耶(“姓名”,“relu1”)卷积2层(3,20,“填充”, 1“姓名”,“conv2”)雷卢耶(“姓名”,“relu2”)卷积2层(3,20,“填充”, 1“姓名”,“conv3”)雷卢耶(“姓名”,“relu3”)完全连接层(NumClass,“姓名”,“fc”)软MaxLayer(“姓名”,“softmax”)]; lgraph=层图(层);

创建一个dlnetwork对象从层图。

dlnet=dlnetwork(lgraph);

定义模型梯度函数

创建helper函数modelGradients,列在示例末尾。该函数采用dlnetwork对象数据链路和一小批输入数据dlX与相应的标签Y,并返回与中可学习参数相关的损失和损失梯度数据链路

指定培训选项

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

miniBatchSize=128;numEpochs=20;numObservations=numel(YTrain);NumIteOptionsPerAppch=floor(numObservations./miniBatchSize);

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

执行环境=“自动”;

将培训进度可视化到绘图中。

阴谋=“培训进度”;

列车网络

使用自定义的训练循环训练模型。对于每个历元,洗牌数据并在小批量数据上循环。使用sgdmupdate功能。在每个历元结束时,显示训练进度。

初始化训练进度图。

如果阴谋==“培训进度”figure lineLossTrain=动画线(“颜色”,[0.85 0.325 0.098]);ylim([0 inf])xlabel(“迭代”)伊拉贝尔(“损失”网格)在…上终止

初始化速度参数。

韦尔= [];

培训网络。

迭代= 0;开始=抽搐;对于历元=1:numEpochs%洗牌数据。idx=randperm(numel(YTrain));XTrain=XTrain(:,:,:,idx);YTrain=YTrain(idx);对于i=1:numIterationsPerEpoch迭代=迭代+1;%读取小批量数据并将标签转换为虚拟%变量。idx=(i-1)*miniBatchSize+1:i*miniBatchSize;X=XTrain(:,:,:,idx);Y=零(NumClass、miniBatchSize、,“单一”);对于c=1:numClasses Y(c,YTrain(idx)=classes(c))=1;终止%将小批量数据转换为dlarray。dlX=dlX阵列(单个(X),“SSCB”);%如果在GPU上进行训练,则将数据转换为GPU阵列。如果(executionEnvironment = =“自动”&&canUseGPU)| |执行环境==“gpu”dlX=gpuArray(dlX);终止%使用dlfeval和%modelGradients辅助函数。[梯度,损失]=dlfeval(@modelGradients,dlnet,dlX,Y);%使用SGDM优化器更新网络参数。[dlnet,vel]=sgdmupdate(dlnet,梯度,vel);%显示培训进度。如果阴谋==“培训进度”D=持续时间(0,0,toc(开始),“格式”,“hh:mm:ss”);addpoints (lineLossTrain、迭代、双(收集(extractdata(损失))))标题(“时代:”+纪元+,已过:+字符串(D)现在开始终止终止终止

测试网络

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

[XTest, YTest] = digitTest4DArrayData;

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

dlXTest=dlarray(XTest,“SSCB”);如果(executionEnvironment = =“自动”&&canUseGPU)| |执行环境==“gpu”dlXTest=gpuArray(dlXTest);终止

使用dlnetwork对象,使用预测函数并找到得分最高的类。

dlYPred=predict(dlnet,dlXTest);[~,idx]=max(extractdata(dlYPred),[],1);YPred=classes(idx);

评估分类精度。

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

模型梯度函数

这个modelGradientshelper函数采用dlnetwork对象数据链路和一小批输入数据dlX与相应的标签Y,并返回与中可学习参数相关的损失和损失梯度数据链路。要自动计算渐变,请使用梯度作用

作用[梯度,损失]=模型梯度(dlnet,dlX,Y)dlYPred=正向(dlnet,dlX);损失=交叉熵(dlYPred,Y);梯度=dlgradient(损失,dlnet.Learnables);终止

输入参数

全部崩溃

网络,指定为dlnetwork对象

该函数更新dlnet.Learnables财产的dlnetwork对象dlnet.Learnables是一个包含三个变量的表:

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

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

  • 价值-参数的值,指定为包含dlarray

输入参数毕业生必须是与相同格式的表dlnet.Learnables

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

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

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

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

  • 价值-参数的值,指定为包含dlarray

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

输入参数毕业生必须提供与相同的数据类型、顺序和字段(用于结构)或变量(用于表)params

数据类型:仅有一个的||结构|桌子|单间牢房

损失的梯度,指定为dlarray,数值数组、单元格数组、结构或表。

确切形式毕业生取决于输入网络或可学习参数。下表显示了所需的格式毕业生对于可能的输入sgdmupdate

输入 可学的参数 梯度
数据链路 表格dlnet.Learnables包含,参数价值变量。这个价值变量由单元格数组组成,其中包含每个可学习参数作为dlarray 表的数据类型、变量和顺序与dlnet.Learnables毕业生必须有一个价值由包含每个可学习参数的梯度的单元格数组组成的变量。
params dlarray dlarray具有与相同的数据类型和顺序params
数字数组 数据类型和顺序与params
单元阵列 具有相同的数据类型、结构和顺序的单元格数组params
结构 结构,具有相同的数据类型、字段和顺序params
餐桌,参数价值变量。这个价值变量必须由包含每个可学习参数的单元格数组组成dlarray 具有相同数据类型、变量和顺序的表params毕业生必须有一个价值由包含每个可学习参数的梯度的单元格数组组成的变量。

你可以获得毕业生从打电话到德尔费瓦尔对包含对的调用的函数求值梯度。有关详细信息,请参阅在深度学习工具箱中使用自动微分

参数速度,指定为空数组,adlarray,数值数组、单元格数组、结构或表。

确切形式韦尔取决于输入网络或可学习参数。下表显示了所需的格式韦尔对于可能的输入sgdmpdate

输入 可学的参数 速度
数据链路 表格dlnet.Learnables包含,参数价值变量。这个价值变量由单元格数组组成,其中包含每个可学习参数作为dlarray 表的数据类型、变量和顺序与dlnet.Learnables韦尔必须有一个价值由包含每个可学习参数的速度的单元数组组成的变量。
params dlarray dlarray具有与相同的数据类型和顺序params
数字数组 数据类型和顺序与params
单元阵列 具有相同的数据类型、结构和顺序的单元格数组params
结构 结构,具有相同的数据类型、字段和顺序params
餐桌,参数价值变量。这个价值变量必须由包含每个可学习参数的单元格数组组成dlarray 具有相同数据类型、变量和顺序的表params韦尔必须有一个价值由包含每个可学习参数的速度的单元数组组成的变量。

如果您指定韦尔作为一个空数组,该函数假定没有以前的速度,并以与一系列迭代中第一次更新相同的方式运行韦尔的前一个调用的输出sgdmupdate作为韦尔输入

学习速率,指定为正标量。默认值为学习者0.01

如果将网络参数指定为dlnetwork对象,每个参数的学习速率是全局学习速率乘以网络层中定义的相应学习速率因子属性。

动量,指定为介于01..的默认值推进力0.9

输出参数

全部崩溃

网络,返回为dlnetwork对象

该函数更新dlnet.Learnables财产的dlnetwork对象

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

更新的参数速度,以dlarray,数值数组、单元格数组、结构或表。

更多关于

全部崩溃

带动量的随机梯度下降

该函数使用动量随机梯度下降算法更新可学习参数。有关更多信息,请参阅下动量随机梯度下降算法的定义随机梯度下降法培训选项参考页面。

扩展能力

在R2019b中引入