主要内容

定义自定义深度学习层

提示

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

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

类型 描述

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

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

分类输出层

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

有关用于定义自定义分类输出层并指定丢失功能的示例,请参阅定义自定义分类输出层

回归输出层

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

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

层模板

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

过渡层模板

分类输出层模板

回归输出层模板

过渡层结构

在训练过程中,软件迭代地向前和向后通过网络。

当向前通过网络时,每一层获取前一层的输出,应用一个函数,然后将结果输出(向前传播)到下一层。

层可以有多个输入或输出。例如,一层可以X1、……Xn从前面的多个层转发输出Z1、……Z到下一层。

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

在网络的反向传递过程中,每一层取损耗相对于该层输出的导数,计算损耗的导数l然后反向传播结果。如果该层有可学习参数,则该层也计算层权值的导数(可学习参数)。该层利用权值的导数来更新可学习参数。

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

中间层特性

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

默认情况下,自定义中间层有以下属性:

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

层的单行描述,指定为字符向量或字符串标量。该描述出现在层显示在数组中。如果不指定层描述,则软件将显示层类名称。

类型 图层的类型,指定为字符向量或字符串标量。的价值类型当层显示在数组中。如果不指定层类型,则软件将显示层类名称。
NumInputs 指定为正整数的层的输入数。如果您不指定此值,则软件将自动设置NumInputs到名字的数量InputNames.默认值为1。
InputNames 指定为字符向量单元格数组的层的输入名称。如果不指定该值和NumInputs大于1,则软件自动设置InputNames{“三机”,…,“客栈”},在那里N等于NumInputs.默认值为{'在'}
NumOutputs 指定为正整数的层输出数。如果您不指定此值,则软件将自动设置NumOutputs到名字的数量输出名称.默认值为1。
输出名称 指定为字符向量单元格数组的层的输出名称。如果不指定该值和NumOutputs大于1,则软件自动设置输出名称{着干活,…,“outM”},在那里等于NumOutputs.默认值为{“出”}

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

提示

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

学习参数

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

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

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

函数 描述
setLearnRateFactor 设置可学习参数的学习速率因子。
setL2Factor 设置一个可学习参数的L2正则化因子。
getlearnratefactor. 得到一个可学习参数的学习率因子。
getL2Factor 得到一个可学习参数的L2正则化因子。

要指定学习速率因子和学习参数的L2因子,请使用语法层= setLearnRateFactor(层、“MyParameterName”值)层= setL2Factor(层、parameterName值),分别。

要获得学习率因子和学习参数的L2因子的值,请使用语法getLearnRateFactor(层,“MyParameterName”)parameterName getL2Factor(层)分别。

例如,此语法将学习速率因子与名称设置为学习速率因子“α”0.1

tallay = setlearnratefactor(图层,“α”, 0.1);

转发功能

一个层使用两个函数之一来执行向前传递:预测向前.如果前向传递是在预测时间,则层使用预测函数。如果向前传递是在训练时间,那么层使用向前函数。如果不需要两个不同的函数来表示预测时间和训练时间,则可以省略向前函数。在本例中,层使用预测在训练时间。

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

语法预测

(Z1,…,Zm评选)=预测(层,X1,…,Xn)
在哪里x1,...,xnn层的输入和Z1,…,Zm评选层输出。的值n必须对应于NumInputsNumOutputs层的属性。

提示

如果输入的数量预测可以变化,然后使用varargin.而不是x1,...,xn.在这种情况下,varargin.输入的单元格数组在哪里变长度输入宗量{我}对应于西.如果输出的数量可以变化,则使用varargout而不是Z1,…,Zm评选.在这种情况下,varargout输出的单元格数组在哪里varargout {j}对应于Zj

提示

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

语法向前

(Z1,…,Zm评选、内存)=前进(层,X1,…,Xn)
在哪里x1,...,xnn层输入,Z1,…,Zm评选层的输出,记忆是记忆层。

提示

如果输入的数量向前可以变化,然后使用varargin.而不是x1,...,xn.在这种情况下,varargin.输入的单元格数组在哪里变长度输入宗量{我}对应于西.如果输出的数量可以变化,则使用varargout而不是Z1,…,Zm评选.在这种情况下,varargout输出的单元格数组在哪里varargout {j}对应于Zjj= 1,......,NumOutputsvarargout {NumOutputs + 1}对应于记忆

提示

如果自定义层有dlnetwork用于学习参数的对象,然后在其中向前函数的自定义层,使用向前的函数dlnetwork对象。使用dlnetwork对象向前功能保证了软件使用正确的层操作进行培训。

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

层输入 输入的大小 观察维度
二维图像 h——- - - - - -w——- - - - - -c——- - - - - -N,在那里hw,c对应于图像的高度,宽度和数量的图像,并且N为观察次数。 4
3-D图像 h——- - - - - -w——- - - - - -d——- - - - - -c——- - - - - -N,在那里hwd,c分别对应于三维图像的高度、宽度、深度和通道数量N为观察次数。 5
向量序列 c——- - - - - -N——- - - - - -年代,在那里c为序列的特征个数,N是观察人数,和年代为序列长度。 2
二维图像序列 h——- - - - - -w——- - - - - -c——- - - - - -N——- - - - - -年代,在那里hw,c分别对应图像的高度、宽度和通道数,N是观察人数,和年代为序列长度。 4
三维图像序列 h——- - - - - -w——- - - - - -d——- - - - - -c——- - - - - -N——- - - - - -年代,在那里hwd,c对应于分别的3-D图像的高度,宽度,深度和数量,N是观察人数,和年代为序列长度。 5

落后的函数

层向后函数计算相对于输入数据的损耗的导数,然后输出(向后传播)结果到上一层。如果该图层具有可学习参数(例如,层权重),则落后的也计算可学习参数的导数。当使用trainNetwork函数,在后向通过期间,该图层使用这些衍生物自动更新可读参数。

定义后向功能是可选的。如果您未指定向后函数,并且将转发功能支持金宝appdlarray对象,则软件使用自动判别功能自动判定后向。获取支持的函数列表金宝appdlarray对象,参见支持dlarray的函数列表金宝app.当您想要定义自定义后向功能:

  • 使用特定算法来计算衍生物。

  • 使用前向函数中不支持的操作金宝appdlarray对象。

自定义图层,可学习dlnetwork对象不支持自定义向后函数。金宝app

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

语法落后的

[dLdX1,…,dLdXn, dLdW1,…,dLdWk] =向后(Z1,层,X1,…,Xn…,Zm评选,dLdZ1,…,dLdZm,内存)
地点:

  • x1,...,xnn层的输入

  • Z1,…,Zm评选输出层forward函数

  • dLdZ1,…,dLdZm渐变是否从下一层向后传播

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

的输出,dldx1,...,dldxn是关于层输入的损失的衍生物dLdW1,…,dLdWk是关于损失的衍生品k可学的参数。为了防止在前向传递和后向传递之间保存未使用的变量,从而减少内存使用,可以将相应的输入参数替换为

提示

如果输入的数量落后的可以变化,然后使用varargin.而不是后面的输入参数.在这种情况下,varargin.输入的单元格数组在哪里变长度输入宗量{我}对应于西= 1,......,NumInputs变长度输入宗量{NumInputs + j}varargin {numinputs + numoutputs + j}对应于ZjdLdZj分别为j= 1,......,NumOutputs,变长度输入宗量{结束}对应于记忆

如果输出的数量可以变化,则使用varargout而不是输出参数。在这种情况下,varargout输出的单元格数组在哪里varargout{我}对应于dLdXi= 1,......,NumInputsvarargout {NumInputs + t}对应于dLdWtt= 1,......,k,在那里k是学习参数的数量。

的值x1,...,xnZ1,…,Zm评选与前向函数相同。的尺寸dLdZ1,…,dLdZm和的尺寸一样吗Z1,…,Zm评选,分别。

的维度和数据类型dldx1,...,dldxn与的维度和数据类型相同吗x1,...,xn,分别。的维度和数据类型dLdW1、……dLdWk的维度和数据类型是否相同W1.、……,分别。

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

l X j l z j z j X

l W j l Z j Z j W

当使用trainNetwork函数时,该层使用导数自动更新可学习参数dLdW1、……dLdWk在落后通过。

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

GPU的兼容性

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

许多matlab.®内置函数支持金宝appGPUArray.(并行计算工具箱)dlarray输入参数。获取支持的函数列表金宝appdlarray对象,参见支持dlarray的函数列表金宝app.有关在GPU上执行的函数列表,请参见在GPU上运行MATLAB函数(并行计算工具箱)要使用GPU进行深度学习,还必须有CUDA®使英伟达®GPU,计算能力3.0或更高。有关使用Matlab的GPU的更多信息,请参阅MATLAB中的GPU计算(并行计算工具箱)

代码生成的兼容性

要创建一个支持代码生成的自定义层:金宝app

  • 层必须指定pragma%#codegen.在层定义中。

  • 的输入预测必须:

    • 一致的维度。每个输入都应该具有相同数量的维度。

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

  • 的输出预测尺寸和批大小必须与层输入一致。

  • 非标量属性必须具有类型单个,double或字符数组。

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

代码生成只支持带有二维图像输入的金宝app中间层。

有关如何创建支持代码生成的自定义层的示例,请参见金宝app定义用于代码生成的自定义深度学习层

网络的作文

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

  • 创建一个代表可学习层块的自定义层。例如,一个残留块。

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

  • 用循环创建网络。例如,网络的某些部分将其输出反馈给自身。

层有效性检查

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

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

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

检查图层的有效性checkLayer

检查自定义层的图层有效性前列腺素

定义一个自定义PReLU层。要创建这个图层,保存文件preluLayer.m在当前文件夹中。

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

指定观察和集合的输入的典型大小“ObservationDimension”4。

层=前列腺(20,“prelu”);validInputSize = [24 24 20];CheckLayer(图层,validInputSize,“ObservationDimension”4)
跳过GPU测试。找不到兼容的GPU设备。跳过代码生成兼容性测试。要检查代码生成图层的有效性,请指定“CheckCodeGencompatibility”和“观察Dimension”选项。运行nnet.Checklayer.TestLayerWithoutBound ..........完成了NNet.CheckLayer.TestLayerWithoutBound __________测试摘要:13传递,0失败,0不完整,8个跳过。经过时间:0.23895秒。

在这里,函数没有检测到层的任何问题。

在网络中包含层

您可以使用自定义层与深度学习工具箱中的任何其他层相同的方式。

定义一个自定义PReLU层。要创建这个图层,保存文件preluLayer.m在当前文件夹中。

创建包含自定义层的层阵列前列腺素

[imageInputLayer([28 28 1])卷积2dlayer (5,20) batchNormalizationLayer preluLayer(20, 20)“prelu”) fulllyconnectedlayer (10) softmaxLayer classificationLayer;

输出层架构

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

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

输出层属性

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

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

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

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

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

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

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

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

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

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

损失功能

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

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

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

语法backwardLossDLDY = Backwardloss(图层,y,t).输入Y包含了电视台和T包含培训目标。输出DLDY.是关于预测的损失的衍生物Y.输出DLDY.必须与图层输入的大小相同Y

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

分类任务 输入的大小 观察维度
二维图像分类 1-by-1-by-K——- - - - - -N,在那里K班级的数量是多少N为观察次数。 4
3-D图像分类 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
三维图像回归 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的兼容性

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

许多MATLAB内置函数支持金宝appGPUArray.(并行计算工具箱)dlarray输入参数。获取支持的函数列表金宝appdlarray对象,参见支持dlarray的函数列表金宝app.有关在GPU上执行的函数列表,请参见在GPU上运行MATLAB函数(并行计算工具箱)要使用GPU进行深度学习,您还必须拥有CUDA启用的NVIDIA GPU,Compute能力3.0或更高。有关使用Matlab的GPU的更多信息,请参阅MATLAB中的GPU计算(并行计算工具箱)

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

您可以使用与Deep Learning Toolbox中的任何其他输出层相同的自定义输出层。本节显示如何使用自定义输出层创建和培训用于回归的网络。

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

定义自定义平均绝对错误回归层。要创建这个图层,保存文件MaeRightionLayer.m.在当前文件夹中。

加载示例训练数据。

[XTrain ~, YTrain] = digitTrain4DArrayData;

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

layers = [imageInputLayer([28 28 1])卷积2dlayer (5,20) batchNormalizationLayer relullayer fulllyconnectedlayer (1) maeRegressionLayer('Mae')]
层= 6 x1层与层:数组1”的形象输入28 x28x1图像zerocenter正常化2”卷积20 5 x5旋转步[1]和填充[0 0 0 0]3“批量标准化批量标准化4”ReLU ReLU 5”完全连接1完全连接层6‘美’回归输出平均绝对误差

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

选择= trainingOptions (“个”“详细”、假);网= trainNetwork (XTrain、YTrain层,选择);

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

[XTest ~,欧美]= digitTest4DArrayData;YPred =预测(净,XTest);predictionError = YTest - YPred;

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

用力推= 10;numCorrect = sum(abs(predictionError) < thr);numTestImages =大小(XTest 4);= numCorrect / numTestImages准确性
精度= 0.7524

另请参阅

|||||

相关的话题