主要内容

dlfeval

评估深度学习模型的自定义训练循环

描述

使用dlfeval为自定义训练循环评估自定义深度学习模型。

提示

对于大多数深度学习任务,您可以使用预训练的网络并使其适应您自己的数据。有关如何使用迁移学习重新训练卷积神经网络以对一组新图像进行分类的示例,请参阅训练深度学习网络对新图像进行分类。或者,您可以使用layerGraph的对象。trainNetworktrainingOptions功能。

如果trainingOptions函数不提供您任务所需的训练选项,那么您可以使用自动区分创建自定义训练循环。要了解更多信息,请参见定义深度学习网络自定义训练循环

例子

日元…,即= dlfeval()有趣的x1,…,xn计算深度学习数组函数有趣的在输入参数处x1,…,xn。传递给dlfeval可以包含对dlgradient,它从输入计算梯度x1,…,xn通过自动微分。

例子

全部折叠

Rosenbrock函数是一个标准的优化测试函数。的rosenbrock.m辅助函数计算函数值,并使用自动微分计算其梯度。

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

计算Rosenbrock函数及其在该点的梯度[1,2],创建一个dlarray的点,然后打电话dlfeval在函数句柄上@rosenbrock

X0 = darray ([-1,2]);[fval,gradval] = dlfeval(@rosenbrock,x0)
Fval = 1x1 darray
梯度= 1x2阵列396 200

或者,将Rosenbrock的函数定义为两个输入的函数,x1和x2

类型rosenbrock2.m
函数[y,dydx1,dydx2] = rosenbrock2(x1,x2) y = 100*(x2 - x1.^2)。²+ (1 - x1)²;[dydx1,dydx2] = dlgradient(y,x1,x2);结束

调用dlfeval评估rosenbrock2在两个dlarray表示输入的参数12

X1 = darray (-1);X2 = darray (2);[fval,dydx1,dydx2] = dlfeval(@rosenbrock2,x1,x2)
Fval = 1x1 darray
Dydx1 = 1x1 darray 396
Dydx2 = 1x1阵列

绘制单位方格中几个点的Rosenbrock函数的梯度。首先,初始化表示求值点和函数输出的数组。

[X1 X2] = meshgrid(linspace(0,1,10));X1 = darray (X1(:));X2 = darray (X2(:));Y = darray (0 (size(X1));Dydx1 = y;Dydx2 = y;

在循环中求值函数。使用以下命令绘制结果箭袋

i = 1:长度(X1) [Y (i), DYDX1(我),DYDX2 (i)) = dlfeval (@rosenbrock2, X1 (i), X2(我));结束箭袋(extractdata (X1)、extractdata (X2)、extractdata (DYDX1) extractdata (DYDX2))包含(x1的) ylabel (“x2”

图包含一个轴对象。axes对象包含一个类型为quiver的对象。

使用dlgradientdlfeval计算包含复数的函数的值和梯度你可以计算复杂的梯度,或者将梯度限制为实数。

定义函数complexFun,在本示例末尾列出。该函数实现了以下复杂公式:

f x 2 + 3. x

定义函数gradFun,在本示例末尾列出。这个函数调用complexFun并使用dlgradient计算结果相对于输入的梯度。对于自动微分,要微分的值——即从输入计算出的函数的值——必须是一个实标量,因此函数在计算梯度之前取结果实部的和。函数返回函数值的实部和梯度,这可以是复杂的。

在-2和-2之间的复平面上定义采样点 和2 然后转换成dlarray

functionRes = linspace(-2,2,100);x = functionRes + 1i*functionRes.';X = darray (X);

计算每个样本点的函数值和梯度。

[y, grad] = dlfeval(@gradFun,x);Y = extractdata(Y);

定义显示梯度的采样点。

gradientRes = linspace(-2,2,11);xGrad = gradientRes + 1i*gradientRes.';

提取这些样本点的梯度值。

[~,gradPlot] = dlfeval(@gradFun, darray (xGrad));gradPlot = extractdata(gradPlot);

绘制结果。使用显示亮度图像在复平面上表示函数的值。使用箭袋表示梯度的方向和大小。

显示亮度图像((2,2),(2,2),y);轴xycolorbar举行箭袋(真实(xGrad),图像放大(xGrad),真正的(gradPlot),图像放大(gradPlot),“k”);包含(“真正的”) ylabel (“虚”)标题(实值与梯度"Re$(f(x)) = $ Re$((2+3i)x)$"“翻译”“乳胶”

图包含一个轴对象。标题为Real Value和Gradient的坐标轴对象包含2个类型为image, quiver的对象。

函数的梯度在整个复平面上是相同的。提取自动微分计算的梯度值。

研究生(1,1)
Ans = 1x1阵列2.000 - 3.000 i

经检验,该函数的复导数具有值

df x dx 2 + 3.

然而,函数Re( f x )不是解析的,因此没有定义复导数。对于MATLAB中的自动微分,要微分的值必须总是实数,因此函数永远不能是复解析的。相反,导数的计算使得返回的梯度指向最陡上升的方向,如图所示。这是通过解释函数Re来完成的 f x C R作为函数Re f x R + x R × R R

函数y = complexFun(x) y = (2+3i)*x;结束函数[y,grad] = gradFun(x) y = complexFun(x);Y = real(Y);Grad = dlgradient(sum(y,“所有”), x);结束

输入参数

全部折叠

要求值的函数,指定为函数句柄。如果有趣的包括一个dlgradient电话,然后dlfeval通过使用自动微分来评估梯度。的每个参数在这个梯度求值中dlgradientCall必须是dlarray的单元格数组、结构或表dlarray。的输入参数的数量dlfeval必须与输入参数的个数相同有趣的

例子:@rosenbrock

数据类型:function_handle

函数参数,指定为任何MATLAB数据类型或dlnetwork对象。

输入参数xj这是a的微分变量dlgradient电话必须是追踪的dlarray或包含跟踪对象的单元格数组、结构或表dlarray。额外的变量(如超参数或常量数据数组)不必是dlarray

为了评估深度学习的梯度,您可以提供一个dlnetwork对象作为函数参数,并计算内部网络的转发有趣的

例子:[1 2;3 4]

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64|逻辑|字符|字符串|结构体|表格|细胞|function_handle|分类|datetime|持续时间|calendarDuration|fi
复数支持:金宝app是的

输出参数

全部折叠

函数输出,作为任何数据类型返回。如果输出结果是adlgradient调用时,输出是adlarray

提示

扩展功能

在R2019b中引入