如果你创建一个自定义的深度学习层,那么你可以使用核对层
函数检查层是否有效。该函数检查层的有效性、GPU兼容性、正确定义的渐变和代码生成兼容性。要检查层是否有效,请运行以下命令:
检查层(层,有效输入大小,'ObservationDimension',尺寸)
层
是该层的一个实例,validInputSize
是指定到图层的有效输入大小的矢量或单元格数组昏暗的
指定图层输入数据中的观察的维度。对于大输入大小,渐变检查需要更长时间运行。要加快测试,请指定较小的有效输入大小。
检查示例自定义层的有效性前奏者
.
定义自定义proLu层。要创建此图层,请保存文件预演者
在当前文件夹中。
创建一个层的实例,并检查它是否有效使用核对层
。将有效输入大小设置为层的单个观测输入的典型大小。对于单个输入,层期望的观测值大小为h——- - - - - -w——- - - - - -c哪里h,w, 和c分别是前一层输出的通道的高度、宽度和数量。
具体说明validInputSize
作为输入数组的典型大小。
层=预铺层(20,'prelu');validInputSize = [5 5 20];CheckLayer(图层,ValidInputSize)
跳过multi-observation测试。要启用带有多个观察的测试,请指定“ObservationDimension”选项。对于2d图像数据,将“ObservationDimension”设置为4。对于3-D图像数据,将“ObservationDimension”设置为5。对于序列数据,设置'ObservationDimension'为2。跳过GPU测试。没有找到兼容的GPU设备。跳过代码生成兼容性测试。要检查代码生成层的有效性,请指定“CheckCodegenCompatibility”和“ObservationDimension”选项。运行nnet.checklayer.TestLayerWithoutBackward ......... Done nnet.checklayer.TestLayerWithoutBackward __________ Test Summary: 9 Passed, 0 Failed, 0 Incomplete, 13 Skipped. Time elapsed: 0.14162 seconds.
结果显示通过、失败和跳过测试的数量。如果不指定“观察维度”
选项,或没有GPU,则该功能跳过相应的测试。
检查多个观测
对于多观察输入,该层预计尺寸的观察阵列h——- - - - - -w——- - - - - -c——- - - - - -N哪里h,w, 和c分别是通道的高度、宽度和数量,以及N为观察次数。
要检查多个观察的图层有效性,请指定观察和设置的典型大小'观察树'
4。
层=预铺层(20,'prelu');validInputSize = [5 5 20];CheckLayer(图层,validInputSize,'观察树'4)
跳过GPU测试。找不到兼容的GPU设备。跳过代码生成兼容性测试。要检查代码生成层的有效性,请指定“CheckCodegenCompatibility”和“ObservationDimension”选项。正在运行nnet.checklayer.TestLayerWithoutBackward。。。完成nnet.checklayer.TestLayerWithoutBackward测试摘要:13通过,0失败,0不完整,9跳过。所用时间:0.064861秒。
在这种情况下,该功能不会检测到图层的任何问题。
的核对层
函数通过执行一系列测试来检查自定义层的有效性。
的核对层
函数使用这些测试检查自定义中间层(类型为nnet.layer.layer
)。
测试 | 描述 |
---|---|
函数yntaxesarecorrect. |
层函数的语法定义正确。 |
predictdoesnoterror. |
预测 没有错误。 |
我不害怕 |
当指定时, |
ForwardPredictareConsistentInsize. |
当 |
落后并不可怕 |
当指定时,落后 没有错误。 |
后胸痛 |
当
|
PredictisConsistentType |
的输出 |
原isconsistentintype. |
当 |
backwardIsConsistentInType |
当 |
gradientsAreNumericallyCorrect |
当落后 指定时,在中计算的渐变落后 与数值梯度保持一致。 |
BackwardPropagationDoesNotError. |
当落后 若未指定,则可使用自动微分计算导数。 |
代码genpragmadefinedinclassdef |
布拉格马“%#codegen” 用于代码生成在类文件中指定。 |
checkFor金宝appSupportedLayerPropertiesForCodegen |
图层特性支持代码生成。金宝app |
predictIsValidForCodeGeneration |
预测 对于代码生成有效。 |
测试PredictisConsistentType
,原isconsistentintype.
, 和backwardIsConsistentInType
还要检查GPU兼容性。要在GPU上执行层函数,函数必须支持类型为的输入和输出金宝appgpuArray
使用底层数据类型仅有一个的
.
的核对层
函数使用这些测试来检查自定义输出图层的有效性(类型类型nnet.layer.ClassificationLayer
或nnet.layer.RegressionLayer
)。
测试 | 描述 |
---|---|
forwardLossDoesNotError |
forwardloss. 没有错误。 |
后向损失不可怕 |
backwardLoss 没有错误。 |
forwardLossIsScalar |
的输出forwardloss. 是标量。 |
反向沃索斯审查istentinsize. |
当backwardLoss 时,输出backwardLoss 尺寸一致:德迪 与预测的尺寸相同Y . |
正向损失一致性类型 |
的输出 |
backwardLossIsConsistentInType |
当 |
gradientsAreNumericallyCorrect |
当backwardLoss 指定时,在中计算的渐变backwardLoss 数字是正确的。 |
BackwardPropagationDoesNotError. |
当backwardLoss 若未指定,则可使用自动微分计算导数。 |
的正向损失一致性类型
和backwardLossIsConsistentInType
测试还检查GPU兼容性。要在GPU上执行层函数,函数必须支持类型为的输入和输出金宝appgpuArray
使用底层数据类型仅有一个的
.
检查图层有效性,核对层
函数根据图层类型生成数据:
层类型 | 生成数据描述 |
---|---|
中间 | 取值范围[-1,1] |
回归输出 | [-1,1]范围内的预测和目标 |
分类输出 | 预测值在[0,1]范围内。 如果您指定了 如果不指定 |
要检查多个观察,请使用该观察维度指定观察维度'观察树'
名称值对。如果指定观察维度,那么核对层
函数使用大小为1和2的小批量生成的数据检查图层函数是否有效。如果未指定此名称-值对,则函数将跳过检查图层函数是否对多个观测有效的测试。
如果在使用时测试失败核对层
,然后该函数提供测试诊断和框架诊断。测试诊断突出显示层中发现的任何问题。框架诊断提供了更详细的信息。
测试函数yntaxesarecorrect.
检查图层函数是否具有正确定义的语法。
测试诊断 | 描述 | 可能的解决方案 |
---|---|---|
图层中“predict”的输入参数数量不正确 . |
的语法预测 功能与层输入的数量不一致。 |
在中指定正确数量的输入和输出参数 的语法 提示 如果输入的数量 提示 如果自定义层有 |
在图层中“预测”的输出参数的数量不正确 |
的语法预测 功能与层输出的数量不一致。 |
|
层中“forward”的输入参数数量不正确 |
可选的语法向前 功能与层输入的数量不一致。 |
在中指定正确数量的输入和输出参数 的语法 提示 如果输入的数量 提示 如果自定义层有 |
层中“forward”的输出参数数目不正确 |
可选的语法向前 功能与层输出的数量不一致。 |
|
图层中“向后”的输入参数数量不正确 |
可选的语法落后 功能与层输入和输出的数量不一致。 |
在中指定正确数量的输入和输出参数 的语法
的输出, 提示 如果输入的数量 如果输出的数量可以变化,则使用 提示 如果层前向功能支持金宝app |
层中“向后”的输出参数数目不正确 |
可选的语法落后 功能与层输出的数量不一致。 |
对于具有多个输入或输出的图层,必须设置图层特性的值NumInputs
(或者,输入名称
)及NumOutputs
(或者,OutputNames
)分别在层构造函数中。
的核对层
功能检查图层函数是否有效,可用于单个和多个观察。要检查多个观察,请使用该观察维度指定观察维度'观察树'
名称值对。如果指定观察维度,那么核对层
函数使用大小为1和2的小批量生成的数据检查图层函数是否有效。如果未指定此名称-值对,则函数将跳过检查图层函数是否对多个观测有效的测试。
测试诊断 | 描述 | 可能的解决方案 |
---|---|---|
跳过multi-observation测试。要启用带有多个观察的检查,请在checkLayer中指定'ObservationDimension'参数 . |
如果不指定'观察树' 参数核对层 然后,该功能跳过测试以多个观察数据检查数据。 |
使用命令 有关更多信息,请参见层输入大小. |
这些测试检查层在传递有效大小的输入数据时是否出错。
中间层。测试predictdoesnoterror.
,我不害怕
, 和落后并不可怕
检查层函数在传递有效大小的输入时是否出错。如果指定观察标注,则该函数将检查图层的单个观察和多个观察。
测试诊断 | 描述 | 可能的解决方案 |
---|---|---|
函数“predict”引发错误: |
的预测 当传递大小数据时,函数错误validInputSize . |
解决中描述的错误 提示 如果层前向功能支持金宝app |
forward函数抛出了一个错误: |
可选的向前 当传递大小数据时,函数错误validInputSize . |
|
函数“backward”引发了一个错误: |
可选的落后 函数错误时传递的输出预测 . |
输出层。测试forwardLossDoesNotError
和后向损失不可怕
检查层函数在传递有效大小的输入时是否出错。如果指定观察标注,则该函数将检查图层的单个观察和多个观察。
测试诊断 | 描述 | 可能的解决方案 |
---|---|---|
函数“forwardLoss”引发错误: |
的forwardloss. 当传递大小数据时,函数错误validInputSize . |
解决中描述的错误 提示 如果是 |
函数“BackardLoss”引发错误: |
可选的backwardLoss 当传递大小数据时,函数错误validInputSize . |
这些测试检查层函数输出的大小是否一致。
中间层。测试后胸痛
检查落后
函数输出正确大小的导数。
的语法落后
是[DLDX1,...,DLDXN,DLDW1,...,DLDWK] =向后(图层,X1,...,XN,Z1,...,ZM,DLDZ1,...,DLDZM,内存)
,其中:
X1,…,Xn
是n
层的输入
z1,...,zm
是米
输出层forward函数
dLdZ1,…,dLdZm
渐变是否从下一层向后传播
记忆力
内存输出是向前
如果向前
定义,否则,记忆力
是[]
.
的输出,dLdX1,…,dLdXn
损耗对层输入和的导数是多少dLdW1,…,dLdWk
是损失的衍生品,与k
可学的参数。为了防止在前向传递和后向传递之间保存未使用的变量,从而减少内存使用,可以将相应的输入参数替换为~
.
提示
如果输入的数量落后
可以变化,然后使用瓦拉金
而不是之后的输入参数层
.在这种情况下,瓦拉金
是输入的单元格数组,其中变长度输入宗量{我}
对应于席
为了我
=1,…,NumInputs
,varargin{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
是可学习参数的数目。
衍生品DLDX1.
,......,dLdXn
必须与相应的层输入的大小相同,并且dLdW1,…,dLdWk
必须与相应的可学习参数大小相同。对于具有单个和多个观测值的输入数据,大小必须一致。
测试诊断 | 描述 | 可能的解决方案 |
---|---|---|
“向后”的“dLdX”大小不正确 . |
损失对层输入的导数必须与相应层输入的大小相同。 | 返回衍生品 |
“反向”输入“in1”的损失导数大小不正确 |
||
从'forward'返回的'Z'大小必须与'predict'相同 . |
的输出预测 必须与对应的输出相同大小向前 . |
返回输出 |
“反向”损失相对于“W”的导数大小不正确 . |
关于可学习参数的损失的衍生物必须与相应的学习参数相同。 | 返回衍生品 |
提示
如果层前向功能支持金宝appdlarray.
对象,则软件会自动确定向后函数,而无需指定落后
函数。获取支持的函数列表金宝appdlarray.
对象,看到支持dlarray的函数列表金宝app.
输出层。测试forwardLossIsScalar
检查forwardloss.
函数是标量。当。。。的时候backwardLoss
如果指定了函数,则测试反向沃索斯审查istentinsize.
检查forwardloss.
和backwardLoss
尺寸正确。
的语法forwardloss.
是loss = forwardLoss(layer, Y, T)
.输入Y
与网络做出的预测相对应。这些预测是前一层的输出。输入T
与培训目标相对应。输出丧失
是之间的损失Y
和T
根据指定的损失函数。输出丧失
必须是标量。
如果是forwardloss.
功能支持金宝appdlarray.
对象,则软件自动确定向后损失功能,您不需要指定backwardLoss
函数。获取支持的函数列表金宝appdlarray.
对象,看到支持dlarray的函数列表金宝app.
的语法backwardLoss
是dLdY=后向损失(层,Y,T)
.输入Y
包含网络所做的预测,以及T
包含培训目标。输出德迪
损失相对于预测的导数是多少Y
.输出德迪
必须与图层输入的大小相同Y
.
测试诊断 | 描述 | 可能的解决方案 |
---|---|---|
“远期损失”的“损失”大小不正确 . |
输出丧失 属于forwardloss. 必须是标量。 |
返回输出 |
'反向升降'的损失'DLDY'的衍生物的衍生物的规模不正确 . |
当backwardLoss 时,损耗对层输入的导数必须与层输入的大小相同。 |
返回衍生物 如果是 |
这些测试检查层函数输出的类型是否一致,以及层函数是否与GPU兼容。
如果层转发功能完全支持金宝appdlarray.
对象,则该层是GPU兼容的。否则,为了与GPU兼容,层函数必须支持输入和返回输出类型金宝appgpuArray
(并行计算工具箱).
许多MATLAB®内置函数支持金宝appgpuArray
(并行计算工具箱)和dlarray.
输入参数。有关支持的函数的列表金宝appdlarray.
对象,看到支持dlarray的函数列表金宝app.有关在GPU上执行的函数列表,请参见在GPU上运行MATLAB函数(并行计算工具箱).要使用GPU进行深度学习,您还必须有支持的GPU设备。金宝app有关支持的设备的信息,请参见金宝appGPU支金宝app持情况(并行计算工具箱).有关在MATLAB中使用GPU的更多信息,请参见MATLAB中的GPU计算(并行计算工具箱).
中间层。测试PredictisConsistentType
,原isconsistentintype.
, 和backwardIsConsistentInType
检查图层功能输出变量的数据类型是否正确。当给定数据类型的输入时,测试检查层函数是否返回一致的数据类型仅有一个的
,双重的
, 和gpuArray
用底层类型仅有一个的
或双重的
.
提示
如果使用函数预分配数组,例如0
,则必须确保这些数组的数据类型与层函数输入一致。要创建与另一个数组具有相同数据类型的零数组,请使用“喜欢”
选择0
.例如,初始化一个大小为零的数组深圳
与数组相同的数据类型X
使用Z=零(sz,'like',X)
.
测试诊断 | 描述 | 可能的解决方案 |
---|---|---|
“预测”的“Z”类型不正确 . |
输出的类型z1,...,zm 的预测 功能必须与输入一致X1,…,Xn . |
返回输出 |
“预测”的输出类型不正确 . |
||
'转发'的“z”类型不正确 . |
输出的类型z1,...,zm 任择议定书向前 功能必须与输入一致X1,…,Xn . |
|
“正向”的输出“out1”类型不正确 . |
||
“向后”的“dLdX”类型不正确 . |
衍生物的类型dLdX1,…,dLdXn 任择议定书落后 功能必须与输入一致X1,…,Xn . |
返回衍生品 |
与输入“in1”有关的“向后”损失导数类型不正确 . |
||
关于'向后'W'的损失的衍生类型不正确的类型 . |
可学习参数损失导数的类型必须与相应的可学习参数一致。 | 对于每个可学习参数,返回与相应可学习参数类型相同的导数。 |
提示
如果层前向功能支持金宝appdlarray.
对象,则软件会自动确定向后函数,而无需指定落后
函数。获取支持的函数列表金宝appdlarray.
对象,看到支持dlarray的函数列表金宝app.
输出层。测试正向损失一致性类型
和backwardLossIsConsistentInType
检查该层函数输出的数据类型是否正确。当给定数据类型输入时,测试检查各层是否返回一致的数据类型仅有一个的
,双重的
, 和gpuArray
用底层类型仅有一个的
或双重的
.
测试诊断 | 描述 | 可能的解决方案 |
---|---|---|
“forwardLoss”的“loss”类型不正确 . |
输出的类型丧失 的forwardloss. 函数必须与输入保持一致Y . |
返回 |
损失“dLdY”的衍生工具类型不正确,用于“反向损失” . |
输出的类型德迪 任择议定书backwardLoss 函数必须与输入保持一致Y . |
返回 |
提示
如果是forwardloss.
功能支持金宝appdlarray.
对象,则软件自动确定向后损失功能,您不需要指定backwardLoss
函数。获取支持的函数列表金宝appdlarray.
对象,看到支持dlarray的函数列表金宝app.
测试gradientsAreNumericallyCorrect
检查由层函数计算的梯度数值是否正确。测试BackwardPropagationDoesNotError.
检查衍生品是否可以使用自动微分来计算。
中间层。当可选时落后
未指定函数,则测试失败BackwardPropagationDoesNotError.
检查衍生品是否可以使用自动微分来计算。当可选时落后
如果指定了函数,则测试gradientsAreNumericallyCorrect
用于计算梯度的测试落后
数字是正确的。
测试诊断 | 描述 | 可能的解决方案 |
---|---|---|
应为没有维度标签的dlarray,但找到了标签 . |
当可选时落后 函数未指定时,层转发函数必须输出dlarray. 没有标注标签的对象。 |
确保任何dlarray. 在层转发函数中创建的对象不包含维度标签。 |
无法通过图层反向传播。检查“向前”功能是否完全支持自动区分。金宝app或者,手动实现'backward'函数 . |
以下一项或多项:
|
检查前进功能是否支持金宝app 检查输入的导数 或者,通过创建名为 |
无法通过图层反向传播。检查“predict”功能是否完全支持自动区分。金宝app或者,手动实现'backward'函数 . |
||
‘backward’的导数‘dLdX’与数值梯度不一致 . |
以下一项或多项:
|
如果层前向功能支持金宝app 检查导数是否正确 如果导数计算正确,那么 如果绝对和相对误差在公差的可接受范围内,则可以忽略此测试诊断。 |
关于“落后”的输入'In1'丢失的导数与数值梯度不一致 . |
||
“向后”的损失对“W”的导数与数值梯度不一致 . |
提示
如果层前向功能支持金宝appdlarray.
对象,则软件会自动确定向后函数,而无需指定落后
函数。获取支持的函数列表金宝appdlarray.
对象,看到支持dlarray的函数列表金宝app.
输出层。当可选时backwardLoss
未指定函数,则测试失败BackwardPropagationDoesNotError.
检查衍生品是否可以使用自动微分来计算。当可选时backwardLoss
如果指定了函数,则测试gradientsAreNumericallyCorrect
用于计算梯度的测试backwardLoss
数字是正确的。
测试诊断 | 描述 | 可能的解决方案 |
---|---|---|
应为没有维度标签的dlarray,但找到了标签 |
当可选时backwardLoss 功能未指定,forwardloss. 函数必须输出dlarray. 没有标注标签的对象。 |
确保任何dlarray. 在中创建的对象forwardloss. 函数不包含标注标签。 |
无法通过图层反向传播。检查“forwardLoss”功能是否完全支持自动区分。金宝app或者,手动实现'backwardLoss'功能 |
以下一项或多项:
|
检查 检查输入的导数 或者,通过创建名为 |
'反向升降机'的衍生物'DLDY'与数值梯度不一致 . |
以下一项或多项:
|
检查导数是否正确 如果导数计算正确,那么 如果绝对和相对误差在公差的可接受范围内,则可以忽略此测试诊断。 |
提示
如果是forwardloss.
功能支持金宝appdlarray.
对象,则软件自动确定向后损失功能,您不需要指定backwardLoss
函数。获取支持的函数列表金宝appdlarray.
对象,看到支持dlarray的函数列表金宝app.
如果你设定“CheckCodegenCompatibility”
选项符合事实的
,然后核对层
函数检查层的代码生成兼容性。
测试代码genpragmadefinedinclassdef
检查层定义是否包含代码生成提示%#编码基因
.测试checkFor金宝appSupportedLayerPropertiesForCodegen
检查图层属性是否支持代码生成。测试金宝apppredictIsValidForCodegeneration
检查预测
尺寸和批尺寸一致。
代码生成仅支持具有2-D图像输入金宝app的中间层。
测试诊断 | 描述 | 可能的解决方案 |
---|---|---|
在自定义层的类定义中指定'%#codegen' |
层定义不包括pragma“%#codegen” 代码生成。 |
添加 |
Nonscalar层属性必须是自定义层的类型单个或双或字符数组 |
该层包含除单数组、双数组或字符数组以外类型的非标量特性。 | 将非标量特性转换为使用single、double或character array类型的表示形式。 例如,将类别数组转换为整数类型数组 |
标量图层属性必须是自定义图层的数字,逻辑或字符串 |
图层包含除数字、逻辑或字符串以外的类型的标量属性。 | 将标量属性转换为使用数字表示形式,或逻辑或字符串类型的表示形式。 例如,将分类标量转换为类型为的整数 |
对于代码生成,“Z”的维数必须与图层输入的维数相同 . |
输出的维度数 |
在 |
对于代码生成,“Z”必须与层输入具有相同的批大小 . |
输出的批大小 |
在 |