主要内容

Dlgradient.

使用自动差异计算自定义训练环路的渐变

描述

采用Dlgradient.计算使用自动分化进行自定义训练循环计算衍生物。

小费

对于大多数深度学习任务,您可以使用备用网络并将其调整到您自己的数据。出于一个示例,展示了如何使用传输学习培育卷积神经网络以对新一组图像进行分类,请参阅火车深学习网络分类新形象.或者,您可以使用从头开始创建和培训网络layerGraph与对象trainNetworktrainingOptions功能。

如果是trainingOptions功能不提供您需要的培训选项,然后您可以使用自动差异创建自定义训练循环。要了解更多信息,请参阅定义深学习网络定制培训循环

例子

[dydx1,...,dydxk] = dlgradient(yX1,...,XK返回梯度y关于变量X1通过XK.

称呼Dlgradient.从内部功能传递给dlfeval..看使用自动差异计算梯度使用自动分化深度学习工具箱

[dydx1,...,dydxk] = dlgradient(yX1,...,XK名称,价值使用一个或多个名称值对返回梯度和指定的附加选项。例如,dydx = dlgradient(y,x,'retaindata',true)使梯度保留中间值以供后续重用Dlgradient.呼叫。此语法可以节省时间,但使用更多内存。有关更多信息,请参阅提示

例子

全部收缩

的ROSENBROCK的功能是优化标准的测试功能。这rosenbrock.m辅助函数计算功能值,并使用自动微分来计算其梯度。

类型rosenbrock.m
函数[y,就要]=。(x) y = 100 * (x - x(1)(2)。^ 2)。²+ (1 - x(1))²;就要= dlgradient (y、x);结尾

要在点评估的ROSENBROCK的功能及其梯度[-1,2], 创建一个dlarray.点,然后调用dlfeval.在功能手柄@rosenbrock.

X0 = dlarray([ -  1,2]);[FVAL,gradval] = dlfeval(@的ROSENBROCK,X0)
FVAL = 1x1的dlarray 104
Gradval = 1x2 Dlarray 396 200

或者,将RosenBrock的功能定义为两个输入的函数,X1和x2

类型罗森布罗克2.M.
函数[y,dydx1,dydx2] = rosenbrock2(x1,x2) y = 100*(x2 - x1.^2)²+ (1 - x1)²;[dydx1, dydx2] = dlgradient (y, x1, x2);结尾

称呼dlfeval.评估rosenbrock2dlarray.表示的输入参数-12

x1 = dlarray(-1);x2 = dlarray(2);[fval,dydx1,dydx2] = dlfeval(@ rosenbrock2,x1,x2)
FVAL = 1x1的dlarray 104
Dydx1 = 1x1美元396
dydx2 = 1x1的dlarray 200

绘制RosenBrock函数的渐变,在单位广场中的几个点。首先,初始化表示评估点和函数输出的阵列。

[x1 x2] = meshgrid(linspace(0,1,10));x1 = dlarray(x1(:));x2 = dlarray(x2(:));y = dlarray(零(尺寸(x1)));dydx1 = y;dydx2 = y;

评估在一个循环的功能。绘制使用结果颤动

为了i = 1:长度(x1)[y(i),dydx1(i),dydx2(i)] = dlfeval(@ rosenbrock2,x1(i),x2(i));结尾颤动(ExtractData由(X1),ExtractData由(X2),ExtractData由(DYDX1),ExtractData由(DYDX2))xlabel('X1')ylabel('X2'

图包含轴。轴包含类型颤动的对象。

输入参数

全部收缩

变量以区分,指定为标量dlarray.目的。差异化,y必须的追踪功能dlarray.输入(参见跟踪Dlarray),并且必须包括所支持的功能金宝appdlarray.(看与dlarray支持功能列表金宝app)。

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

例子:RELU(X)

函数中的变量,指定为adlarray.对象,单元格阵列,结构或包含的表dlarray.对象,或递归此类参数的任意组合。例如,参数可以是含有包含含有结构单元阵列的单元阵列dlarray.对象。

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

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

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

  • 价值- 参数值,指定为包含一个单元格数组dlarray.

例子:dlarray([1 2 3 4])

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

名称值对参数

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

例子:dydx = dlgradient(y,x,'retaindata',true)使梯度保留中间值以供后续重用Dlgradient.呼叫

标志在函数调用期间保留跟踪数据,指定为错误的真的.当这个论点是错误的, 一种dlarray.在计算衍生过程之后立即丢弃衍生物轨迹。当这个论点是真的, 一种dlarray.保留衍生物痕迹,直到结束dlfeval.函数调用,用于评估Dlgradient..这真的设置是有用的,只有当dlfeval.呼叫包含多个Dlgradient.称呼。这真的设置使软件使用更多内存,但可以在多个时节省时间Dlgradient.调用使用同一轨迹的至少一部分。

什么时候'EnableHigherDerivatives'真的,然后中间值被保留和'etaindata'选项无效。

例子:dydx = dlgradient(y,x,'retaindata',true)

数据类型:逻辑

标志以启用高阶导数,指定为逗号分隔的对'EnableHigherDerivatives'和以下之一:

  • 真的- 启用高阶导数。追踪后向通过,使返回的渐变和可以用于进一步计算的返回梯度以供后续调用Dlgradient.功能。如果'EnableHigherDerivatives'真的,然后中间值被保留和'etaindata'选项无效。

  • 错误的- 禁用高阶衍生物。不要跟踪后向通行。当你需要计算一阶导数只因为这通常是更快,需要更少的内存,使用此选项。

使用时Dlgradient.函数内的AcceleratedFunction对象,默认值是真的.否则,默认值是错误的

例如,示出了如何培训需要计算高阶导数的模型,请参阅:

数据类型:逻辑

输出参数

全部收缩

渐变,返回为dlarray.对象,或者一个单元阵列,结构,或包含表dlarray.对象,或递归此类参数的任意组合。的大小和数据类型dydx1,...,dydxk是相同的那些相关联的输入变量的X1,...,XK

限制

  • DLGRIPREDENT.功能不支持计算时计算高阶导数金宝appdlnetwork包含自定义后向后函数的自定义图层的对象。

  • DLGRIPREDENT.功能不支持计算时计算高阶导数金宝appdlnetwork对象含有以下层:

    • 格拉勒

    • lstmLayer

    • bilstmLayer

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

    • GRU

    • LSTM.

    • 嵌入

    • prod

    • interp1

更多关于

全部收缩

追踪dlarray.

在一个功能,一个的计算dlarray.内部记录中所采取的步骤痕迹,使反向模式自动分化。跟踪内发生dlfeval.称呼。看自动差异化背景

提示

  • 一种Dlgradient.呼叫必须在函数内。要获得渐变的数值,必须使用函数评估使用dlfeval.,函数的论点必须是一个dlarray..看使用自动分化深度学习工具箱

  • 为了使梯度,在正确评价y参数必须使用仅支持的功能金宝appdlarray..看与dlarray支持功能列表金宝app

  • 如果你设置了'etaindata'名称 - 值对参数真的,该软件保留了追踪的持续时间dlfeval.函数调用,而不是衍生计算后立即删除的痕迹。这种防护可能会导致后续Dlgradient.在同一范围内调用dlfeval.调用更快地执行,但使用更多内存。例如,在训练对抗性网络时,'etaindata'设置是有用的,因为两个网络在培训期间共享数据和功能。看火车生成对抗网络(GaN)

  • 当你只需要计算一阶导数,确保'EnableHigherDerivatives'选项是错误的因为这是通常更快,需要较少的存储器。

在R2019B中介绍