主要内容

定义自定义深度学习层

提示

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

本主题解释深度学习层的体系结构,以及如何定义用于解决问题的自定义层。

类型 描述

定义自定义深度学习层并指定可选的可读参数。

有关如何使用可学习参数定义自定义层的示例,请参见用可学习参数定义自定义深度学习层.有关用于定义具有多个输入的自定义层的示例,请参阅定义具有多个输入的自定义深度学习层

分类输出层

定义自定义分类输出层并指定丢失函数。

有关如何定义自定义分类输出层和指定损失函数的示例,请参见定义自定义分类输出层

回归输出层

定义自定义回归输出层并指定损失函数。

有关展示如何定义自定义回归输出层并指定丢失功能的示例,请参阅定义自定义回归输出层

层模板

您可以使用以下模板来定义新层。

中间层模板

分类输出层模板

回归输出层模板

中间层架构

在培训期间,软件迭代地执行前后通过网络。

在通过网络进行前进传递时,每层都会占用上一层的输出,应用函数,然后输出(向前传播)结果到下一个层。

层可以具有多个输入或输出。例如,可以采取层X1,......,XN从多个先前的图层,向前传播输出Z.1,......,Z.m到下一个层数。

在网络的前向传递结束时,输出层计算损失L.在预测之间y真正的目标T.

在网络的反向传递过程中,每一层取损耗相对于该层输出的导数,计算损耗的导数L.关于输入,然后向后传播结果。如果该图层具有可知参数,则该图层还计算层权重的衍生物(被动参数)。该图层使用权重的衍生物来更新可读参数。

下图描述了通过深神经网络的数据流程,并突出显示通过单个输入的层的数据流X单个输出Z.,以及一个可学习的参数W.

中间层特性

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

默认情况下,自定义中间图层具有这些属性。

财产 描述
的名字 层名,指定为字符向量或字符串标量。若要在层图中包含层,必须指定非空的唯一层名。如果你用层和的名字被设置为'',然后软件会自动为培训时间分配给图层的名称。
描述

层的一行描述,指定为字符向量或字符串标量。当图层以a中显示时,会出现此说明数组中。如果未指定图层描述,则软件将显示图层类名。

类型 层的类型,指定为字符向量或字符串标量。的价值类型当图层显示在一个中时出现数组中。如果未指定图层类型,则软件显示图层类名。
numinputs. 图层的输入数,指定为正整数。如果未指定此值,则软件会自动设置numinputs.到了名称的数量输入名称.默认值为1。
输入名称 图层的输入名称,指定为字符向量的单元格数组。如果您没有指定此值和numinputs.大于1,然后软件自动设置输入名称{“三机”,…,“客栈”}, 在哪里N等于numinputs..默认值是{'在'}
numoutput. 层的输出数,指定为正整数。如果未指定此值,则软件会自动设置numoutput.到了名称的数量OutputNames.默认值为1。
OutputNames 图层的输出名称,指定为字符向量的单元格数组。如果您没有指定此值和numoutput.大于1,然后软件自动设置OutputNames{'out1',......,'outm'}, 在哪里m等于numoutput..默认值是{“出”}

如果该层没有其他属性,则可以省略属性部分。

提示

如果你正在创建一个有多个输入的图层,那么你必须设置numinputs.输入名称属性在层构造函数中。如果你正在创建一个有多个输出的图层,那么你必须设置numoutput.OutputNames属性在层构造函数中。例如,请参见定义具有多个输入的自定义深度学习层

可学的参数

声明层可学习参数属性(可学的)类定义的部分。您可以指定数字数组或dlnetwork.对象作为可学习参数。如果层没有可学习的参数,那么你可以省略属性(可学的)部分。

可选地,您可以指定学习率因子和可学习参数的L2因子。默认情况下,每个可学习参数的学习率因子和L2因子设置为1

对于内置和自定义图层,您可以使用以下功能设置和获取学习速率因子和L2正则化因子。

函数 描述
setlearnratefactor. 设置学习速率因子的学习参数。
setl2factor. 设置学习参数的L2正则化因子。
getLearnRateFactor 获取学习速率因子的学习参数。
getl2factor. 获取Legable参数的L2正则化因子。

要指定可学习参数的学习率因子和L2因子,请使用语法tillay = setlearnratefactor(图层,'myparametername',值)tillay = setl2factor(图层,parametername,值),分别。

要得到一个可学习参数的学习率因子和L2因子的值,使用语法getLearnratefactor(图层,'myparametername')getl2factor(图层,parametername)分别。

例如,此语法使用名称设置可学习参数的学习速率因子“α”0.1

一层一层= setLearnRateFactor (,“α”,0.1);

前进功能

有些层在训练和预测过程中表现不同。例如,dropout层只在训练期间执行dropout,在预测期间没有影响。一个层使用两个函数之一来执行向前传递:预测向前.如果前进通过在预测时间,则该图层使用预测函数。如果前进通过在训练时间,那么该层使用了向前函数。如果您不需要两个不同的功能进行预测时间和培训时间,那么您可以省略向前函数。在本例中,层使用预测在训练时间。

如果你定义函数向前和自定义向后函数,然后你必须给参数赋值内存,您可以在向后传播期间使用它。

的语法预测[z1,...,zm] =预测(图层,x1,...,xn), 在哪里X1,…,XnN层输入和Z1,…,Zm评选m层输出。价值Nm必须对应于numinputs.numoutput.层的属性。

提示

如果输入的数量预测可以变化,然后使用变长度输入宗量代替X1,…,Xn.在这种情况下,变长度输入宗量是输入的单元格数组,其中varargin {i}对应于xi..如果输出的数量可以变化,则使用varargout代替Z1,…,Zm评选.在这种情况下,varargout是输出的单元阵列,其中varargout {j}对应于ZJ.

提示

如果自定义层有一个dlnetwork.对象的可学习参数,然后在预测自定义层的功能,使用预测函数dlnetwork..使用dlnetwork.目的预测功能确保软件使用正确的层操作进行预测。

的语法向前(Z1,…,Zm评选、内存)=前进(层,X1,…,Xn), 在哪里X1,…,XnN层的输入,Z1,…,Zm评选m图层输出,和内存是记忆层。

提示

如果输入的数量向前可以变化,然后使用变长度输入宗量代替X1,…,Xn.在这种情况下,变长度输入宗量是输入的单元格数组,其中varargin {i}对应于xi..如果输出的数量可以变化,则使用varargout代替Z1,…,Zm评选.在这种情况下,varargout是输出的单元阵列,其中varargout {j}对应于ZJ.为了j= 1,…,numoutput.varargout {NumOutputs + 1}对应于内存

提示

如果自定义层有一个dlnetwork.对象的可学习参数,然后在向前自定义层的功能,使用向前功能的功能dlnetwork.对象。使用dlnetwork.目的向前功能可确保软件使用正确的图层操作进行培训。

输入的尺寸取决于数据类型和连接图层的输出:

层的输入 输入大小 观察维度
2-D图像 H-经过-W.-经过-C-经过-N, 在哪里HW.,C分别对应图像的高度、宽度和通道数量,和N是观察人数。 4.
三维图像 H-经过-W.-经过-D.-经过-C-经过-N, 在哪里HW.D.,C分别为三维图像通道的高度、宽度、深度和数量N是观察人数。 5.
矢量序列 C-经过-N-经过-S., 在哪里C是序列的特征数量,N是观察的次数,和S.为序列长度。 2
2-D图像序列 H-经过-W.-经过-C-经过-N-经过-S., 在哪里HW.,C对应于图像的频道的高度,宽度和数量,N是观察的次数,和S.为序列长度。 4.
3-D图像序列 H-经过-W.-经过-D.-经过-C-经过-N-经过-S., 在哪里HW.D.,C对应于3-D图像的高度,宽度,深度和数量,N是观察的次数,和S.为序列长度。 5.

对于输出序列的层,层可以输出任意长度的序列或无时间维度的输出数据。在训练输出序列的网络时,请注意Trainnetwork.函数时,输入序列和输出序列的长度必须匹配。

向后函数

层向后函数计算损失相对于输入数据的导数,然后将结果输出(向后传播)到前一层。如果层有可学习的参数(例如,层权重),那么落后的还计算了学习参数的衍生产品。使用时Trainnetwork.函数时,该层在向后传递过程中使用这些导数自动更新可学习参数。

定义向后函数是可选的。如果不指定向后函数,则层向前函数支持万博1manbetxdlarray.对象,然后软件使用自动差异自动确定向后函数。有关支持的功能列表万博1manbetxdlarray.对象,看到Dlarray支持的函数列表万博1manbetx.当你想:

  • 使用特定的算法来计算导数。

  • 在不支持的前向功能中使用操作万博1manbetxdlarray.对象。

自定义层与学习dlnetwork.对象不支持自定义后向功能。万博1manbetx

要定义自定义后向函数,请创建名为的函数落后的

的语法落后的[DLDX1,...,DLDXN,DLDW1,...,DLDWK] =向后(图层,X1,...,XN,Z1,...,ZM,DLDZ1,...,DLDZM,内存),地点:

  • X1,…,XnN层输入

  • Z1,…,Zm评选m图层前向功能的输出

  • dLdZ1,…,dLdZm渐变是从下一层传播的渐变

  • 内存是内存输出向前如果向前定义,否则,内存[]

对于输出,dLdX1,…,dLdXn损耗对层输入和的导数是多少dldw1,...,dldwk是损失对的导数吗K.学习参数。通过防止在前向和后向通过之间保存未使用的变量来减少内存使用,请替换相应的输入参数

提示

如果输入的数量落后的可以变化,然后使用变长度输入宗量而不是之后的输入参数.在这种情况下,变长度输入宗量是输入的单元格数组,其中varargin {i}对应于xi.为了一世= 1,…,numinputs.varargin {numinputs + j}变长度输入宗量{NumInputs + NumOutputs + j}相当于ZJ.dldzj.分别为j= 1,…,numoutput.,varargin {结束}对应于内存

如果输出的数量可以变化,则使用varargout而不是输出参数。在这种情况下,varargout是输出的单元阵列,其中varargout {i}对应于dldxi.为了一世= 1,…,numinputs.varargout {numinputs + t}对应于DLDWT.为了T.= 1,…,K., 在哪里K.为可学习参数的个数。

价值X1,…,XnZ1,…,Zm评选与前向功能相同。尺寸dLdZ1,…,dLdZm和的尺寸一样吗Z1,…,Zm评选,分别。

的维度和数据类型dLdX1,…,dLdxn与维度和数据类型相同X1,…,Xn,分别。的维度和数据类型DLDW1.,...,DLDWK.与维度和数据类型相同W1,...,WK.,分别。

要计算损失的导数,可以使用链式法则:

L. X 一世 = j L. Z. j Z. j X 一世

L. W. 一世 = j L. Z. j Z. j W. 一世

使用时Trainnetwork.函数,图层使用衍生物自动更新可读参数DLDW1.,...,DLDWK.在向后传球时。

有关如何定义自定义向后函数的示例,请参见指定自定义层向后函数

GPU兼容性

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

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

代码生成兼容性

要创建支持代码生成的自定义层:万博1manbetx

  • 该图层必须指定Pragma% # codegen在图层定义中。

  • 的输入预测必须是:

    • 一致的维度。每个输入必须具有相同数量的维度。

    • 批量大小一致。每个输入必须具有相同的批次大小。

  • 输出预测必须在尺寸和批量大小上保持一致,具有图层输入。

  • Nonscalar属性必须具有类型单,双或字符阵列。

  • 标量属性必须具有数字、逻辑或字符串类型。

代码生成仅支持具有2-D图像输入万博1manbetx的中间层。

有关如何创建支持代码生成的自定义层的示例,请参见万博1manbetx定义代码生成的自定义深度学习层

网络组成

要创建本身定义层图的自定义层,可以指定dlnetwork.对象作为学习参数。这种方法被称为网络的作文.你可以使用网络合成:

  • 创建单个自定义层,其表示可被动层块,例如剩余块。

  • 创建具有控制流的网络,例如,具有可以根据输入数据动态地改变的部分的网络。

  • 创建具有循环的网络,例如,具有将输出返回自身的部分的网络。

层有效性检查

如果你创建一个自定义的深度学习层,那么你可以使用核对层函数检查该层是否有效。该函数检查层的有效性、GPU兼容性、正确定义的梯度和代码生成兼容性。检查层是否有效,使用如下命令:

checkLayer(层、validInputSize ObservationDimension,昏暗的)
在哪里是该层的实例,validInputSize.向量或单元格数组是否指定图层的有效输入大小,以及暗淡指定图层输入数据中的观察的维度。对于大输入大小,渐变检查需要更长时间运行。要加快测试,请指定较小的有效输入大小。

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

检查层使用的有效性核对层

检查自定义层的层有效性preluLayer

定义自定义proLu层。要创建此图层,请保存文件preluLayer.m在当前文件夹中。

创建图层的实例并使用核对层.将有效的输入大小指定为单个观察到图层的单个观察的大小。该层预期了4-D阵列输入,其中前三个尺寸对应于先前层输出的高度,宽度和通道的通道数,并且第四维度对应于观察。

指定观察和集合的输入的典型大小'观察树'到4。

层= preluLayer (20,“prelu”);validInputSize = [24 24 20];validInputSize checkLayer(层,'观察树'4)
跳过GPU测试。没有找到兼容的GPU设备。跳过代码生成兼容性测试。要检查代码生成层的有效性,请指定“CheckCodegenCompatibility”和“ObservationDimension”选项。运行nnet.checklayer.TestLayerWithoutBackward .......... ...完成nnet.checklayer.TestLayerWithoutBackward __________测试摘要:13通过,0失败,0不完整,9跳过。时间:0.18046秒。

在这里,该函数不会检测到图层的任何问题。

包括网络中的图层

您可以使用与Deep Learning Toolbox中的任何其他图层相同的自定义图层。

定义自定义proLu层。要创建此图层,请保存文件preluLayer.m在当前文件夹中。

创建包含自定义图层的层数组preluLayer

图层= [imageInputlayer([28 28 1])卷积2dlayer(5,20)BatchnormalizationLayer prelulayer(20,“prelu”)全连接层(10)SoftmaxLayer分类层];

输出层的体系结构

在训练时间的前向传递结束时,输出层采用预测(输出)y,并计算损失L.在这些预测和培训目标之间。输出层计算损耗的衍生物L.关于预测y并将结果输出(向后传播)到前一层。

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

输出层属性

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

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

  • 的名字-层名,指定为字符向量或字符串标量。若要在层图中包含层,必须指定非空的唯一层名。如果你用层和的名字被设置为'',然后软件会自动为培训时间分配给图层的名称。

  • 描述- 图层的单​​行描述,指定为字符向量或字符串标量。当图层以a中显示时,会出现此说明数组中。如果您没有指定层描述,则软件显示“分类输出”“回归输出”

  • 类型-层的类型,指定为字符向量或字符串标量。的价值类型当图层显示在一个中时出现数组中。如果未指定图层类型,则软件显示图层类名。

自定义分类图层还具有以下酒店:

  • -输出层的类,指定为分类向量、字符串数组、字符向量单元格数组或'汽车'.如果'汽车',然后软件在培训时间自动设置类。如果指定字符串数组或字符向量数组str,则软件将输出层的类设置为分类(str,str)

自定义回归图层还具有以下属性:

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

如果该层没有其他属性,则可以省略属性部分。

损失函数

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

的语法forwardloss.丢失=转发器(图层,y,t).输入y对应于网络所做的预测。这些预测是前一层的输出。输入T.对应于培训目标。输出损失是之间的损失yT.根据指定的损失函数。输出损失必须是标量。

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

的语法背瓣dLdY = backwardLoss(layer, Y, T).输入y包含了电视台和T.包含培训目标。输出DLDY.损失相对于预测的导数是多少y.输出DLDY.必须与图层输入相同y

对于分类问题,尺寸T.这取决于问题的类型。

分类任务 输入大小 观察维度
2-D图像分类 1-by-1-by -K.-经过-N, 在哪里K.是课程数量和N是观察人数。 4.
三维图像分类 1-by-1-1-by-K.-经过-N, 在哪里K.是课程数量和N是观察人数。 5.
序列到标签分类 K.-经过-N, 在哪里K.是课程数量和N是观察人数。 2
序列到序列分类 K.-经过-N-经过-S., 在哪里K.是课程数量,N是观察的次数,和S.为序列长度。 2

的大小y取决于前一层的输出。以确保y与尺寸相同T.,则必须在输出层之前包含输出正确大小的层。例如,为了确保y是一个4-D一系列预测分数K.类,您可以包含大小完全连接的层K.在输出层之前有一个softmax层。

对于回归问题,尺寸T.也取决于问题的类型。

回归任务 输入大小 观察维度
2-D图像回归 1-by-1-by -R.-经过-N, 在哪里R.是多少回应和N是观察人数。 4.
2-D图像到图像回归 H-经过-W.-经过-C-经过-N, 在哪里HW.,C是输出的高度,宽度和数量,以及N是观察人数。 4.
三维图像回归 1-by-1-1-by-R.-经过-N, 在哪里R.是多少回应和N是观察人数。 5.
3-D图像到图像回归 H-经过-W.-经过-D.-经过-C-经过-N, 在哪里HW.D.,C是输出的高度,宽度,深度和频道的数量,以及N是观察人数。 5.
序列到一个回归 R.-经过-N, 在哪里R.是多少回应和N是观察人数。 2
序列到序列回归 R.-经过-N-经过-S., 在哪里R.是响应的数量,N是观察的次数,和S.为序列长度。 2

例如,如果网络使用一个响应定义图像回归网络并且具有较小的尺寸50,则T.是一个大小为1 × 1 × 1 × 50的4-D数组。

的大小y取决于前一层的输出。以确保y与尺寸相同T.,则必须在输出层之前包含输出正确大小的层。例如,用于图像回归R.回应,以确保y是一个4-D阵列的正确尺寸,可以包含一个完全连通的层的尺寸吗R.在输出层之前。

forwardloss.背瓣函数具有以下输出参数。

函数 输出参数 描述
forwardloss. 损失 预测之间的计算损失y和真正的目标T.
背瓣 DLDY. 关于预测的损失衍生y

背瓣必须输出DLDY.与前一层所期望的大小DLDY.和…一样大小y

GPU兼容性

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

许多MATLAB内置功能支持万博1manbetxgpuArray(并行计算工具箱)dlarray.输入参数。有关支持的功能列表万博1manbetxdlarray.对象,看到Dlarray支持的函数列表万博1manbetx.有关在GPU上执行的函数列表,请参阅在GPU上运行matlab函数(并行计算工具箱)要使用GPU进行深度学习,您还必须具有支持的GPU设备。万博1manbetx有关支持设备的信息,请参阅万博1manbetxGPU通万博1manbetx过发布支持(并行计算工具箱)有关在MATLAB中使用gpu的更多信息,请参见GPU计算在Matlab中(并行计算工具箱)

在网络中包含自定义回归输出层

您可以使用自定义输出层的方式与深度学习工具箱中的任何其他输出层相同。本节展示如何使用自定义输出层创建和训练用于回归的网络。

该示例构建了一个卷积神经网络结构,训练了一个网络,并使用训练的网络来预测旋转的角度,手写数字。这些预测对光学字符识别是有用的。

定义一个自定义的平均绝对误差回归层。要创建此图层,请保存文件maeRegressionLayer.m在当前文件夹中。

加载示例训练数据。

[XTrain,〜,Ytrain] = Digittrain4darraydata;

创建一个层数组,并包含自定义回归输出层MaeRigressionLayer.

layers = [imageInputLayer([28 28 1])卷积2dlayer (5,20) batchNormalizationLayer relullayer fulllyconnectedlayer (1) maeRegressionLayer(“美”
图层= 6x1层阵列,带有图层:1''图像输入28x28x1图像,具有'zerocenter'归一化2''卷积20 5x5卷积与步幅[11]和填充[0 0 0 0] 3'批量归一化批量归一化4''Relu Relu 5''完全连接的1完全连接的第6层'MAE'回归输出意味着绝对误差

设置培训选项,培训网络。

选择= trainingOptions ('sgdm''verbose',错误的);net = trainnetwork(xtrain,ytrain,图层,选项);

通过计算预测和实际旋转角之间的预测误差来评估网络性能。

[xtest,〜,ytest] = dimittest4darraydata;ypred =预测(net,xtest);predictionerror = ytest  -  ypred;

从真实角度计算可接受的误差余量内的预测数量。将阈值设置为10度并计算此阈值内的预测百分比。

thr = 10;numcorrect = sum(abs(predictionError)
               
精度= 0.7524

也可以看看

|||||

相关的话题