adamupdate
使用自适应矩估计(Adam)更新参数
语法
描述
使用自适应矩估计(Adam)算法更新自定义训练循环中的网络可学习参数。
请注意
该函数应用Adam优化算法更新自定义训练循环中的网络参数,该循环使用定义为的网络dlnetwork
对象或模型函数。如果你想训练一个被定义为层
数组或作为LayerGraph
,使用以下功能:
创建一个
TrainingOptionsADAM
对象使用trainingOptions
函数。使用
TrainingOptionsADAM
对象的trainNetwork
函数。
[
更新网络的可学习参数netUpdated
,averageGrad
,averageSqGrad
) = adamupdate (网
,研究生
,averageGrad
,averageSqGrad
,迭代
)网
使用亚当算法。在训练循环中使用此语法迭代更新定义为的网络dlnetwork
对象。
[
中的可学习参数参数个数
,averageGrad
,averageSqGrad
) = adamupdate (参数个数
,研究生
,averageGrad
,averageSqGrad
,迭代
)参数个数
使用亚当算法。在训练循环中使用此语法可以迭代更新使用函数定义的网络的可学习参数。
[___) = adamupdate (___
还指定用于全局学习率、梯度衰减、平方梯度衰减和小常数epsilon的值,以及前面语法中的输入参数。learnRate
,gradDecay
,sqGradDecay
,ε
)
例子
更新可学习参数使用adamupdate
执行一个全局学习率为的自适应矩估计更新步骤0.05
的梯度衰减系数0.75
的梯度衰减因子的平方0.95
.
将参数和参数梯度创建为数值数组。
params =兰德(3、3、4);研究生= 1(3、3、4);
为第一次迭代初始化迭代计数器、平均梯度和平均平方梯度。
迭代= 1;averageGrad = [];averageSqGrad = [];
指定全局学习率、梯度衰减因子和梯度衰减因子平方的自定义值。
learnRate = 0.05;gradDecay = 0.75;sqGradDecay = 0.95;
使用更新可学习参数adamupdate
.
[params, averageGrad averageSqGrad] = adamupdate (params,研究生,averageGrad, averageSqGrad,迭代,learnRate, gradDecay, sqGradDecay);
更新迭代计数器。
迭代=迭代+ 1;
列车网络的使用adamupdate
使用adamupdate
用亚当算法训练一个网络。
负荷训练数据
加载数字训练数据。
[XTrain, TTrain] = digitTrain4DArrayData;类=类别(TTrain);numClasses =元素个数(类);
定义网络
方法定义网络并指定平均图像值的意思是
选项在图像输入层。
layers = [imageInputLayer([28 28 1],“的意思是”,均值(XTrain,4))卷积2dlayer (5,20) reluLayer卷积2dlayer (3,20),“填充”20岁的,1)reluLayer convolution2dLayer (3“填充”1) reluLayer fullyConnectedLayer(numClasses) softmaxLayer];
创建一个dlnetwork
对象。
网= dlnetwork(层);
定义模型损失函数
创建helper函数modelLoss
,列在示例的末尾。函数的参数是adlnetwork
对象和带有相应标签的输入数据的小批,并返回损失和损失相对于可学习参数的梯度。
指定培训选项
指定要在培训期间使用的选项。
miniBatchSize = 128;numEpochs = 20;numObservations =元素个数(TTrain);numIterationsPerEpoch =地板(numObservations. / miniBatchSize);
列车网络的
初始化平均梯度和平均梯度的平方。
averageGrad = [];averageSqGrad = [];
计算训练进度监视器的总迭代次数。
numIterations = numEpochs * numIterationsPerEpoch;
初始化TrainingProgressMonitor
对象。因为计时器在创建监视器对象时开始,所以要确保创建的对象接近训练循环。
监控= = trainingProgressMonitor(指标“损失”信息=“时代”包含=“迭代”);
使用自定义训练循环训练模型。对于每个历元,洗牌数据并遍历小批数据。更新网络参数adamupdate
函数。在每次迭代结束时,显示训练进度。
如果有GPU,请使用GPU进行训练。使用GPU需要并行计算工具箱™和支持的GPU设备。有关支持的设备的信息,请参见GPU计算的需求(并行计算工具箱).
迭代= 0;时代= 0;而epoch < numEpochs && ~monitor。停止epoch = epoch + 1;%洗牌数据。idx = randperm(元素个数(TTrain));XTrain = XTrain (:,:,:, idx);TTrain = TTrain (idx);我= 0;而i < numIterationsPerEpoch && ~monitor。停止i = i + 1;迭代=迭代+ 1;读取小批量数据,并将标签转换为虚拟%变量。idx =(张)* miniBatchSize + 1:我* miniBatchSize;X = XTrain (:,:,:, idx);T = 0 (numClasses, miniBatchSize,“单身”);为c = 1:numClasses T(c,TTrain(idx)==classes(c)) = 1;结束将小批数据转换为dlarray。X = dlarray(单(X)“SSCB”);如果在GPU上训练,那么将数据转换为GPU array。如果canUseGPU X = gpuArray(X);结束使用dlfeval和% modelLoss函数。(损失,梯度)= dlfeval (@modelLoss,净,X, T);使用Adam优化器更新网络参数。[净,averageGrad averageSqGrad] = adamupdate(净、渐变averageGrad averageSqGrad,迭代);更新培训进度监视器。recordMetrics(监控、迭代损失=损失);updateInfo(监视、时代=时代+“的”+ numEpochs);班长。进度= 100 *迭代/numIterations;结束结束
测试网络
通过比较测试集上的预测和真实标签来测试模型的分类准确性。
(XTest, tt) = digitTest4DArrayData;
将数据转换为adlarray
使用维度格式“SSCB”
(空间,空间,渠道,批处理)。对于GPU预测,也要将数据转换为agpuArray
.
XTest = dlarray (XTest,“SSCB”);如果canUseGPU XTest = gpuArray(XTest);结束
对图像进行分类dlnetwork
对象,使用预测
找出分数最高的班级。
欧美=预测(净,XTest);[~, idx] = max (extractdata(欧美),[],1);欧美=类(idx);
评估分类的准确性。
精度=意味着(欧美= = tt)
精度= 0.9896
损失函数模型
的modelLoss
Helper函数的参数为dlnetwork
对象网
以及一小批输入数据X
与相应的标签T
,并返回损失和损失相对于可学习参数的梯度网
.方法可自动计算梯度dlgradient
函数。
函数[loss,gradient] = modelLoss(net,X,T) Y = forward(net,X);损失= crossentropy (Y, T);梯度= dlgradient(损失、net.Learnables);结束
输入参数
网
- - - - - -网络
dlnetwork
对象
网络,指定为dlnetwork
对象。
函数更新可学的
财产的dlnetwork
对象。网可学的
是一个包含三个变量的表:
层
-层名,指定为字符串标量。参数
-参数名称,指定为字符串标量。价值
参数的值,指定为包含dlarray
.
输入参数研究生
必须是与?格式相同的表网可学的
.
参数个数
- - - - - -网络可学的参数
dlarray
|数字数组|单元阵列|结构|表格
网络可学习参数,指定为dlarray
、数字数组、单元格数组、结构或表。
如果您指定参数个数
作为一个表,它必须包含以下三个变量:
层
-层名,指定为字符串标量。参数
-参数名称,指定为字符串标量。价值
参数的值,指定为包含dlarray
.
您可以指定参数个数
作为使用单元格数组、结构或表或嵌套单元格数组或结构的网络的可学习参数的容器。单元格数组、结构或表中的可学习参数必须是dlarray
或数据类型的数值双
或单
.
输入参数研究生
必须提供与?完全相同的数据类型、顺序和字段(对于结构)或变量(对于表)参数个数
.
数据类型:单
|双
|结构体
|表格
|细胞
研究生
- - - - - -损失的梯度
dlarray
|数字数组|单元阵列|结构|表格
损失的梯度,用a表示dlarray
、数字数组、单元格数组、结构或表。
确切的形式研究生
取决于输入网络或可学习参数。的所需格式研究生
可能的输入adamupdate
.
输入 | 可学的参数 | 梯度 |
---|---|---|
网 |
表格网可学的 包含层 ,参数 ,价值 变量。的价值 变量由单元格数组组成,单元格数组将每个可学习参数作为dlarray . |
表的数据类型、变量和排序与网可学的 .研究生 必须有一个价值 由单元格数组组成的变量,单元格数组包含每个可学习参数的梯度。 |
参数个数 |
dlarray |
dlarray 具有相同的数据类型和顺序参数个数 |
数字数组 | 具有相同数据类型和顺序的数值数组参数个数 |
|
单元阵列 | 的数据类型、结构和顺序相同的单元格数组参数个数 |
|
结构 | 结构具有相同的数据类型、字段和顺序参数个数 |
|
表层 ,参数 ,价值 变量。的价值 变量必须由单元格数组组成,单元格数组将每个可学习参数作为dlarray . |
表的数据类型、变量和排序与参数个数 .研究生 必须有一个价值 由单元格数组组成的变量,单元格数组包含每个可学习参数的梯度。 |
你可以获得研究生
从一个电话到dlfeval
函数的值,该函数包含对dlgradient
.有关更多信息,请参见在深度学习工具箱中使用自动区分.
averageGrad
- - - - - -参数梯度的移动平均
[]
|dlarray
|数字数组|单元阵列|结构|表格
参数梯度的移动平均,指定为空数组,adlarray
、数字数组、单元格数组、结构或表。
确切的形式averageGrad
取决于输入网络或可学习参数。的所需格式averageGrad
可能的输入adamupdate
.
输入 | 可学的参数 | 平均梯度 |
---|---|---|
网 |
表格网可学的 包含层 ,参数 ,价值 变量。的价值 变量由单元格数组组成,单元格数组将每个可学习参数作为dlarray . |
表的数据类型、变量和排序与网可学的 .averageGrad 必须有一个价值 由单元格数组组成的变量,单元格数组包含每个可学习参数的平均梯度。 |
参数个数 |
dlarray |
dlarray 具有相同的数据类型和顺序参数个数 |
数字数组 | 具有相同数据类型和顺序的数值数组参数个数 |
|
单元阵列 | 的数据类型、结构和顺序相同的单元格数组参数个数 |
|
结构 | 结构具有相同的数据类型、字段和顺序参数个数 |
|
表层 ,参数 ,价值 变量。的价值 变量必须由单元格数组组成,单元格数组将每个可学习参数作为dlarray . |
表的数据类型、变量和排序与参数个数 .averageGrad 必须有一个价值 由单元格数组组成的变量,单元格数组包含每个可学习参数的平均梯度。 |
如果您指定averageGrad
而且averageSqGrad
作为空数组,该函数假定之前没有梯度,并以与一系列迭代中的第一次更新相同的方式运行。要迭代更新可学习参数,请使用averageGrad
的上一个调用的输出adamupdate
随着averageGrad
输入。
averageSqGrad
- - - - - -参数梯度平方的移动平均
[]
|dlarray
|数字数组|单元阵列|结构|表格
参数梯度的平方的移动平均,指定为空数组,adlarray
、数字数组、单元格数组、结构或表。
确切的形式averageSqGrad
取决于输入网络或可学习参数。的所需格式averageSqGrad
可能的输入adamupdate
.
输入 | 可学的参数 | 平均平方梯度 |
---|---|---|
网 |
表格网可学的 包含层 ,参数 ,价值 变量。的价值 变量由单元格数组组成,单元格数组将每个可学习参数作为dlarray . |
表的数据类型、变量和排序与网可学的 .averageSqGrad 必须有一个价值 由单元格数组组成的变量,单元格数组包含每个可学习参数的平均梯度平方。 |
参数个数 |
dlarray |
dlarray 具有相同的数据类型和顺序参数个数 |
数字数组 | 具有相同数据类型和顺序的数值数组参数个数 |
|
单元阵列 | 的数据类型、结构和顺序相同的单元格数组参数个数 |
|
结构 | 结构具有相同的数据类型、字段和顺序参数个数 |
|
表层 ,参数 ,价值 变量。的价值 变量必须由单元格数组组成,单元格数组将每个可学习参数作为dlarray . |
表具有相同的数据类型、变量和排序参数个数 .averageSqGrad 必须有一个价值 由单元格数组组成的变量,单元格数组包含每个可学习参数的平均梯度平方。 |
如果您指定averageGrad
而且averageSqGrad
作为空数组,该函数假定之前没有梯度,并以与一系列迭代中的第一次更新相同的方式运行。要迭代更新可学习参数,请使用averageSqGrad
的上一个调用的输出adamupdate
随着averageSqGrad
输入。
迭代
- - - - - -迭代数
正整数
迭代次数,指定为正整数。第一次呼叫adamupdate
,使用的值1
.你必须增加迭代
通过1
为一系列呼叫中的每一个后续呼叫adamupdate
.亚当算法使用这个值来纠正移动平均线在一组迭代开始时的偏差。
learnRate
- - - - - -全球学习速率
0.001
(默认)|积极的标量
全局学习率,指定为正标量。的默认值。learnRate
是0.001
.
如果将网络参数指定为dlnetwork
,每个参数的学习率是全局学习率乘以网络层中定义的相应学习率因子属性。
gradDecay
- - - - - -渐变衰减系数
0.9
(默认)|积极的标量之间0
而且1
梯度衰减因子,指定为之间的正标量0
而且1
.的默认值。gradDecay
是0.9
.
sqGradDecay
- - - - - -平方梯度衰减因子
0.999
(默认)|积极的标量之间0
而且1
平方梯度衰减因子,指定为正标量之间0
而且1
.的默认值。sqGradDecay
是0.999
.
ε
- - - - - -小的常数
1 e-8
(默认)|积极的标量
用于防止被零除错误的小常数,指定为正标量。的默认值。ε
是1 e-8
.
输出参数
netUpdated
——更新网络
dlnetwork
对象
更新后的网络,返回为dlnetwork
对象。
函数更新可学的
财产的dlnetwork
对象。
参数个数
—更新网络可学习参数
dlarray
|数字数组|单元数组|结构|表
更新的网络可学习参数,返回为dlarray
类的数字数组、单元格数组、结构或表价值
变量,该变量包含已更新的网络可学习参数。
averageGrad
-更新了参数梯度的移动平均
dlarray
|数字数组|单元数组|结构|表
参数梯度的更新移动平均值,返回为dlarray
、数字数组、单元格数组、结构或表。
averageSqGrad
-更新了参数梯度平方的移动平均值
dlarray
|数字数组|单元数组|结构|表
更新的平方参数梯度的移动平均值,返回为dlarray
、数字数组、单元格数组、结构或表。
更多关于
亚当
该函数采用自适应矩估计(Adam)算法更新可学习参数。有关更多信息,请参见下面的Adam算法的定义随机梯度下降法在trainingOptions
参考页面。
扩展功能
GPU数组
通过使用并行计算工具箱™在图形处理单元(GPU)上运行来加速代码。
使用注意事项和限制:
当以下输入参数中至少有一个是
gpuArray
或者一个dlarray
使用类型的基础数据gpuArray
,该功能运行在GPU上。研究生
averageGrad
averageSqGrad
参数个数
有关更多信息,请参见在图形处理器上运行MATLAB函数(并行计算工具箱).
版本历史
介绍了R2019b
MATLAB命令
你点击了一个对应于这个MATLAB命令的链接:
在MATLAB命令窗口中输入命令来运行该命令。Web浏览器不支持MATLAB命令。
您也可以从以下列表中选择网站:
如何获得最佳的网站性能
选择中国网站(中文或英文)以获得最佳的网站表现。其他MathWorks国家网站没有针对从您的位置访问进行优化。