dlupdate

使用自定义功能更新参数

描述

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

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

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

[___X1,...,XM] = dlupdate(开玩笑___返回多个输出X1,...,XM什么时候开玩笑是一个函数句柄函数返回m + 1个输出值。

例子

全部收缩

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

创建示例的输入数据。

DLX = dlarray(兰特(100,100,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(DLY,则params);结束

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

负荷训练数据

负荷训练数据的位数。

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

定义网络

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

层= [imageInputLayer([28 28 1],'名称'“输入”'意思',平均值(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在本实施例的末尾列出。该函数PARAMparamGradient中,可学习参数和损失相对于该参数,分别与返回更新的参数使用随机梯度下降算法的梯度,表示为

θ + 1 = θ - α Ë θ

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

指定培训选项

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

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

在GPU上火车,如果可用。使用GPU需要并行计算工具箱™和启用CUDA®GPUNVIDIA®计算能力3.0或更高版本。

执行环境=“汽车”;

初始化速度参数。

learnRate = 0.001;

初始化训练进度情节。

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

列车网络

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

对于历元= 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。如果(执行环境==“汽车”&& 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');如果(执行环境==“汽车”&& 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需要PARAMparamGradient中,可学习参数和损失相对于分别该参数的梯度,并返回使用随机梯度下降算法更新的参数,表示为

θ + 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