如果您创建了自定义深度学习层,则可以使用checkLayer
函数检查该层是否有效。该函数检查层的有效性、GPU兼容性、正确定义的梯度和代码生成兼容性。使用实例检查某层是否有效。
validInputSize checkLayer(层)
层
是层的实例,validInputSize
指定层的有效输入大小的向量或单元格数组。要检查多个观察结果,请使用ObservationDimension
选择。要检查代码生成兼容性,请设置CheckCodegenCompatibility
选项1
(真正的)。对于大的输入大小,梯度检查需要更长的时间运行。若要加快测试速度,请指定较小的有效输入大小。
检查示例自定义层的有效性preluLayer
.
自定义层preluLayer
,作为支持文件附在此示例后面,它对输入数据应用PReLU操作。金宝app要访问此层,请将此示例作为活动脚本打开。
创建该层的一个实例,并检查它是否有效checkLayer
.将有效的输入大小设置为该层的单个观测输入的典型大小。对于单个输入,该层期望观测值的大小h——- - - - - -w——- - - - - -c,在那里h,w,c分别为前一层输出的高度、宽度和通道数。
指定validInputSize
作为输入数组的典型大小。
图层= preluLayer(20);validInputSize = [5 5 20];validInputSize checkLayer(层)
跳过多观察测试。要启用带有多个观测值的测试,请指定“ObservationDimension”选项。对于二维图像数据,将‘ObservationDimension’设置为4。对于3d图像数据,将“ObservationDimension”设置为5。对于序列数据,将“ObservationDimension”设置为2。跳过GPU测试。没有找到兼容的GPU设备。跳过代码生成兼容性测试。要检查代码生成层的有效性,请指定'CheckCodegenCompatibility'和'ObservationDimension'选项。运行nnet.checklayer.TestLayerWithoutBackward .......... .. Done nnet.checklayer.TestLayerWithoutBackward __________ Test Summary: 12 Passed, 0 Failed, 0 Incomplete, 16 Skipped. Time elapsed: 0.18741 seconds.
结果显示通过、失败和跳过测试的数量。如果没有指定ObservationsDimension
选项,或没有GPU,则该功能将跳过相应的测试。
检查多个观察结果
对于多观测输入,该层期望一个大小的观测数组h——- - - - - -w——- - - - - -c——- - - - - -N,在那里h,w,c通道的高度、宽度和数量是否分别为和N是观测的数量。
若要检查多个观测值的层有效性,请指定一个观测值的典型大小并设置ObservationDimension
选项4。
图层= preluLayer(20);validInputSize = [5 5 20];checkLayer(层、validInputSize ObservationDimension = 4)
跳过GPU测试。没有找到兼容的GPU设备。跳过代码生成兼容性测试。要检查代码生成层的有效性,请指定'CheckCodegenCompatibility'和'ObservationDimension'选项。运行nnet.checklayer.TestLayerWithoutBackward .......... ........完成nnet.checklayer.TestLayerWithoutBackward __________测试总结:18通过,0失败,0不完整,10跳过。时间流逝:0.19972秒。
在这种情况下,函数不会检测到该层的任何问题。
的checkLayer
函数通过执行一系列测试来检查自定义层的有效性。
的checkLayer
函数使用这些测试检查自定义中间层(类型的层)的有效性nnet.layer.Layer
).
测试 | 描述 |
---|---|
functionSyntaxesAreCorrect |
正确定义了层函数的语法。 |
predictDoesNotError |
预测 函数不会出错。 |
forwardDoesNotError |
当指定时, |
forwardPredictAreConsistentInSize |
当 |
backwardDoesNotError |
当指定时,落后的 不会出错。 |
backwardIsConsistentInSize |
当
|
predictIsConsistentInType |
的输出 |
forwardIsConsistentInType |
当 |
backwardIsConsistentInType |
当 |
gradientsAreNumericallyCorrect |
当落后的 指定后,在落后的 与数值梯度一致。 |
backwardPropagationDoesNotError |
当落后的 未指定时,可使用自动微分计算导数。 |
predictReturnsValidStates |
对于具有状态属性的层,预测 函数返回有效状态。 |
forwardReturnsValidStates |
对于具有状态属性的层,向前 函数,如果指定,则返回有效状态。 |
resetStateDoesNotError |
对于具有状态属性的层,resetState 函数,如果指定,则不会出错并将状态重置为有效状态。 |
codegenPragmaDefinedInClassDef |
的编译指示“% # codegen” 用于在类文件中指定代码生成。 |
checkFor金宝appSupportedLayerPropertiesForCodegen |
层属性支持代码生成。金宝app |
predictIsValidForCodeGeneration |
预测 对代码生成有效。 |
doesNotHaveStateProperties |
对于代码生成,该层没有状态属性。 |
金宝appsupportedFunctionLayer |
对于代码生成,层不是FunctionLayer 对象。 |
有些测试会运行多次。这些测试还检查不同的数据类型和GPU兼容性:
predictIsConsistentInType
forwardIsConsistentInType
backwardIsConsistentInType
要在GPU上执行层函数,函数必须支持类型的输入和输出金宝appgpuArray
使用底层数据类型单
.
的checkLayer
函数使用这些测试检查自定义输出层(类型的层)的有效性nnet.layer.ClassificationLayer
或nnet.layer.RegressionLayer
).
测试 | 描述 |
---|---|
forwardLossDoesNotError |
forwardLoss 不会出错。 |
backwardLossDoesNotError |
backwardLoss 不会出错。 |
forwardLossIsScalar |
的输出forwardLoss 是标量。 |
backwardLossIsConsistentInSize |
当backwardLoss 的输出backwardLoss 大小一致:dLdY 和预测的大小一样吗Y . |
forwardLossIsConsistentInType |
的输出 |
backwardLossIsConsistentInType |
当 |
gradientsAreNumericallyCorrect |
当backwardLoss 指定后,在backwardLoss 都是正确的。 |
backwardPropagationDoesNotError |
当backwardLoss 未指定时,可使用自动微分计算导数。 |
的forwardLossIsConsistentInType
而且backwardLossIsConsistentInType
测试还检查GPU兼容性。要在GPU上执行层函数,函数必须支持类型的输入和输出金宝appgpuArray
使用底层数据类型单
.
要检查层的有效性,使用checkLayer
函数根据层的类型生成数据:
层类型 | 生成的数据说明 |
---|---|
中间 | 范围为[-1,1]的值 |
回归输出 | 范围为[-1,1]的预测和目标 |
分类输出 | 值在[0,1]范围内的预测。 如果您指定 如果没有指定 |
要检查多个观测值,请使用ObservationDimension
选择。如果指定了观测维度,则checkLayer
函数使用大小为1和2的迷你批生成的数据检查层函数是否有效。如果未指定此名称-值对,则该函数将跳过检查层函数是否对多个观察值有效的测试。
如果在使用时测试失败checkLayer
,然后函数提供了测试诊断和框架诊断。测试诊断突出显示在该层中发现的任何问题。框架诊断提供了更详细的信息。
测试functionSyntaxesAreCorrect
检查层函数是否正确定义了语法。
测试诊断 | 描述 | 可能的解决方案 |
---|---|---|
在图层中“预测”的输入参数数量不正确 . |
的语法。预测 函数与输入层数不一致。 |
中指定正确数量的输入和输出参数 的
您可以调整具有多个输入,多个输出或多个状态参数的层的语法:
提示 如果层的输入数量可以变化,那么使用 如果输出的数量可以变化,那么使用 提示 如果自定义层有 |
在图层中“预测”输出参数的数量不正确 |
的语法。预测 函数输出的层数不一致。 |
|
在图层中“转发”的输入参数数量不正确 |
可选选项的语法向前 函数与输入层数不一致。 |
中指定正确数量的输入和输出参数 的
您可以调整具有多个输入,多个输出或多个状态参数的层的语法:
提示 如果层的输入数量可以变化,那么使用 如果输出的数量可以变化,那么使用 提示 如果自定义层有 |
在图层中“forward”的输出参数数量不正确 |
可选选项的语法向前 函数输出的层数不一致。 |
|
在图层中“向后”的输入参数数量不正确 |
可选选项的语法落后的 函数与层数输入输出不一致。 |
中指定正确数量的输入和输出参数 的
您可以调整具有多个输入、多个输出、多个可学习参数或多个状态参数的层的语法:
要通过防止在向前和向后传递之间保存未使用的变量来减少内存使用,请将相应的输入参数替换为 提示 若输入数为 如果输出的数量可以变化,那么使用 提示 如果层转发函数支持金宝app |
在图层中“向后”的输出参数数量不正确 |
可选选项的语法落后的 函数输出的层数不一致。 |
对于具有多个输入或输出的层,必须设置层属性的值NumInputs
(或者,InputNames
),NumOutputs
(或者,OutputNames
)的层构造函数,分别。
的checkLayer
函数检查层函数对单个和多个观测值是否有效。要检查多个观测值,请使用ObservationDimension
选择。如果指定了观测维度,则checkLayer
函数使用大小为1和2的迷你批生成的数据检查层函数是否有效。如果未指定此名称-值对,则该函数将跳过检查层函数是否对多个观察值有效的测试。
测试诊断 | 描述 | 可能的解决方案 |
---|---|---|
跳过多观察测试。要启用多个观测值的检查,请在checkLayer中指定'ObservationDimension'参数 . |
如果没有指定“ObservationDimension” 参数checkLayer ,则该函数跳过使用多个观测值检查数据的测试。 |
使用命令 有关更多信息,请参见图层输入大小. |
这些测试检查层在传递有效大小的输入数据时不会出错。
中间层次。测试predictDoesNotError
,forwardDoesNotError
,backwardDoesNotError
检查层函数在传递有效大小的输入时不会出错。如果指定了观测维度,则该函数将检查该层的单个观测值和多个观测值。
测试诊断 | 描述 | 可能的解决方案 |
---|---|---|
函数'predict'抛出一个错误: |
的预测 传递大小的数据时,函数错误validInputSize . |
方法中描述的错误 提示 如果层转发函数支持金宝app |
函数'forward'抛出一个错误: |
可选向前 传递大小的数据时,函数错误validInputSize . |
|
函数'backward'抛出一个错误: |
可选落后的 的输出时,函数错误预测 . |
输出层。测试forwardLossDoesNotError
而且backwardLossDoesNotError
检查层函数在传递有效大小的输入时不会出错。如果指定了观测维度,则该函数将检查该层的单个观测值和多个观测值。
测试诊断 | 描述 | 可能的解决方案 |
---|---|---|
函数'forwardLoss'抛出一个错误: |
的forwardLoss 传递大小的数据时,函数错误validInputSize . |
方法中描述的错误 提示 如果 |
函数'backwardLoss'抛出一个错误: |
可选backwardLoss 传递大小的数据时,函数错误validInputSize . |
这些测试检查层函数输出的大小是否一致。
中间层次。测试backwardIsConsistentInSize
检查落后的
函数输出正确大小的导数。
的落后的
函数语法取决于层的类型。
dLdX =向后(层,X,Z,dLdZ,内存)
返回导数dLdX
相对于层输入的损失,其中层
只有一个输入和一个输出。Z
对应正向函数输出和dLdZ
对应于损失对的导数Z
.函数输入内存
对应于正向函数的内存输出。
[dLdX,dLdW] = backward(层,X,Z,dLdZ,内存)
也返回导数dLdW
关于可学习参数的损失,其中层
只有一个可学习参数。
[dLdX,dLdSin] = backward(layer,X,Z,dLdZ,dLdSout,memory)
也返回导数dLdSin
对于使用任何前面的语法的状态输入的损失,其中层
有一个状态参数和dLdSout
对应于损耗对层态输出的导数。
[dLdX,dLdW,dLdSin] = backward(layer,X,Z,dLdZ,dLdSout,memory)
也返回导数dLdW
关于可学习参数的损失,并返回导数dLdSin
对于使用任何前面语法的层状态输入的损失,其中层
具有单个状态参数和单个可学习参数。
您可以调整具有多个输入、多个输出、多个可学习参数或多个状态参数的层的语法:
对于有多个输入的层,替换X
而且dLdX
与X1,…,XN
而且dLdX1,…,dLdXN
,分别为N
是输入的数量。
对于有多个输出的层,替换Z
而且dLdZ
与Z1,…,ZM评选
而且dLdZ1,…,dLdZM
,分别为米
是输出的数量。
对于具有多个可学习参数的层,替换dLdW
与dLdW1,…,dLdWP
,在那里P
是可学习参数的个数。
对于具有多个状态参数的层,替换dLdSin
而且dLdSout
与dLdSin1,…,dLdSinK
而且dLdSout1,…,dLdSoutK
,分别为K
是状态参数的个数。
要通过防止在向前和向后传递之间保存未使用的变量来减少内存使用,请将相应的输入参数替换为~
.
提示
若输入数为落后的
可以变化,然后使用变长度输入宗量
而不是后面的输入参数层
.在这种情况下,变长度输入宗量
是单元格数组的输入,第一个在哪里N
元素对应于N
层输入,下一个米
元素对应于米
层输出,下一个米
元素对应于损失相对于米
层输出,下一个K
元素对应于K
对损失的导数K
状态输出,最后一个元素对应于内存
.
如果输出的数量可以变化,那么使用varargout
而不是输出参数。在这种情况下,varargout
是单元格数组的输出,第一个在哪里N
元素对应于N
损失的导数N
层输入,下一个P
元素对应于损失相对于P
可学习参数,以及下一个K
元素对应于损失相对于K
状态输入。
衍生品dLdX1
、……dLdXn
必须与相应层输入的大小相同,并且dLdW1,…,dLdWk
必须与相应的可学习参数大小相同。输入数据的大小必须与单个和多个观测值一致。
测试诊断 | 描述 | 可能的解决方案 |
---|---|---|
“向后”的“dLdX”大小不正确 . |
损耗相对于各层输入的导数必须与相应的层输入相同。 | 返回导数 |
对于“向后”的输入“in1”,损失的导数大小不正确 |
||
“forward”返回的“Z”的大小必须与“predict”相同 . |
的输出预测 必须与对应的输出的大小相同向前 . |
返回输出 |
对于“向后”,损失对“W”的导数大小不正确 . |
损失对可学习参数的导数必须与相应的可学习参数相同。 | 返回导数 |
提示
如果层转发函数支持金宝appdlarray
对象,然后软件自动确定反向函数,而不需要指定落后的
函数。获取支持的函数列表金宝appdlarray
对象,看到支持dlarray的函数列表金宝app.
输出层。测试forwardLossIsScalar
类的输出forwardLoss
函数是标量。当backwardLoss
函数指定后,进行测试backwardLossIsConsistentInSize
的输出forwardLoss
而且backwardLoss
尺寸是正确的。
的语法forwardLoss
是损失(层,Y,T)
.输入Y
与网络的预测相对应。这些预测是前一层的输出。输入T
与培训目标相对应。输出损失
是之间的损失Y
而且T
根据指定的损失函数。输出损失
必须为标量。
如果forwardLoss
功能支持金宝appdlarray
对象,然后软件自动确定反向损失函数,而不需要指定backwardLoss
函数。获取支持的函数列表金宝appdlarray
对象,看到支持dlarray的函数列表金宝app.
的语法backwardLoss
是dLdY = backwardLoss(layer,Y,T)
.输入Y
包含由网络和做出的预测T
包含培训目标。输出dLdY
是损失对预测的导数吗Y
.输出dLdY
必须与层输入相同的大小Y
.
测试诊断 | 描述 | 可能的解决方案 |
---|---|---|
“forwardLoss”的“loss”大小不正确 . |
输出损失 的forwardLoss 必须是标量。 |
返回输出 |
'backwardLoss'损失'dLdY'的导数大小不正确 . |
当backwardLoss 时,损失相对于层输入的导数必须与层输入的大小相同。 |
返回导数 如果 |
这些测试检查层函数输出的类型是否一致,以及层函数是否与GPU兼容。
如果层转发功能完全支持金宝appdlarray
对象,那么该层是GPU兼容的。否则,为了与GPU兼容,层函数必须支持类型的输入和返回输出金宝appgpuArray
(并行计算工具箱).
许多MATLAB®内置功能支持金宝appgpuArray
(并行计算工具箱)而且dlarray
输入参数。获取支持的函数列表金宝appdlarray
对象,看到支持dlarray的函数列表金宝app.有关在GPU上执行的函数的列表,请参见在图形处理器上运行MATLAB函数(并行计算工具箱).要使用GPU进行深度学习,还必须有支持GPU的设备。金宝app有关受支持设备的信息,请参见金宝appGPU支金宝app持版本(并行计算工具箱).有关在MATLAB中使用gpu的更多信息,请参见MATLAB中的GPU计算(并行计算工具箱).
中间层次。测试predictIsConsistentInType
,forwardIsConsistentInType
,backwardIsConsistentInType
检查该层函数的输出变量的数据类型是否正确。测试检查在给定数据类型输入时,层函数是否返回一致的数据类型单
,双
,gpuArray
使用底层类型单
或双
.
提示
如果使用函数来预分配数组0
,则必须保证这些数组的数据类型与层函数输入一致。若要创建与另一个数组具有相同数据类型的零数组,请使用“喜欢”
选择0
.例如,初始化一个大小为0的数组深圳
使用与数组相同的数据类型X
,使用Z = 0 (sz,"like",X)
.
测试诊断 | 描述 | 可能的解决方案 |
---|---|---|
predict的Z类型不正确 . |
输出的类型Z1,…,Zm评选 的预测 函数必须与输入一致X1,…,Xn . |
返回输出 |
“predict”的输出类型“out1”不正确 . |
||
forward的Z类型不正确 . |
输出的类型Z1,…,Zm评选 可选的向前 函数必须与输入一致X1,…,Xn . |
|
“forward”的输出类型“out1”不正确 . |
||
“向后”的“dLdX”类型不正确 . |
导数的类型dLdX1,…,dLdXn 可选的落后的 函数必须与输入一致X1,…,Xn . |
返回导数 |
对于'backward',损失对输入'in1'的导数类型不正确 . |
||
对“向后”的“W”损失的导数类型不正确 . |
可学习参数损失的导数类型必须与相应的可学习参数一致。 | 对于每个可学习参数,返回与相应的可学习参数具有相同类型的导数。 |
提示
如果层转发函数支持金宝appdlarray
对象,然后软件自动确定反向函数,而不需要指定落后的
函数。获取支持的函数列表金宝appdlarray
对象,看到支持dlarray的函数列表金宝app.
输出层。测试forwardLossIsConsistentInType
而且backwardLossIsConsistentInType
检查该层函数的输出变量的数据类型是否正确。测试检查在给定数据类型输入时,各层是否返回一致的数据类型单
,双
,gpuArray
使用底层类型单
或双
.
测试诊断 | 描述 | 可能的解决方案 |
---|---|---|
'forwardLoss'的'loss'类型不正确 . |
输出的类型损失 的forwardLoss 函数必须与输入一致Y . |
返回 |
'backwardLoss'的'dLdY'的导数类型不正确 . |
输出的类型dLdY 可选的backwardLoss 函数必须与输入一致Y . |
返回 |
提示
如果forwardLoss
功能支持金宝appdlarray
对象,然后软件自动确定反向损失函数,而不需要指定backwardLoss
函数。获取支持的函数列表金宝appdlarray
对象,看到支持dlarray的函数列表金宝app.
测试gradientsAreNumericallyCorrect
检查由层函数计算的梯度数值是否正确。测试backwardPropagationDoesNotError
检查导数是否可以使用自动微分计算。
中间层次。当可选的落后的
函数未指定,该测试backwardPropagationDoesNotError
检查导数是否可以使用自动微分计算。当可选的落后的
函数指定后,进行测试gradientsAreNumericallyCorrect
在其中计算梯度的测试落后的
都是正确的。
测试诊断 | 描述 | 可能的解决方案 |
---|---|---|
期望一个没有尺寸标签的dlarray,但却找到了标签 . |
当可选的落后的 函数未指定,层转发函数必须输出dlarray 没有维度标签的对象。 |
确保任何dlarray 在层转发函数中创建的对象不包含维度标签。 |
无法在层中反向传播。检查“forward”函数是否完全支持自动区分。金宝app或者,手动实现'backward'函数 . |
下列一项或多项:
|
检查forward函数是否支持金宝app 检查输入的导数 或者,通过创建命名为 |
无法在层中反向传播。检查'predict'函数是否完全支持自动区分。金宝app或者,手动实现'backward'函数 . |
||
“向后”的导数“dLdX”与数值梯度不一致 . |
下列一项或多项:
|
如果层转发函数支持金宝app 代入导数 如果导数计算正确,则在 如果绝对误差和相对误差在可接受的公差范围内,则可以忽略此测试诊断。 |
对于“向后”,损失对输入“in1”的导数与数值梯度不一致 . |
||
“向后”的损失对“W”的导数与数值梯度不一致 . |
提示
如果层转发函数支持金宝appdlarray
对象,然后软件自动确定反向函数,而不需要指定落后的
函数。获取支持的函数列表金宝appdlarray
对象,看到支持dlarray的函数列表金宝app.
输出层。当可选的backwardLoss
函数未指定,该测试backwardPropagationDoesNotError
检查导数是否可以使用自动微分计算。当可选的backwardLoss
函数指定后,进行测试gradientsAreNumericallyCorrect
在其中计算梯度的测试backwardLoss
都是正确的。
测试诊断 | 描述 | 可能的解决方案 |
---|---|---|
期望一个没有尺寸标签的dlarray,但却找到了标签 |
当可选的backwardLoss 函数未指定,则forwardLoss 函数必须输出dlarray 没有维度标签的对象。 |
确保任何dlarray 中创建的对象forwardLoss 函数不包含尺寸标签。 |
无法在层中反向传播。检查'forwardLoss'函数是否完全支持自动区分。金宝app或者,手动实现'backwardLoss'函数 |
下列一项或多项:
|
检查 检查输入的导数 或者,通过创建一个名为 |
'backwardLoss'的导数'dLdY'与数值梯度不一致 . |
下列一项或多项:
|
代入导数 如果导数计算正确,则在 如果绝对误差和相对误差在可接受的公差范围内,则可以忽略此测试诊断。 |
提示
如果forwardLoss
功能支持金宝appdlarray
对象,然后软件自动确定反向损失函数,而不需要指定backwardLoss
函数。获取支持的函数列表金宝appdlarray
对象,看到支持dlarray的函数列表金宝app.
对于具有状态属性的层,测试predictReturnsValidStates
检查predict函数是否返回有效状态。当向前
指定时,测试forwardReturnsValidStates
检查forward函数是否返回有效状态。测试resetStateDoesNotError
检查resetState
函数返回具有有效状态属性的层。
测试诊断 | 描述 | 可能的解决方案 |
---|---|---|
在图层中使用“预测”错误。'State'必须为实数数值数组或未格式化的数组对象 . |
状态输出必须是实值数字数组或未格式化的dlarray 对象。 |
中确定的状态框架的诊断 是实值数字数组还是未格式化的dlarray 对象。 |
在图层中使用“resetState”错误。'State'必须为实数数值数组或未格式化的数组对象 |
返回层的状态属性必须是实值数值数组或未格式化dlarray 对象。 |
如果你设置CheckCodegenCompatibility
选项1
(正确),然后checkLayer
函数检查该层的代码生成兼容性。
测试codegenPragmaDefinedInClassDef
检查层定义是否包含代码生成pragma% # codegen
.测试checkFor金宝appSupportedLayerPropertiesForCodegen
检查图层属性是否支持代码生成。金宝app测试predictIsValidForCodegeneration
的输出预测
尺寸和批次大小一致。
代码生成只支持带有二维图像或特征金宝app输入的中间层。代码生成不支持带有状态属性的层(带有attribu金宝appte的属性)状态
).
的checkLayer
函数不检查层使用的函数是否与代码生成兼容。要检查自定义层使用的函数是否也支持代码生成,请首先使用金宝app代码生成准备有关更多信息,请参见使用代码生成准备工具检查代码(MATLAB编码器).
测试诊断 | 描述 | 可能的解决方案 |
---|---|---|
在自定义层的类定义中指定'%#codegen' |
层定义不包括pragma“% # codegen” 用于代码生成。 |
添加 |
对于自定义层,非标量层属性必须为单类型或双类型或字符数组 |
该层包含除单个、双精度或字符数组以外的类型的非标量属性。 | 将非标量属性转换为使用类型为单、双或字符数组的表示形式。 例如,将分类数组转换为类型为整数的数组 |
对于自定义层,标量层属性必须是数值、逻辑或字符串 |
该层包含除数字、逻辑或字符串以外类型的标量属性。 | 将标量属性转换为使用数字表示或逻辑类型或字符串类型的表示。 例如,将类别标量转换为类型的整数 |
对于代码生成,“Z”必须具有与层输入相同的维数 . |
输出的维数 |
在 |
对于代码生成,“Z”必须与层输入具有相同的批处理大小 . |
输出的批量大小 |
在 |