主要内容

定义自定义深度学习输出层

提示

本主题说明如何为您的问题定义自定义深度学习输出层。有关深度学习工具箱™中的内置层列表,请参见深度学习层列表

要了解如何定义自定义中间层,请参见定义自定义深度学习中间层

如果深度学习工具箱不提供任务所需的输出层,则可以使用本主题作为指南定义自己的自定义层。定义自定义层后,可以自动检查该层是否有效,GPU是否兼容,输出正确定义的梯度。

输出层的体系结构

在训练时的前向传递结束时,输出层获取预测(网络输出)Y,并计算损失l在这些预测和训练目标之间。输出层计算损耗的导数l关于预测Y并将结果输出(向后传播)到前一层。

下图描述了通过卷积神经网络和输出层的数据流。

输出层模板

要定义自定义中间层,请使用这些类定义模板之一。模板概述了输出层类定义的结构。他们大纲:

分类输出层模板

这个模板概述了带有损失函数的分类输出层的结构。有关如何定义分类输出层和指定损失函数的示例,请参见定义自定义分类输出层

classdefmyClassificationLayer < nnet.layer.ClassificationLayer特性%(可选)图层属性。%图层属性到这里。结束方法函数tillay = myclassificationlayer()%(可选)创建一个myclassificationLayer。%层构造函数在这里。结束函数loss = forwardLoss(layer, Y, T)%返回预测Y和训练之间的损失%的目标T。%的输入:%层 - 输出层% Y -网络预测% T -训练目标%输出:% loss - Y和T之间的损失%层前向损失功能到这里。结束函数dLdY = backwardLoss(layer, Y, T)%(可选)反向传播损失的导数%的功能。%的输入:%层 - 输出层% Y -网络预测% T -训练目标%输出:% dLdY -损失对…的导数%预测y%层向后损失功能在这里。结束结束结束

回归输出层模板

这个模板概述了带有损失函数的回归输出层的结构。有关如何定义回归输出层和指定损失函数的示例,请参见定义自定义回归输出层

classdefmyRegressionLayer < nnet.layer.RegressionLayer特性%(可选)图层属性。%图层属性到这里。结束方法函数层= myRegressionLayer ()%(可选)创建myRegressionLayer。%层构造函数在这里。结束函数loss = forwardLoss(layer, Y, T)%返回预测Y和训练之间的损失%的目标T。%的输入:%层 - 输出层% Y -网络预测% T -训练目标%输出:% loss - Y和T之间的损失%层前向损失功能到这里。结束函数dLdY = backwardLoss(layer, Y, T)%(可选)反向传播损失的导数%的功能。%的输入:%层 - 输出层% Y -网络预测% T -训练目标%输出:% dLdY -损失对…的导数%预测y%层向后损失功能在这里。结束结束结束

输出层属性

属性中声明图层属性特性类定义的部分。

默认情况下,自定义输出层有以下属性:

  • 的名字- - - - - -图层名称,指定为字符向量或字符串标量。为了数组输入,trainNetwork汇编layerGraph,dlnetwork函数自动为层分配名称的名字设置为''

  • 描述-层的单行描述,指定为字符向量或字符串标量。该描述出现在层显示在数组中。如果您没有指定层描述,则软件显示“分类输出”或者“回归输出”

  • 类型- 图层的类型,指定为字符向量或字符串标量。的价值类型当层显示在数组中。如果不指定层类型,则软件将显示层类名称。

自定义分类层也有以下属性:

  • - - - - - -输出层的类,指定为分类向量,字符串阵列,字符向量的单元格数组,或“汽车”.如果“汽车”,然后软件在训练时自动设置课程。如果指定字符向量的字符串数组或单元格数组str,然后软件将输出层的类设置为分类(str, str)

自定义回归层也有以下属性:

  • 响应- - - - - -响应的名称,指定了字符向量或字符串数​​组的单元格数组。在培训时,软件根据培训数据自动设置响应名称。默认为{}

如果图层没有其他属性,那么您可以省略特性部分。

提出损失函数

输出层计算损失l在预测和目标之间使用正向损失函数,并计算损失相对于使用向后损失函数的预测的导数。

的语法forwardLoss损失= forwardLoss(层,Y, T).输入Y与电视台的预测相符。这些预测是前一层的输出。输入T与培训目标相对应。输出损失是两者之间的损失YT根据指定的损耗函数。输出损失必须是标量。

落后的损失函数

如果支持层转发丢失功能万博1manbetxdlarray对象,则软件自动确定后向损失功能。获取支持的函数列表万博1manbetxdlarray对象,参见支持dlarray的函数列表万博1manbetx.或者,要定义自定义向后损失函数,请创建名为backwardLoss.有关如何定义自定义向后损失函数的示例,请参见指定自定义输出层向后损耗功能

的语法backwardLossdLdY = backwardLoss(层,Y, T).输入Y包含网络和网络所做的预测T包含培训目标。输出dLdY关于预测的损失是衍生的Y.输出dLdY必须与图层输入的大小相同Y

对于分类问题,的维数T这取决于问题的类型。

分类任务 输入的大小 观察维度
二维图像分类 1-by-1-by -K——- - - - - -N,在那里K班级的数量是多少N为观察次数。 4
三维图像分类 1-by-1-by-1-by -K——- - - - - -N,在那里K班级的数量是多少N为观察次数。 5
Sequence-to-label分类 K——- - - - - -N,在那里K班级的数量是多少N为观察次数。 2
Sequence-to-sequence分类 K——- - - - - -N——- - - - - -年代,在那里K为班级数,N是观察的次数,和年代是序列长度。 2

的大小Y取决于前一层的输出。以确保Y大小是一样的吗T,则必须在输出层之前包含输出正确大小的层。例如,确保Y4-D数组的预测得分是什么K类,您可以包含大小完全连接的层K在输出层之前有一个softmax层。

对于回归问题,的维度T也取决于问题的类型。

回归的任务 输入的大小 观察维度
二维图像回归 1-by-1-by -R——- - - - - -N,在那里R是多少回应和N为观察次数。 4
二维Image-to-image回归 h——- - - - - -w——- - - - - -c——- - - - - -N,在那里hw,c输出通道的高度、宽度和数量分别是N为观察次数。 4
3-D图像回归 1-by-1-by-1-by -R——- - - - - -N,在那里R是多少回应和N为观察次数。 5
3 d Image-to-image回归 h——- - - - - -w——- - - - - -d——- - - - - -c——- - - - - -N,在那里hwd,c输出的高度、宽度、深度和通道数分别是N为观察次数。 5
Sequence-to-one回归 R——- - - - - -N,在那里R是多少回应和N为观察次数。 2
Sequence-to-sequence回归 R——- - - - - -N——- - - - - -年代,在那里R为响应次数,N是观察的次数,和年代是序列长度。 2

例如,如果网络定义了一个只有一个响应的图像回归网络,并且有大小为50的小批量,那么T是1-×1×1-50的4-D阵列。

的大小Y取决于前一层的输出。以确保Y大小是一样的吗T,则必须在输出层之前包含输出正确大小的层。例如,对于图像回归R回应,以确保Y是一个4-d阵列的正确尺寸,您可以包含完全连接的大小层R在输出层之前。

forwardLossbackwardLoss函数有以下输出参数。

功能 输出参数 描述
forwardLoss 损失 预测之间的计算损失Y真正的目标T
backwardLoss dLdY 损失相对于预测的导数Y

backwardLoss必须输出dLdY与前一层所期望的大小dLdY与尺寸相同Y

GPU的兼容性

如果层转发功能完全支持万博1manbetxdlarray对象,则该层是GPU兼容的。否则,为了与GPU兼容,层函数必须支持输入和返回输出类型万博1manbetxgpuArray(并行计算工具箱)

许多MATLAB®内置函数支持万博1manbetxgpuArray(并行计算工具箱)dlarray输入参数。获取支持的函数列表万博1manbetxdlarray对象,参见支持dlarray的函数列表万博1manbetx.有关在GPU上执行的函数列表,请参见在GPU上运行MATLAB函数(并行计算工具箱)要使用GPU进行深度学习,您还必须有支持的GPU设备。万博1manbetx有关支持的设备的信息,请参见万博1manbetxGPU支万博1manbetx持情况(并行计算工具箱)有关在MATLAB中使用gpu的更多信息,请参见MATLAB中的GPU计算(并行计算工具箱)

层有效性检查

如果您创建了自定义深度学习图层,那么您可以使用checkLayer函数检查图层是否有效。该功能检查有效性,GPU兼容性,正确定义渐变和代码生成兼容性的图层。要检查图层是否有效,请运行以下命令:

validInputSize checkLayer(层)
在哪里是该层的实例,validInputSize指定层的有效输入大小的向量或单元格数组。要用多重观察进行检查,请使用ObservationDimension选择。要检查代码生成兼容性,请设置CheckCodegenCompatibility选择1(真正的)。对于较大的输入,梯度检查需要更长的时间来运行。要加快测试速度,请指定较小的有效输入大小。

有关更多信息,请参见检查自定义层有效性

另请参阅

||||

相关话题