自动差异使得更容易创建自定义培训循环,自定义层和其他深度学习自定义。GydF4y2Ba
一般来说,定制深度学习训练最简单的方法是创建一个GydF4y2Badlnetwork.GydF4y2Ba
.在网络中包含您想要的层。然后使用某种梯度下降在自定义循环中执行训练,其中梯度是目标函数的梯度。目标函数可以是分类误差、交叉熵或网络权值的任何其他相关标量函数。看到GydF4y2Ba支持dlarray的函数列表金宝appGydF4y2Ba.GydF4y2Ba
此示例是自定义训练循环的高级版本。这里,GydF4y2BaFGydF4y2Ba
目标函数,如损失,和GydF4y2BaGGydF4y2Ba
是目标函数相对于网络中权重的梯度GydF4y2Ba净GydF4y2Ba
.这GydF4y2Ba更新GydF4y2Ba
函数表示某种类型的梯度下降。GydF4y2Ba
%高级训练循环GydF4y2Ban = 1;GydF4y2Ba而GydF4y2Ba(n结尾GydF4y2Ba
你叫GydF4y2Badlfeval.GydF4y2Ba
计算目标和渐变的数值。要启用梯度的自动计算,数据GydF4y2BaDLX.GydF4y2Ba
必须是A.GydF4y2Badlarray.GydF4y2Ba
.GydF4y2Ba
dlX = dlarray (X);GydF4y2Ba
目标函数有GydF4y2BadlgradientGydF4y2Ba
呼叫计算渐变。这GydF4y2BadlgradientGydF4y2Ba
呼叫必须在函数的内部GydF4y2Badlfeval.GydF4y2Ba
评估。GydF4y2Ba
函数GydF4y2Ba模型(f, g) =(净dlX T)GydF4y2Ba%计算目标使用支持的dlarray函数金宝appGydF4y2BaY =前进(NET,DLX);f = fcnvalue(y,t);GydF4y2Ba%联字段或类似GydF4y2Bag = dlgradient(f,net.learnables);GydF4y2Ba%自动梯度GydF4y2Ba结尾GydF4y2Ba
对于使用GydF4y2Badlnetwork.GydF4y2Ba
用简单的GydF4y2Badlfeval.GydF4y2Ba
-GydF4y2BadlgradientGydF4y2Ba
-GydF4y2Badlarray.GydF4y2Ba
语法,参见GydF4y2BaGrad-Cam揭示为什么深入学习决策GydF4y2Ba.有关使用自定义培训循环的更复杂示例,请参见GydF4y2Ba火车生成对抗网络(GaN)GydF4y2Ba.有关使用自动差异化的自定义培训的进一步详细信息,请参阅GydF4y2Ba定义自定义训练循环,损失函数和网络GydF4y2Ba.GydF4y2Ba
dlgradientGydF4y2Ba
和GydF4y2Badlfeval.GydF4y2Ba
一起进行自动分化GydF4y2Ba要使用自动差异,您必须致电GydF4y2BadlgradientGydF4y2Ba
函数内部,并使用GydF4y2Badlfeval.GydF4y2Ba
.表示对a求导的点GydF4y2Badlarray.GydF4y2Ba
对象,管理数据结构并启用评估的追踪。例如,RosenBrock函数是优化的常见测试功能。GydF4y2Ba
函数GydF4y2Ba[f,grad] = rosenbrock(x)f = 100 *(x(2) - x(1)。^ 2)。^ 2 +(1 - x(1))。^ 2;Grad = Dlgradient(F,X);GydF4y2Ba结尾GydF4y2Ba
计算点处的Rosenbrock函数的值和梯度GydF4y2BaX0.GydF4y2Ba
=[1, 2]。为了在Rosenbrock函数中实现自动区分,通过GydF4y2BaX0.GydF4y2Ba
作为一个GydF4y2Badlarray.GydF4y2Ba
.GydF4y2Ba
x0 = dlarray ([1, 2]);[fval, gradval] = dlfeval (x0 @rosenbrock)GydF4y2Ba
fval = 1x1 dlarray 104 gradval = 1x2 dlarray 396 200GydF4y2Ba
有关使用自动差异化的示例,请参阅GydF4y2BaGrad-Cam揭示为什么深入学习决策GydF4y2Ba.GydF4y2Ba
数字地评估梯度,aGydF4y2Badlarray.GydF4y2Ba
如上所述,构造用于反向模式差异的数据结构GydF4y2Ba自动差异化背景GydF4y2Ba.此数据结构是GydF4y2Ba跟踪GydF4y2Ba导数的计算。当使用自动微分和派生跟踪时,请记住以下准则:GydF4y2Ba
不要介绍一个新的GydF4y2Badlarray.GydF4y2Ba
在一个目标函数内计算并尝试对该对象进行微分。例如:GydF4y2Ba
函数GydF4y2Ba[dy,dy1] =有趣(x1)x2 = dlarray(0);y = x1 + x2;dy = dlgradient(y,x2);GydF4y2Ba%错误:X2未经许可GydF4y2Bay₁= dlgradient (x1);GydF4y2Ba即使y有一个未跟踪的部分,也没有错误GydF4y2Ba结尾GydF4y2Ba
不使用GydF4y2Ba提取数据GydF4y2Ba
带着追查的论点。这样做打破了跟踪。例如:GydF4y2Ba
Fun = @(x)dlgradient(x + atan(extractdata(x)),x);GydF4y2Ba由于领先的“X”术语,任何点的%梯度都是1。GydF4y2Badlfeval(有趣,dlarray (2.5))GydF4y2Ba
ans = 1x1 dlarray 1GydF4y2Ba
但是,你可以使用GydF4y2Ba提取数据GydF4y2Ba
从因变量中引入新的自变量。GydF4y2Ba
在并行工作时,客户端和工人之间移动跟踪的Dlarray对象会破坏跟踪。跟踪的Dlarray对象将保存在工作者上,并将客户端加载为未分配的DLARRAY对象。为避免并行工作时破坏跟踪,计算工作人员上的所有必需渐变,然后将客户端上的渐变组合在一起。例如,看到GydF4y2Ba列车网络与自定义培训循环平行GydF4y2Ba.GydF4y2Ba
仅使用支持的功能。金宝app有关支持的功能列表,请参阅金宝appGydF4y2Ba支持dlarray的函数列表金宝appGydF4y2Ba.使用不受支持的函数金宝appGydF4y2BaFGydF4y2Ba,尝试实现GydF4y2BaFGydF4y2Ba使用支持的功金宝app能。GydF4y2Ba
您只能对标量值函数使用自动微分来计算梯度。中间计算可以有任意数量的变量,但最终的函数值必须是标量。如果你需要对一个向量值函数求导,每次只对一个分量求导。在本例中,考虑设置GydF4y2BadlgradientGydF4y2Ba
'etaindata'GydF4y2Ba
的名称-值对参数GydF4y2Ba真正的GydF4y2Ba
.GydF4y2Ba
打电话GydF4y2BadlgradientGydF4y2Ba
评估特定点的衍生品。当没有理论值时,该软件通常对衍生物的值进行任意选择。例如,GydF4y2Ba雷GydF4y2Ba
功能,GydF4y2Barelu (x) = max (x, 0)GydF4y2Ba
,是不可微的GydF4y2Bax = 0GydF4y2Ba
.然而,GydF4y2BadlgradientGydF4y2Ba
返回衍生物的值。GydF4y2Ba
x = dlarray(0);Y = DLFeval(@(t)dlgradient(Relu(T),T),x)GydF4y2Ba
y = 1x1 dlarray 0GydF4y2Ba
附近点的价值GydF4y2Baeps.GydF4y2Ba
是不同的。GydF4y2Ba
x = dlarray(eps);Y = DLFeval(@(t)dlgradient(Relu(T),T),x)GydF4y2Ba
y = 1x1 dlarray 1GydF4y2Ba
dlarray.GydF4y2Ba
|GydF4y2Badlfeval.GydF4y2Ba
|GydF4y2BadlgradientGydF4y2Ba
|GydF4y2Badlnetwork.GydF4y2Ba