定义定制的深度学习层与可学的参数
如果深度学习工具箱™不提供层你需要为你的任务,你可以定义自己的自定义层使用这个例子作为参考。一个内置的图层列表,看到深度学习层的列表。
定义一个自定义的深度学习层,您可以使用提供的模板在这个例子中,需要通过以下步骤:
名字一层一层——给一个名称,这样您就可以在MATLAB中使用它®。
声明层属性指定图层的属性,包括可学的参数和状态参数。
创建一个构造函数(可选)——指定层如何构造和初始化它的属性。如果你不指定一个构造函数,那么在创建、软件初始化
的名字
,描述
,类型
属性与[]
并设置输入和输出层的数量为1。创建向前函数——指定数据传递通过层(向前传播)在预测时间和培训时间。
创建重置状态函数(可选)——指定如何重置状态参数。
创建一个反向功能(可选)——指定的衍生品损失对输入数据和可学的参数(向后传播)。如果你不指定一个落后的函数,那么远期功能必须支持金宝app
dlarray
对象。
当定义层功能,您可以使用dlarray
对象。使用dlarray
更易于处理高维数据的对象允许您标签的尺寸。例如,您可以标签尺寸对应于空间,时间,频道,使用批处理维度“S”
,“T”
,“C”
,“B”
标签,分别。未指明的和其他维度,使用“U”
标签。为dlarray
对象的函数操作特定的尺寸,你可以指定尺寸标签的格式dlarray
直接对象,或通过使用DataFormat
选择。
使用格式化的dlarray
对象自定义层也允许您定义的输入和输出层有不同的格式,如交换层,添加或删除维度。例如,您可以定义一个层,将mini-batch作为输入的图像格式“SSCB”
(空间、空间、通道、批处理)和输出序列的mini-batch格式“认知行为治疗”
(通道、批量、时间)。使用格式化的dlarray
对象还允许您定义层,可以操作数据与不同的输入格式,例如,层支持输入格式金宝app“SSCB”
(空间、空间、通道、批处理)“认知行为治疗”
(通道、批量、时间)。
dlarray
对象还可以支持自动分化。金宝app因此,如果你的转发功能完全支持金宝appdlarray
对象,然后向后定义函数是可选的。
能够支持使用格式化金宝appdlarray
对象的自定义层转发功能,也继承了nnet.layer.Formattable
类在定义自定义层。例如,看到的定义定制的深度学习与格式化输入层。
这个例子展示了如何创建一个PReLU层,这一层有可学的卷积神经网络参数,并使用它。PReLU层执行一个阈值操作,为每个通道,任何输入值小于零乘以一个标量学习训练时间。[1]值小于零,PReLU层应用缩放系数 每个通道的输入。这些系数形式可学的参数,这层在训练学习。
这图[1]比较了ReLU和PReLU层功能。
过渡层模板
中间一层模板复制到一个新文件在MATLAB。这个模板提供了一个中间的结构层类定义。概述:
可选
属性
块层属性,可学的参数和状态参数。层构造函数。
的
预测
功能和可选的向前
函数。可选
resetState
功能层与国家性质。可选
落后的
函数。
classdefmyLayer < nnet.layer.Layer%……% & nnet.layer。为mattable ... % (Optional)% & nnet.layer。Acceleratable %(可选)属性%(可选)层属性。%声明层属性。结束属性(可学的)%(可选)层可学的参数。%这里声明可学的参数。结束属性(状态)%(可选)层状态参数。%申报状态参数。结束属性(可学的,状态)%(可选)嵌套dlnetwork对象都可学的%参数和状态参数。%声明嵌套网络可学的和状态参数。结束方法函数层= myLayer ()%(可选)创建一个myLayer。%这个函数必须具有相同的名称作为类。%定义层构造器函数。结束函数[Z,状态]=预测(层,X)%前进通过层预测时间和输入数据%输出结果和状态更新。%%的输入:%层-层向前传播% X -输入数据%输出:% Z -输出层的功能%——(可选)更新层状态%%,与多个输入层,取代X X1,…, XN,% N是输入的数量。%,与多个输出层,取代Z% Z1,…,Z米,在那里米我s the number of outputs.%——层具有多个状态参数,更换状态% state1,…,状态K,在那里K我s the number of state%的参数。%定义层预测函数。结束函数向前(Z、状态、内存)=(层,X)%(可选)正向输入数据通过层培训%的时间和输出结果,更新后的状态,和记忆%值。%%的输入:%层-层向前传播% X -层输入数据%输出:% Z -输出层的功能%——(可选)更新层状态%的记忆——自定义(可选的)内存值落后%的功能%%,与多个输入层,取代X X1,…, XN,% N是输入的数量。%,与多个输出层,取代Z% Z1,…,Z米,在那里米我s the number of outputs.%——层具有多个状态参数,更换状态% state1,…,状态K,在那里K我s the number of state%的参数。%定义层函数。结束函数层= resetState(层)%(可选)设置层的状态。%定义重置状态函数。结束函数[dLdX, dLdW dLdSin] =向后(层,X, Z, dLdZ dLdSout,内存)%(可选)向后传播损失的导数%通过层功能。%%的输入:%层-层反向传播% X -层输入数据% Z -层输出数据% dLdZ -导数的损失对层%输出% dLdSout——(可选)损失的导数%状态输出%的记忆——记忆值函数%输出:% dLdX -导数的损失对输入层% dLdW——(可选)的导数对损失%可学的参数% dLdSin——(可选)的导数对损失%状态输入%%——层与状态参数,必须向后语法%包括dLdSout和dLdSin,或没有。%,与多个输入层,X和dLdX替换% X1,…,XN和dLdX1,...,dLdXN, respectively, where N is%的数量输入。%,与多个输出层,Z和dlZ替换% Z1,…,Z米和dLdZ,...,dLdZM, respectively, where M is the%的输出。%——层具有多个可学的参数,替换%与dLdW1 dLdW,…,dLdWP, where P is the number of%可学的参数。%——层具有多个状态参数,取代dLdSin%和dLdSout dLdSin1,……、dLdSinK和% dLdSout1,…,dldSoutK, respectively, where K is the number%的状态参数。%定义层向后函数。结束结束结束
名字层和指定父类
首先,为层指定一个名称。在第一行的类文件,替换现有的名字myLayer
与preluLayer
。
classdefpreluLayer < nnet.layer.Layer%……% & nnet.layer。为mattable ... % (Optional)% & nnet.layer。Acceleratable %(可选)…结束
如果你不指定一个落后的函数,那么层函数,默认情况下,接收无格式dlarray
对象作为输入。指定层接收到格式化dlarray
对象作为输入和输出格式dlarray
对象,也继承了nnet.layer.Formattable
类在定义自定义层。
层的功能支持加速度,因此也继承金宝appnnet.layer.Acceleratable
。加快定制层函数的更多信息,请参阅自定义层加速度函数。层不需要formattable输入,所以删除可选nnet.layer.Formattable
超类。
classdefpreluLayer < nnet.layer.Layer…& nnet.layer.Acceleratable…结束
接下来,重命名myLayer
构造函数(第一个函数方法
部分),具有相同的名称作为层。
方法函数层= preluLayer ()……结束…结束
保存层
层类文件保存在一个新文件命名preluLayer.m
。文件名称必须匹配层名称。使用层,必须保存文件在当前文件夹或文件夹在MATLAB的道路。
声明属性和可学的参数
声明的层属性属性
部分,清单中声明可学的参数属性(可学的)
部分。
默认情况下,自定义中间层具有这些属性。不声明这些属性属性
部分。
财产 | 描述 |
---|---|
的名字 |
图层名称,指定为一个特征向量或字符串标量。为层 数组输入,trainNetwork ,assembleNetwork ,layerGraph ,dlnetwork 函数自动分配名字与名字层” 。 |
描述 |
一行的描述层,指定为字符串标量或特征向量。这个描述层显示在一个时出现 如果你不指定层的描述,然后软件显示层的类名。 |
类型 |
层的类型,指定为一个特征向量或字符串标量。的价值 如果你不指定层类型,那么软件显示层的类名。 |
NumInputs |
输入层的数量,指定为一个正整数。如果不指定这个值,则软件自动设置NumInputs 人名的数目InputNames 。默认值是1。 |
InputNames |
输入层的名称,指定为一个单元阵列的特征向量。如果不指定这个值NumInputs 大于1,那么软件自动设置InputNames 来{“三机”,…,“客栈”} ,在那里N 等于NumInputs 。默认值是{'在'} 。 |
NumOutputs |
输出层的数量,指定为一个正整数。如果不指定这个值,则软件自动设置NumOutputs 人名的数目OutputNames 。默认值是1。 |
OutputNames |
输出层的名称,指定为一个单元阵列的特征向量。如果不指定这个值NumOutputs 大于1,那么软件自动设置OutputNames 来{着干活,…,“outM”} ,在那里米 等于NumOutputs 。默认值是{“出”} 。 |
如果层没有其他属性,那么您可以省略的属性
部分。
提示
如果你创建一个与多个输入层,然后你必须设置NumInputs
或InputNames
属性层构造函数。如果你创建一个和多个输出层,然后你必须设置NumOutputs
或OutputNames
属性层构造函数。例如,看到的定义定制的深度学习与多个输入层。
PReLU层不需要任何额外的属性,所以你可以删除属性
部分。
PReLU层只有一个可学的参数,比例系数一个。宣布这可学的参数属性(可学的)
节和调用参数α
。
属性(可学的)%层可学的参数%比例系数α结束
创建构造函数
创建的函数结构层和初始化层属性。指定任何变量需要创建构造函数作为输入层。
PReLU层构造函数需要一个输入参数的数量(渠道)和一个可选参数(图层名称)。渠道指定的数量的大小可学的参数α
。指定两个输入参数命名numChannels
和arg游戏
在preluLayer
函数,对应通道的数量和可选的输入参数,分别。添加一个评论的函数,函数的语法解释道。
函数层= preluLayer (numChannels, args)% = preluLayer层(numChannels)创建一个PReLU层%与numChannels频道。%% = preluLayer层(numChannels Name =名字)也指定了%层名称…结束
初始化层属性
初始化图层属性,包括可学的构造函数参数。取代的评论%层构造函数
初始化的代码层属性。
解析输入参数使用参数
块并设置的名字
财产。
参数numChannels参数。Name =”“;结束%设置图层名称。层。Name =arg游戏。N一个me;
通过设置给图层一行描述描述
层的属性。设置描述描述层的类型和它的大小。
%设置层描述。层。描述=“PReLU与“+ numChannels +“通道”;
PReLU层,输入值为负时,层乘以每个通道的输入相应的渠道α
。初始化可学的参数α
是一个随机向量的大小1-by-1-by -numChannels
。与指定的三维尺寸numChannels
,层可以使用element-wise乘法输入的函数。α
层对象的一个属性,所以你必须分配向量layer.Alpha
。
%初始化比例系数。layer.Alpha=rand([1 1 numChannels]);
把构造函数完成。
函数层= preluLayer (numChannels, args)% = preluLayer层(numChannels)创建一个PReLU层%与numChannels频道。%% = preluLayer层(numChannels Name =名字)也指定了%层的名字。参数numChannels参数。Name =”“;结束%设置图层名称。层。Name =arg游戏。N一个me;%设置层描述。层。描述=“PReLU与“+ numChannels +“通道”;%初始化比例系数。layer.Alpha=rand([1 1 numChannels]);结束
使用此构造函数,该命令preluLayer (Name = " prelu ")
创建一个PReLU层有三个渠道和名称“prelu”
。
创建向前函数
在预测创建层转发功能使用时间和培训时间。
创建一个函数命名预测
通过层传播数据的转发预测的时间并输出结果。
的预测
函数的语法取决于类型的层。
Z =预测(层,X)
将输入数据转发X
通过层和输出结果Z
,在那里层
只有一个输入和一个输出。[Z,状态]=预测(层,X)
也输出更新的状态参数状态
,在那里层
只有一个状态参数。
你可以调整层的语法与多个输入,多个输出,或多个状态参数:
与多个输入层,取代
X
与X1,…, XN
,在那里N
输入的数量。的NumInputs
属性必须匹配N
。与多个输出层,取代
Z
与Z1,…, ZM评选
,在那里米
是输出的数量。的NumOutputs
属性必须匹配米
。层具有多个状态参数,替换
状态
与state1,…, stateK
,在那里K
是状态参数的数量。
提示
如果输入层可以不同的数量,然后使用变长度输入宗量
而不是X1,…, XN
。在这种情况下,变长度输入宗量
是一个单元阵列的输入,在哪里变长度输入宗量{我}
对应于习
。
如果输出的数量可以改变,那么使用varargout
而不是Z1、…、锌
。在这种情况下,varargout
是一个单元阵列的输出,在哪里varargout {j}
对应于Zj
。
提示
如果有一个自定义层dlnetwork
为一种可习得的参数对象,然后在预测
自定义功能层,使用预测
函数dlnetwork
。当你这样做,dlnetwork
对象预测
函数使用适当的预测层操作。
因为PReLU层只有一个输入和一个输出的语法预测
PReLU层Z =预测(层,X)
。
默认情况下,该层使用预测
函数在训练时间。使用不同的函数在训练时间,或保留值所需的向后一个自定义函数,您还必须创建一个函数命名向前
。
的尺寸取决于类型的数据输入和输出的连接层:
层的输入 | 输入的大小 | 观察维度 |
---|---|---|
特征向量 | 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 |
向量序列 | 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
函数,输入和输出序列的长度必须匹配。
的向前
通过层功能传播数据转发培训时间同时输出一个内存值。
的向前
函数的语法取决于类型的层:
Z =前进(层,X)
将输入数据转发X
通过层和输出结果Z
,在那里层
只有一个输入和一个输出。[Z,状态]=前进(层,X)
也输出更新的状态参数状态
,在那里层
只有一个状态参数。(__、内存)=(层,X)转发
也为一个自定义的内存返回一个值落后的
函数使用任何以前的语法。如果层有一个定制的向前
功能和自定义落后的
函数,那么这个函数必须返回一个内存值。
你可以调整层的语法与多个输入,多个输出,或多个状态参数:
与多个输入层,取代
X
与X1,…, XN
,在那里N
输入的数量。的NumInputs
属性必须匹配N
。与多个输出层,取代
Z
与Z1,…, ZM评选
,在那里米
是输出的数量。的NumOutputs
属性必须匹配米
。层具有多个状态参数,替换
状态
与state1,…, stateK
,在那里K
是状态参数的数量。
提示
如果输入层可以不同的数量,然后使用变长度输入宗量
而不是X1,…, XN
。在这种情况下,变长度输入宗量
是一个单元阵列的输入,在哪里变长度输入宗量{我}
对应于习
。
如果输出的数量可以改变,那么使用varargout
而不是Z1、…、锌
。在这种情况下,varargout
是一个单元阵列的输出,在哪里varargout {j}
对应于Zj
。
提示
如果有一个自定义层dlnetwork
为一种可习得的参数对象,然后在向前
自定义功能层,使用向前
的函数dlnetwork
对象。当你这样做,dlnetwork
对象向前
函数使用适当的层操作培训。
PReLU操作是由
在哪里 是输入的非线性激活吗f频道我, 是负的斜率系数控制的部分。下标我在 表明,非线性激活不同在不同的频道。
实现这个操作预测
。在预测
,输入X
对应于x在方程。输出Z
对应于
。PReLU层不需要内存或一个不同的函数进行训练,所以你可以删除向前
函数的类文件。添加一个评论的函数,函数的语法解释道。
提示
如果你preallocate数组使用等功能0
,那么你必须确保这些数组的数据类型是一致的输入层功能。创建一个数组相同数据类型的零作为另一个数组,使用“喜欢”
选择0
。例如,初始化一个数组大小的0深圳
具有相同数据类型的数组X
,使用Z = 0(深圳,“喜欢”,X)
。
函数Z =预测(层,X)% Z =预测(层,X)将输入数据转发X通过% Z层和输出结果。Z = max (X, 0) +层。α。*分钟(0,X);结束
因为预测
函数只使用功能的支持金宝appdlarray
对象,定义落后的
函数是可选的。支持的功能列表金宝appdlarray
对象,看到与dlarray支持函数的列表金宝app。
完成一层
视图层完成类文件。
classdefpreluLayer < nnet.layer.Layer…& nnet.layer.Acceleratable%示例自定义PReLU层。属性(可学的)%层可学的参数%比例系数α结束方法函数层= preluLayer (numChannels, args)% = preluLayer层(numChannels)创建一个PReLU层%与numChannels频道。%% = preluLayer层(numChannels Name =名字)也指定了%层的名字。参数numChannels参数。Name =”“;结束%设置图层名称。层。Name =arg游戏。N一个me;%设置层描述。层。描述=“PReLU与“+ numChannels +“通道”;%初始化比例系数。layer.Alpha=rand([1 1 numChannels]);结束函数Z =预测(层,X)% Z =预测(层,X)将输入数据转发X通过% Z层和输出结果。Z = max (X, 0) +层。α。*分钟(0,X);结束结束结束
GPU的兼容性
如果层转发功能完全支持金宝appdlarray
对象,则GPU兼容层。否则,必须支持GPU兼容,层功能的输入并返回输出类型金宝appgpuArray
(并行计算工具箱)。
许多MATLAB内置函数的支持金宝appgpuArray
(并行计算工具箱)和dlarray
输入参数。支持的功能列表金宝appdlarray
对象,看到与dlarray支持函数的列表金宝app。对GPU执行的函数的列表,看看运行在GPU MATLAB函数(并行计算工具箱)。使用GPU深度学习,你也必须有一个支持GPU设备。金宝app支持设备的信息,请参阅金宝appGPU的金宝app支持版本(并行计算工具箱)。在MATLAB与gpu的更多信息,见在MATLAB GPU计算(并行计算工具箱)。
在这个例子中,使用MATLAB函数预测
所有的支金宝app持dlarray
对象,所以GPU兼容层。
检查的有效性定义层使用checkLayer
检查自定义层的层有效性preluLayer
。
自定义图层preluLayer
,附加到这个例子作为支持文件,PReLU操作适用于输入数据。金宝app进入这一层,打开这个例子作为一个活的脚本。
创建一个实例层的使用和检查它的有效性checkLayer
。指定大小的有效输入大小一个观察典型的输入层。预计4 - d数组输入层,前三个维度对应高度,宽度,和前面的通道数层输出,和第四维对应于观测。
指定一个观察的典型输入的大小和设置ObservationDimension
选项4。
层= preluLayer (20);validInputSize =(24日24日20);checkLayer(层、validInputSize ObservationDimension = 4)
跳过GPU测试。不兼容的GPU设备发现。跳过代码生成的兼容性测试。检查代码生成层的有效性,指定“CheckCodegenCompatibility”和“ObservationDimension”选项。nnet.checklayer运行。TestLayerWithoutBackward .......... ........nnet.checklayer完成。TestLayerWithoutBackward __________测试总结:18了,10 0失败,0不完整,跳过。时间:1.295秒。
层的功能没有发现任何问题。
包括自定义层网络
您可以使用一个自定义层以同样的方式与其他层深度学习工具。本节将展示如何创建和训练一个网络数字使用前面创建的PReLU层分类。
负荷训练数据的例子。
[XTrain, YTrain] = digitTrain4DArrayData;
创建一个包含自定义层的层数组preluLayer
,在这个例子作为支持文件。金宝app进入这一层,打开这个例子作为一个活的脚本。
层= [imageInputLayer ([28 28 1]) convolution2dLayer (5、20) batchNormalizationLayer preluLayer (20) fullyConnectedLayer (10) softmaxLayer classificationLayer);
设置培训方案和培训网络。
选择= trainingOptions (“亚当”,MaxEpochs = 10);网= trainNetwork (XTrain、YTrain层,选择);
培训在单CPU。初始化输入数据规范化。| = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | | | |时代迭代时间| Mini-batch | Mini-batch |基地学习| | | | (hh: mm: ss) | | |损失精度率| | = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | | 1 | 1 |就是10.94% | | 3.0526 | 0.0010 | | 2 | 50 | 00:00:05 | 71.88% | 0.8378 | 0.0010 | | 3 | 100 | 00:00:11 | 85.94% | 0.4878 | 0.0010 | | 150 | | 00:00:17 | 88.28% | 0.4068 | 0.0010 | | 6 | 200 | 00:00:22 | 96.09% | 0.1692 | 0.0010 | | 250 | | 00:00:28 | 97.66% | 0.1370 | 0.0010 | | 300 | | 00:00:33 | 99.22% | 0.0744 | 0.0010 | | 350 | | 00:00:39 | 99.22% | 0.0592 | 0.0010 | | 390 | | 00:00:43 | 100.00% | 0.0466 | 0.0010 | | = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = |培训完成:马克思时代完成。
评估网络性能预测新数据和计算的准确性。
[XTest,欧美]= digitTest4DArrayData;YPred =分类(净,XTest);精度=意味着(欧美= = YPred)
精度= 0.9190
引用
[1]“深深入整流器:超越人类表现ImageNet分类。”2015年IEEE计算机视觉国际会议(ICCV)1026 - 34。圣地亚哥,智利:IEEE 2015。https://doi.org/10.1109/ICCV.2015.123。
另请参阅
functionLayer
|checkLayer
|setLearnRateFactor
|setL2Factor
|getLearnRateFactor
|getL2Factor
|findPlaceholderLayers
|replaceLayer
|assembleNetwork
|PlaceholderLayer