adamupdate

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

描述

更新的定制培训循环利用自适应矩估计(亚当)算法的网络可以学习的参数。

注意

此功能适用亚当优化算法来更新网络参数定制培训循环定义为使用网络dlnetwork对象或模型函数。如果你想训练定义为一个网络阵列或作为LayerGraph,使用以下功能:

[dlnetaverageGradaverageSqGrad] = adamupdate(dlnet毕业averageGradaverageSqGrad迭代更新网络的可学习参数dlnet使用ADAM算法。在一次训练中循环使用此语法来迭代更新定义为一个网络dlnetwork目的。

[PARAMSaverageGradaverageSqGrad] = adamupdate(PARAMS毕业averageGradaverageSqGrad迭代中的可学习参数更新PARAMS使用ADAM算法。在一次训练中循环使用此语法来迭代更新使用函数定义网络的可学习的参数。

[___] = adamupdate(___learnRategradDecaysqGradDecayε还规定值以用于全球学习速率,梯度衰减,多梯度腐烂,小恒ε,除了在以前的语法输入参数。

例子

全部收缩

在全局学习率为的情况下进行单步自适应矩估计更新0.05梯度的衰减因子0.75,和的平方的梯度衰减因子0.95

创建的参数和参数的梯度为数字阵列。

PARAMS =兰特(3,3,4);毕业=酮(3,3,4);

初始化迭代计数器,平均梯度,并且对于第一次迭代均方梯度。

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

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

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

更新使用可学习的参数adamupdate

[参数,可以averageGrad,averageSqGrad] = adamupdate(参数,可以为研究所,averageGrad,averageSqGrad,迭代,learnRate,gradDecay,sqGradDecay);

更新迭代计数器。

迭代=迭代+ 1;

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

负荷训练数据

加载数字训练数据。

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

定义网络

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

[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,'名称''FC')];lgraph = layerGraph(层);

创建一个dlnetwork对象从层图。

dlnet = dlnetwork(lgraph);

定义模型梯度函数

创建助手函数modelGradients,在示例的最后列出。函数接受dlnetwork目的dlnet和一小批输入数据DLX与相应的标签Y,并返回损耗和损失相对于在梯度的可学习参数dlnet

指定培训选项

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

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

在GPU上进行训练,如果有的话。使用GPU需要Parallel Computing Toolbox™和支持CUDA®的NVIDIA®GPU,计算能力为3.0或更高。

执行环境=“汽车”;

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

averageGrad = [];averageSqGrad = [];

初始化迭代计数器。

迭代= 1;

初始化训练进度情节。

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

列车网络

培养使用自定义的训练循环模型。对于每一个时代,洗牌对数据的小批量数据和循环。更新使用的网络参数adamupdate功能。在每个历元的端部,显示训练进度。

对于历元= 1:numEpochs%随机数据。idx = randperm(元素个数(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);%使用Adam优化器更新网络参数。[dlnet, averageGrad averageSqGrad] = adamupdate (dlnet,研究生,averageGrad averageSqGrad,迭代);%显示训练进度。如果地块==“训练进度”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.9908

型号渐变功能

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

功能[gradient,loss] = modelGradients(dlnet,dlX,Y);dlYPred = softmax (dlYPred);损失= crossentropy (dlYPred Y);梯度= dlgradient(损失、dlnet.Learnables);结束

输入参数

全部收缩

网络,指定为dlnetwork目的。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

的具体形式毕业取决于输入网络或可学习参数。下表显示所需的格式毕业可能的输入adamupdate

输入 可学的参数 渐变
dlnet 表格dlnet.Learnables参数变量。该变量由包含每个可学习的参数作为单元阵列的dlarray 表使用相同的数据类型,变量和排序为dlnet.Learnables毕业必须有一个变量由包含每个可学习参数的梯度单元阵列。
PARAMS dlarray dlarray具有相同的数据类型和排序为PARAMS
数值数组 数值数组相同的数据类型和排序为PARAMS
单元阵列 具有相同数据类型、结构和排序的单元格数组PARAMS
结构体 具有相同数据类型、字段和排序的结构PARAMS
参数变量。该变量必须由单元格数组组成,单元格数组中包含每个可学习参数dlarray 具有相同数据类型、变量和排序的表PARAMS毕业必须有一个变量由包含每个可学习参数的梯度单元阵列。

你可以获得毕业从调用dlfeval计算结果包含对通话功能dlgradient。欲了解更多信息,请参阅使用自动分化深度学习工具箱

参数梯度的移动平均,指定为空数组,一个dlarray、数字数组、单元数组、结构或表。

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

输入 可学的参数 平均梯度
dlnet 表格dlnet.Learnables参数变量。该变量由包含每个可学习的参数作为单元阵列的dlarray 表使用相同的数据类型,变量和排序为dlnet.LearnablesaverageGrad必须有一个变量由包含每个可学习参数的平均梯度单元阵列。
PARAMS dlarray dlarray具有相同的数据类型和排序为PARAMS
数值数组 数值数组相同的数据类型和排序为PARAMS
单元阵列 具有相同数据类型、结构和排序的单元格数组PARAMS
结构体 具有相同数据类型、字段和排序的结构PARAMS
参数变量。该变量必须由单元格数组组成,单元格数组中包含每个可学习参数dlarray 具有相同数据类型、变量和排序的表PARAMSaverageGrad必须有一个变量由包含每个可学习参数的平均梯度单元阵列。

如果您指定averageGradaverageSqGrad作为空阵列中,函数假定以相同的方式作为用于在一系列的迭代的第一更新没有先前的梯度和运行。为了迭代更新可以学习的参数,使用averageGrad以前调用的输出adamupdate作为averageGrad输入。

平方参数梯度的移动平均,指定为空数组,一个dlarray、数字数组、单元数组、结构或表。

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

输入 可学的参数 平均平方梯度
dlnet 表格dlnet.Learnables参数变量。该变量由包含每个可学习的参数作为单元阵列的dlarray 表使用相同的数据类型,变量和排序为dlnet.LearnablesaverageSqGrad必须有一个由单元数组组成的变量,其中包含每个可学习参数的平均平方梯度。
PARAMS dlarray dlarray具有相同的数据类型和排序为PARAMS
数值数组 数值数组相同的数据类型和排序为PARAMS
单元阵列 具有相同数据类型、结构和排序的单元格数组PARAMS
结构体 具有相同数据类型、字段和排序的结构PARAMS
参数变量。该变量必须由单元格数组组成,单元格数组中包含每个可学习参数dlarray 表具有相同的数据类型,变量和排序为PARAMSaverageSqGrad必须有一个由单元数组组成的变量,其中包含每个可学习参数的平均平方梯度。

如果您指定averageGradaverageSqGrad作为空阵列中,函数假定以相同的方式作为用于在一系列的迭代的第一更新没有先前的梯度和运行。为了迭代更新可以学习的参数,使用averageSqGrad以前调用的输出adamupdate作为averageSqGrad输入。

迭代数,指定为正整数。为第一个呼叫adamupdate,使用值1。你必须增加迭代通过1为每个后续的呼叫在一系列的呼叫中adamupdate。亚当算法在一组迭代的一开始就使用该值来纠正偏差在均线。

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

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

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

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

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

输出参数

全部收缩

网络,返回为dlnetwork目的。

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

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

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

方参数梯度更新均线,返回为dlarray、数字数组、单元数组、结构或表。

更多关于

全部收缩

亚当

该函数使用自适应矩估计(亚当)算法来更新可学习参数。欲了解更多信息,请参阅亚当算法下的定义随机梯度下降法trainingOptions参考页面。

扩展功能

介绍了在R2019b