主要内容

adamupdate

使用自适应矩估计(Adam)更新参数

描述

使用自适应矩估计(Adam)算法更新自定义训练回路中的网络可学习参数。

请注意

该函数应用Adam优化算法更新自定义训练循环中的网络参数,该训练循环使用定义为的网络dlnetwork对象或模型函数。如果你想训练一个定义为数组或作为LayerGraph,使用以下功能:

例子

dlnetaverageGradaverageSqGrad= adamupdate()dlnet研究生averageGradaverageSqGrad迭代更新网络的可学习参数dlnet用亚当算法。在训练循环中使用此语法迭代地更新定义为dlnetwork对象。

例子

参数个数averageGradaverageSqGrad= adamupdate()参数个数研究生averageGradaverageSqGrad迭代更新中的可学习参数参数个数用亚当算法。在训练循环中使用此语法迭代地更新使用函数定义的网络的可学习参数。

例子

___= adamupdate()___learnRategradDecaysqGradDecayε除了前面语法中的输入参数外,还指定用于全局学习率、梯度衰减、平方梯度衰减和小常数epsilon的值。

例子

全部折叠

以全局学习率执行单个自适应矩估计更新步骤0.05的梯度衰减因子0.75的梯度衰减因子的平方0.95

将参数和参数梯度创建为数字数组。

Params = rand(3,3,4);Grad = ones(3,3,4);

初始化第一次迭代的迭代计数器、平均梯度和平均梯度的平方。

迭代= 1;averageGrad = [];averageSqGrad = [];

为全局学习率、梯度衰减因子和平方梯度衰减因子指定自定义值。

learnRate = 0.05;gradDecay = 0.75;sqGradDecay = 0.95;

使用更新可学习参数adamupdate

[params, averaggrad,averageSqGrad] = adamupdate(params,grad, averageSqGrad, averageSqGrad,迭代,learnRate,gradDecay,sqGradDecay);

更新迭代计数器。

迭代=迭代+ 1;

使用adamupdate用亚当算法训练一个网络。

负荷训练数据

加载数字训练数据。

[XTrain,YTrain] = digitTrain4DArrayData;class = categories(YTrain);numClasses = nummel (classes);

定义网络

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

layers = [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(layers);

创建一个dlnetwork对象从层图。

Dlnet = dlnetwork(lgraph);

定义模型梯度函数

创建辅助函数modelGradients,在示例末尾列出。函数取adlnetwork对象dlnet还有一小批输入数据dlX有相应的标签Y,并返回损失以及损失相对于中可学习参数的梯度dlnet

指定培训方案

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

miniBatchSize = 128;nummepochs = 20;numobobservations = numel(YTrain);numIterationsPerEpoch = floor(nummobobservations ./miniBatchSize);

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

executionEnvironment =“汽车”

将训练过程形象化。

情节=“训练进步”

列车网络的

使用自定义训练循环训练模型。对于每个epoch,打乱数据并循环小批数据。更新网络参数adamupdate函数。在每个epoch结束时,显示训练进度。

初始化训练进度图。

如果情节= =“训练进步”figure lineLossTrain = animatedline(“颜色”,[0.85 0.325 0.098]);Ylim ([0 inf]) xlabel(“迭代”) ylabel (“损失”网格)结束

初始化平均梯度和平均梯度的平方。

averageGrad = [];averageSqGrad = [];

训练网络。

迭代= 0;Start = tic;epoch = 1: nummepochs% Shuffle数据。idx = randperm(nummel (YTrain));XTrain = XTrain(:,:,:,idx);YTrain = YTrain(idx);i = 1:numIterationsPerEpoch迭代=迭代+ 1;读取小批量数据并将标签转换为虚拟%变量。idx = (i-1)*miniBatchSize+1:i*miniBatchSize;X = XTrain(:,:,:,idx);Y = 0 (numClasses, miniBatchSize,“单一”);c = 1:numClasses Y(c,YTrain(idx)==classes(c)) = 1;结束将小批量数据转换为数组。dlX = dlarray(single(X));“SSCB”);如果在GPU上训练,那么将数据转换为gpuArray。如果(executionEnvironment = =“汽车”&& canUseGPU) || executionEnvironment ==“图形”dlX = gpuArray(dlX);结束%使用dlfeval和% modelGradients辅助函数。[grad,loss] = dlfeval(@modelGradients,dlnet,dlX,Y);使用Adam优化器更新网络参数。[dlnet,averageGrad,averageSqGrad] = adamupdate(dlnet,grad,averageGrad,averageSqGrad,迭代);%显示培训进度。如果情节= =“训练进步”D = duration(0,0,toc(start));“格式”“hh: mm: ss”);addpoints (lineLossTrain、迭代、双(收集(extractdata(损失))))标题(”时代:“+ epoch +“,流逝:”+ string(D)) drawnow结束结束结束

测试网络

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

[XTest, YTest] = digitTest4DArrayData;

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

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

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

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

评估分类的准确性。

准确度=平均值(YPred==YTest)
精度= 0.9896

模型梯度函数

modelGradients辅助函数接受dlnetwork对象dlnet还有一小批输入数据dlX有相应的标签Y,并返回损失以及损失相对于中可学习参数的梯度dlnet。要自动计算梯度,请使用dlgradient函数。

函数[gradients,loss] = modelGradients(dlnet,dlX,Y) dlYPred = forward(dlnet,dlX);loss = crossentropy(dlYPred,Y);gradients = dlgradient(loss,dlnet.Learnables);结束

输入参数

全部折叠

网络,指定为adlnetwork对象。

函数更新dlnet。可学的的性质dlnetwork对象。dlnet。可学的是一个包含三个变量的表:

  • -层名,以字符串标量形式指定。

  • 参数-参数名称,以字符串标量形式指定。

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

输入参数研究生必须是一个表格的相同形式dlnet。可学的

网络可学习参数,指定为adlarray例如,数字数组、单元格数组、结构或表。

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

  • -层名,以字符串标量形式指定。

  • 参数-参数名称,以字符串标量形式指定。

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

你可以指定参数个数作为可学习参数的容器,使用单元数组、结构或表,或嵌套单元数组或结构。单元格数组、结构或表中的可学习参数必须为dlarray或数据类型的数值

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

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

损失的梯度,用a表示dlarray例如,数字数组、单元格数组、结构或表。

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

输入 可学的参数 梯度
dlnet 表格dlnet。可学的包含参数,价值变量。的价值变量由单元格数组组成,单元格数组包含每个可学习的参数dlarray 具有相同数据类型、变量和排序的表dlnet。可学的研究生一定有。价值由单元数组组成的变量,单元数组包含每个可学习参数的梯度。
参数个数 dlarray dlarray具有相同的数据类型和顺序参数个数
数字数组 具有相同数据类型和顺序的数值数组参数个数
单元阵列 具有相同数据类型、结构和顺序的单元格数组参数个数
结构 结构具有相同的数据类型、字段和排序参数个数
参数,价值变量。的价值变量必须由单元格数组组成,单元格数组包含每个可学习的参数dlarray 具有相同数据类型、变量和排序的表参数个数研究生一定有。价值由单元数组组成的变量,单元数组包含每个可学习参数的梯度。

你可以获得研究生从电话到dlfeval对包含调用的函数求值dlgradient。有关更多信息,请参见在深度学习工具箱中使用自动微分

参数梯度的移动平均值,指定为空数组,adlarray例如,数字数组、单元格数组、结构或表。

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

输入 可学的参数 平均梯度
dlnet 表格dlnet。可学的包含参数,价值变量。的价值变量由单元格数组组成,单元格数组包含每个可学习的参数dlarray 具有相同数据类型、变量和排序的表dlnet。可学的averageGrad一定有。价值由单元数组组成的变量,其中包含每个可学习参数的平均梯度。
参数个数 dlarray dlarray具有相同的数据类型和顺序参数个数
数字数组 具有相同数据类型和顺序的数值数组参数个数
单元阵列 具有相同数据类型、结构和顺序的单元格数组参数个数
结构 结构具有相同的数据类型、字段和排序参数个数
参数,价值变量。的价值变量必须由单元格数组组成,单元格数组包含每个可学习的参数dlarray 具有相同数据类型、变量和排序的表参数个数averageGrad一定有。价值由单元数组组成的变量,其中包含每个可学习参数的平均梯度。

如果你指定averageGradaverageSqGrad作为空数组,该函数假定没有先前的梯度,并以与一系列迭代中的第一次更新相同的方式运行。要迭代更新可学习参数,请使用averageGrad的前一个调用的输出adamupdate随着averageGrad输入。

参数梯度平方的移动平均值,指定为空数组,adlarray例如,数字数组、单元格数组、结构或表。

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

输入 可学的参数 平均平方梯度
dlnet 表格dlnet。可学的包含参数,价值变量。的价值变量由单元格数组组成,单元格数组包含每个可学习的参数dlarray 具有相同数据类型、变量和排序的表dlnet。可学的averageSqGrad一定有。价值由单元数组组成的变量,单元数组包含每个可学习参数的平均平方梯度。
参数个数 dlarray dlarray具有相同的数据类型和顺序参数个数
数字数组 具有相同数据类型和顺序的数值数组参数个数
单元阵列 具有相同数据类型、结构和顺序的单元格数组参数个数
结构 结构具有相同的数据类型、字段和排序参数个数
参数,价值变量。的价值变量必须由单元格数组组成,单元格数组包含每个可学习的参数dlarray 具有相同数据类型、变量和排序的表参数个数averageSqGrad一定有。价值由单元数组组成的变量,单元数组包含每个可学习参数的平均平方梯度。

如果你指定averageGradaverageSqGrad作为空数组,该函数假定没有先前的梯度,并以与一系列迭代中的第一次更新相同的方式运行。要迭代更新可学习参数,请使用averageSqGrad的前一个调用的输出adamupdate随着averageSqGrad输入。

迭代数,指定为正整数。第一次打电话给adamupdate,使用值为1。你必须增加迭代通过1对于一系列调用中的每个后续调用adamupdate。Adam算法使用这个值来纠正一组迭代开始时移动平均线的偏差。

全局学习率,指定为正标量。的默认值。learnRate0.001

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

梯度衰减因子,指定为之间的正标量01。的默认值。gradDecay0.9

平方梯度衰减因子,指定为正标量之间01。的默认值。sqGradDecay0.999

用于防止被零除错误的小常数,指定为正标量。的默认值。ε1 e-8

输出参数

全部折叠

网络,返回为dlnetwork对象。

函数更新dlnet。可学的的性质dlnetwork对象。

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

更新了参数梯度的移动平均,作为a返回dlarray例如,数字数组、单元格数组、结构或表。

更新了参数梯度平方的移动平均值,作为a返回dlarray例如,数字数组、单元格数组、结构或表。

更多关于

全部折叠

亚当

该函数使用自适应矩估计(Adam)算法更新可学习参数。有关更多信息,请参见Adam算法的定义随机梯度下降trainingOptions参考页面。

扩展功能

在R2019b中引入