主要内容

Dlgradient.

使用自动微分为自定义训练循环计算梯度

描述

采用Dlgradient.使用自定义训练循环的自动微分来计算导数。

提示

对于大多数深度学习任务,您可以使用预先训练的网络,并使其适应您自己的数据。有关如何使用迁移学习来重新训练卷积神经网络来对一组新图像进行分类的示例,请参见培训深度学习网络以分类新图像.或者,您可以使用划痕创建和培训网络分层图对象与之Trainnetwork.培训选项功能。

如果是培训选项函数不提供任务所需的训练选项,则可以使用自动区分创建自定义训练循环。想要了解更多,请看定义定制培训循环的深度学习网络

例子

dydx1,...,dydxk) = dlgradient (yX1,...,XK返回的梯度y关于变量x1通过XK.

调用Dlgradient.从通过的函数内dlfeval.看到使用自动微分计算梯度在深度学习工具箱中使用自动差异化

dydx1,...,dydxk) = dlgradient (yX1,...,XK名称,价值返回渐变并使用一个或多个名称值对指定其他选项。例如,就要= dlgradient (y, x, RetainData,真的)导致梯度保留后续重用的中间值Dlgradient.调用。这种语法可以节省时间,但会占用更多内存。有关更多信息,请参见提示

例子

全部收缩

Rosenbrock的功能是一个标准测试功能,用于优化。的罗森布罗克.M.辅助功能计算功能值,并使用自动差异来计算其渐变。

类型罗森布罗克.M.
功能[y,dydx] = rosenbrock(x)y = 100 *(x(2) -  x(1)。^ 2)。^ 2 +(1  -  x(1))。^ 2;dydx = dlgradient(y,x);结尾

评估Rosenbrock的功能及其梯度[-1,2],创建一个dlarray.这一点然后打电话dlfeval在功能手柄上@rosenbrock

x0 = dlarray([ -  1,2]);[fval,gradval] = dlfeval(@ rosenbrock,x0)
fval = 1x1 dlarray 104
梯度= 1x2 dlarray 396 200

或者,将罗森布罗克函数定义为两个输入的函数,x1和X.2

类型rosenbrock2.m
功能[y,dydx1,dydx2] = rosenbrock2(x1,x2)y = 100 *(x2  -  x1。^ 2)。^ 2 +(1  -  x1)。^ 2;[DYDX1,DYDX2] = DLGRADIET(Y,X1,X2);结尾

调用dlfeval评估rosenbrock2.在两者dlarray.代表输入的参数12

x1 = dlarray (1);x2 = dlarray (2);[fval, dydx1 dydx2] = dlfeval (@rosenbrock2 (x1, x2)
fval = 1x1 dlarray 104
dydx1 = 1x1 dlarray 396
dydx2 = 1x1 dlarray 200

绘制罗森布罗克函数在单位平方上几个点的梯度。首先,初始化表示求值点的数组和函数的输出。

[X1 X2] = meshgrid(linspace(0,1,10));X1 = dlarray (X1 (:));X2 = dlarray (X2 (:));Y = dlarray(0(大小(X1)));DYDX1 = Y;DYDX2 = Y;

评估循环中的函数。使用结果绘制结果颤动

i = 1:长度(X1) [Y (i), DYDX1(我),DYDX2 (i)) = dlfeval (@rosenbrock2, X1 (i), X2(我));结尾QUIVIVER(提取数据(x1),提取数据(x2),提取数据(dydx1),提取数据(dydx2))xlabel('x1')ylabel('x2'

图包含轴。轴包含QUIVIVE的对象。

输入参数

全部收缩

要区分的变量,指定为标量dlarray.对象。分化,y必须是一个追踪的功能dlarray.输入(见追踪dlarray)必须由支持的职能组成金宝appdlarray.(看Dlarray支持的函数列表金宝app)。

例子:100 *(x(2) - x(1)。^ 2)。^ 2 +(1 - x(1))。^ 2

例子:Relu(x)

变量,指定为dlarray.对象、单元格数组、结构或包含的表dlarray.对象,或递归地进行这些参数的任何组合。例如,参数可以是包含包含包含包含结构的单元数组的单元数组dlarray.对象。

如果您指定X1,...,XK作为一个表,表必须包含以下变量:

  • —层名,指定为字符串标量。

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

  • 价值—parameter的值,指定为包含a的单元格数组dlarray.

例子:Dlarray([1 2; 3 4])

数据类型:|双倍的|逻辑|塑造|细胞

名称值对参数

指定可选的逗号分离对名称,价值论点。的名字参数名和价值是相应的价值。的名字必须出现在引号内。您可以以任何顺序指定多个名称和值对参数name1,value1,...,namen,valuen

例子:就要= dlgradient (y, x, RetainData,真的)导致梯度保留后续重用的中间值Dlgradient.调用

标记以在函数调用期间保留跟踪数据,指定为错误的要么真的.当这个论点是错误的, 一种dlarray.在计算导数后立即丢弃导数轨迹。当这个论点是真的, 一种dlarray.保持导数跟踪直到dlfeval评估函数调用Dlgradient..的真的设置只有在何时有用dlfeval调用包含多个Dlgradient.称呼。的真的设置使软件使用更多的内存,但可以节省时间时,多个Dlgradient.调用使用至少一部分相同的跟踪。

什么时候'enabentherderivatives'真的,然后保留中间值“RetainData”期权没有效果。

例子:就要= dlgradient (y, x, RetainData,真的)

数据类型:逻辑

启用高阶导数的标志,指定为逗号分隔对组成'enabentherderivatives'以及以下其中之一:

  • 真的-启用高阶导数。跟踪向后传递,以便返回的梯度和可用于后续调用的进一步计算Dlgradient.功能。如果'enabentherderivatives'真的,然后保留中间值“RetainData”期权没有效果。

  • 错误的- 禁用高阶导数。不要追溯落后通行证。当您需要仅计算一阶导数时,请使用此选项,因为这通常更快并且需要更少的内存。

使用时Dlgradient.在A.加速功能对象时,默认值为真的.否则,默认值是错误的

有关如何训练需要计算高阶导数的模型的示例,请参见:

数据类型:逻辑

输出参数

全部收缩

渐变,作为一个返回dlarray.对象,或包含包含的单元格阵列,结构或表dlarray.对象,或递归地进行这些参数的任何组合。尺寸和数据类型dydx1,...,dydxk与关联输入变量相同X1,...,XK

限制

  • dlgraident函数在使用时不支持计算高阶导数金宝appdlnetwork.对象,该对象包含带有自定义向后函数的自定义层。

  • dlgraident函数在使用时不支持计算高阶导数金宝appdlnetwork.包含以下图层的对象:

    • gruLayer

    • lstmlayer.

    • Bilstmlayer.

  • Dlgradient.函数不支持计算依赖于以下函数的高阶导金宝app数:

    • gru.

    • lstm

    • 嵌入

    • prod

    • interp1.

更多关于

全部收缩

追踪dlarray.

在计算函数期间,adlarray.内部记录了一个拍摄的步骤痕迹,启用反向模式自动差异化。跟踪发生在一个内dlfeval称呼。看到自动分化背景

提示

  • 一个Dlgradient.调用必须在函数内部。要获得梯度的数值,必须使用dlfeval,函数的实参必须是dlarray..看到在深度学习工具箱中使用自动差异化

  • 启用对梯度的正确评估,y参数必须仅使用支持的功能金宝appdlarray..看到Dlarray支持的函数列表金宝app

  • 如果你设置“RetainData”名称 - 值对参数真的,该软件将在dlfeval函数调用,而不是在衍生计算之后立即擦除轨迹。这种保存会导致随后的Dlgradient.呼叫在内dlfeval调用的执行速度更快,但使用的内存更多。例如,在训练一个对抗网络时“RetainData”设置是有用的,因为两个网络在训练期间共享数据和功能。看到训练生成对抗网络(GAN)

  • 当您仅需要计算一阶导数时,请确保'enabentherderivatives'选项是错误的由于这通常更快,需要更少的内存。

介绍了R2019b