提示
本主题说明如何为您的问题定义自定义深度学习层。有关深度学习工具箱™中的内置层列表,请参见深度学习层名单.
本主题解释深度学习层的体系结构,以及如何定义用于解决问题的自定义层。
类型 | 描述 |
---|---|
层 | 定义自定义的深度学习层,并指定可选的学习参数。 有关用于使用可学习参数定义自定义图层的示例,请参阅使用可学习参数定义自定义深度学习层.有关如何使用多个输入定义自定义层的示例,请参见定义自定义深度学习层与多个输入. |
分类输出层 | 定义自定义分类输出层并指定丢失函数。 有关用于定义自定义分类输出层并指定丢失功能的示例,请参阅定义自定义分类输出层. |
回归输出层 | 定义自定义回归输出层并指定丢失函数。 有关如何定义自定义回归输出层和指定损失函数的示例,请参见定义自定义回归输出层. |
您可以使用以下模板来定义新图层。
在训练过程中,软件迭代地向前和向后通过网络。
当向前通过网络时,每一层获取前一层的输出,应用一个函数,然后将结果输出(向前传播)到下一层。
层可以有多个输入或输出。例如,一层可以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 .默认值为{“出”} . |
如果该层没有其他属性,则可以省略属性
部分。
提示
如果要创建具有多个输入的图层,那么您必须设置NumInputs
或InputNames
属性在层构造函数中。如果你正在创建一个有多个输出的图层,那么你必须设置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,...,xn
是n
层的输入和Z1,…,Zm评选
是米
层输出。的值n
和米
必须对应于NumInputs
和NumOutputs
层的属性。
提示
如果输入的数量预测
可以变化,然后使用varargin.
而不是x1,...,xn
.在这种情况下,varargin.
输入的单元格数组在哪里变长度输入宗量{我}
对应于西
.如果输出的数量可以变化,则使用varargout
而不是Z1,…,Zm评选
.在这种情况下,varargout
输出的单元格数组在哪里varargout {j}
对应于Zj
.
提示
如果自定义层有dlnetwork
用于学习参数的对象,然后在其中预测
函数的自定义层,使用预测
函数为dlnetwork
.使用dlnetwork
对象预测
功能可确保软件使用正确的图层操作进行预测。
语法向前
是
(Z1,…,Zm评选、内存)=前进(层,X1,…,Xn)
x1,...,xn
是n
层输入,Z1,…,Zm评选
是米
层的输出,记忆
是记忆层。
提示
如果输入的数量向前
可以变化,然后使用varargin.
而不是x1,...,xn
.在这种情况下,varargin.
输入的单元格数组在哪里变长度输入宗量{我}
对应于西
.如果输出的数量可以变化,则使用varargout
而不是Z1,…,Zm评选
.在这种情况下,varargout
输出的单元格数组在哪里varargout {j}
对应于Zj
为j
= 1,......,NumOutputs
和varargout {NumOutputs + 1}
对应于记忆
.
提示
如果自定义层有dlnetwork
用于学习参数的对象,然后在其中向前
函数的自定义层,使用向前
的函数dlnetwork
对象。使用dlnetwork
对象向前
功能保证了软件使用正确的层操作进行培训。
输入的尺寸取决于数据的类型和连接层的输出:
层输入 | 输入的大小 | 观察维度 |
---|---|---|
二维图像 | h——- - - - - -w——- - - - - -c——- - - - - -N,在那里h,w,c对应于图像的高度,宽度和数量的图像,并且N为观察次数。 | 4 |
3-D图像 | h——- - - - - -w——- - - - - -d——- - - - - -c——- - - - - -N,在那里h,w,d,c分别对应于三维图像的高度、宽度、深度和通道数量N为观察次数。 | 5 |
向量序列 | c——- - - - - -N——- - - - - -年代,在那里c为序列的特征个数,N是观察人数,和年代为序列长度。 | 2 |
二维图像序列 | h——- - - - - -w——- - - - - -c——- - - - - -N——- - - - - -年代,在那里h,w,c分别对应图像的高度、宽度和通道数,N是观察人数,和年代为序列长度。 | 4 |
三维图像序列 | h——- - - - - -w——- - - - - -d——- - - - - -c——- - - - - -N——- - - - - -年代,在那里h,w,d,c对应于分别的3-D图像的高度,宽度,深度和数量,N是观察人数,和年代为序列长度。 | 5 |
层向后函数计算相对于输入数据的损耗的导数,然后输出(向后传播)结果到上一层。如果该图层具有可学习参数(例如,层权重),则落后的
也计算可学习参数的导数。当使用trainNetwork
函数,在后向通过期间,该图层使用这些衍生物自动更新可读参数。
定义后向功能是可选的。如果您未指定向后函数,并且将转发功能支持金宝appdlarray
对象,则软件使用自动判别功能自动判定后向。获取支持的函数列表金宝appdlarray
对象,参见支持dlarray的函数列表金宝app.当您想要定义自定义后向功能:
使用特定算法来计算衍生物。
使用前向函数中不支持的操作金宝appdlarray
对象。
自定义图层,可学习dlnetwork
对象不支持自定义向后函数。金宝app
要定义自定义向后函数,请创建名为落后的
.
语法落后的
是
[dLdX1,…,dLdXn, dLdW1,…,dLdWk] =向后(Z1,层,X1,…,Xn…,Zm评选,dLdZ1,…,dLdZm,内存)
x1,...,xn
是n
层的输入
Z1,…,Zm评选
是米
输出层forward函数
dLdZ1,…,dLdZm
渐变是否从下一层向后传播
记忆
内存输出是向前
如果向前
定义,否则,记忆
是[]
.
的输出,dldx1,...,dldxn
是关于层输入的损失的衍生物dLdW1,…,dLdWk
是关于损失的衍生品k
可学的参数。为了防止在前向传递和后向传递之间保存未使用的变量,从而减少内存使用,可以将相应的输入参数替换为~
.
提示
如果输入的数量落后的
可以变化,然后使用varargin.
而不是后面的输入参数层
.在这种情况下,varargin.
输入的单元格数组在哪里变长度输入宗量{我}
对应于西
为我
= 1,......,NumInputs
,变长度输入宗量{NumInputs + j}
和varargin {numinputs + numoutputs + j}
对应于Zj
和dLdZj
分别为j
= 1,......,NumOutputs
,变长度输入宗量{结束}
对应于记忆
.
如果输出的数量可以变化,则使用varargout
而不是输出参数。在这种情况下,varargout
输出的单元格数组在哪里varargout{我}
对应于dLdXi
为我
= 1,......,NumInputs
和varargout {NumInputs + t}
对应于dLdWt
为t
= 1,......,k
,在那里k
是学习参数的数量。
的值x1,...,xn
和Z1,…,Zm评选
与前向函数相同。的尺寸dLdZ1,…,dLdZm
和的尺寸一样吗Z1,…,Zm评选
,分别。
的维度和数据类型dldx1,...,dldxn
与的维度和数据类型相同吗x1,...,xn
,分别。的维度和数据类型dLdW1
、……dLdWk
的维度和数据类型是否相同W1.
、……周
,分别。
要计算损失的导数,可以使用链式法则:
当使用trainNetwork
函数时,该层使用导数自动更新可学习参数dLdW1
、……dLdWk
在落后通过。
有关如何定义自定义向后函数的示例,请参见指定自定义层向后函数.
如果层转发功能完全支持金宝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
在预测和目标之间使用正向损失函数,并计算损失相对于使用向后损失函数的预测的导数。
语法forwardLoss
是loss = forwardLoss(layer, Y, T)
.输入Y
与电视台的预测相符。这些预测是前一层的输出。输入T
与培训目标相对应。输出损失
是两者之间的损失Y
和T
根据指定的损耗函数。输出损失
必须是标量。
如果支持层转发丢失功能金宝appdlarray
对象,则软件自动确定后向损失功能。获取支持的函数列表金宝appdlarray
对象,参见支持dlarray的函数列表金宝app.或者,要定义自定义向后损失函数,请创建名为backwardLoss
.有关如何定义自定义后向损耗功能的示例,请参阅指定自定义输出层向后丢失功能.
语法backwardLoss
是DLDY = 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
,则必须在输出层之前包含输出正确大小的层。例如,为了确保Y
4-D数组的预测得分是什么K类,您可以包含完全连接的大小层K在输出层之前有一个softmax层。
对于回归问题,的维度T
还取决于问题的类型。
回归的任务 | 输入的大小 | 观察维度 |
---|---|---|
二维图像回归 | 1-by-1-by-R——- - - - - -N,在那里R是多少回应和N为观察次数。 | 4 |
二维Image-to-image回归 | h——- - - - - -w——- - - - - -c——- - - - - -N ,在那里h,w,c输出通道的高度、宽度和数量分别是N为观察次数。 |
4 |
三维图像回归 | 1-by-1-by-1-by -R——- - - - - -N,在那里R是多少回应和N为观察次数。 | 5 |
3 d Image-to-image回归 | h——- - - - - -w——- - - - - -d——- - - - - -c——- - - - - -N ,在那里h,w,d,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在输出层之前。
的forwardLoss
和backwardLoss
函数有以下输出参数。
函数 | 输出参数 | 描述 |
---|---|---|
forwardLoss |
损失 |
计算预测之间的损失Y 真正的目标T . |
backwardLoss |
DLDY. |
损失相对于预测的导数Y . |
的backwardLoss
必须输出DLDY.
上一层预期的大小和DLDY.
与之相同Y
.
如果层转发功能完全支持金宝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
汇编
|checkLayer
|getL2Factor
|getlearnratefactor.
|setL2Factor
|setLearnRateFactor