定义嵌套深度学习层
如果深入学习工具箱™不提供层你需要为你的分类或回归问题,那么您可以定义自己的自定义层使用这个例子作为参考。一个内置的图层列表,看到深度学习层的列表。
要创建一个自定义层本身定义了一层图,你可以声明一个dlnetwork
作为一个可学的参数对象属性(可学的)
部分层定义。这种方法被称为网络的作文。您可以使用网络作文:
创建一个自定义层代表一块可学的层,例如,一个残块。
创建一个网络与控制流,例如,一个网络的部分可以动态地改变取决于输入数据。
创建一个网络与循环,例如,一个网络部分饲料输出回本身。
嵌套网络都可学的和状态参数,例如,网络与批量标准化或LSTM层,宣布的网络属性(可学的,国家)
部分层定义。
有关更多信息,请参见深入学习网络组成。
这个例子展示了如何创建一个自定义层代表一个残块。自定义图层residualBlockLayer
包含一个可学的块层组成的卷积,批处理规范化,ReLU,附加层,还包括一个跳过连接和一个可选的卷积层和批量标准化层跳过的连接。所使用的层只有一个输入两次,每个分支的输入。这个图突显出剩余块结构。
提示
这个用例,它通常是更容易使用一层图没有嵌套。对于一个例子,演示如何创建一个残余网络不使用自定义层,明白了火车残余网络图像分类。
定义一个自定义的深度学习层,您可以使用提供的模板在这个例子中,需要通过以下步骤:
名字一层一层——给一个名称,这样您就可以在MATLAB中使用它®。
声明层属性指定图层的属性,包括可学的参数和状态参数。
创建一个构造函数(可选)——指定层如何构造和初始化它的属性。如果你不指定一个构造函数,那么在创建、软件初始化
的名字
,描述
,类型
属性与[]
并设置输入和输出层的数量为1。创建初始化函数(可选)——指定如何初始化可学的,当软件初始化网络状态参数。如果你不指定一个初始化函数,那么这个软件不初始化参数初始化网络。
创建向前函数——指定数据传递通过层(向前传播)在预测时间和培训时间。
创建重置状态函数(可选)——指定如何重置状态参数。
创建一个反向功能(可选)——指定的衍生品损失对输入数据和可学的参数(向后传播)。如果你不指定一个落后的函数,那么远期功能必须支持金宝app
dlarray
对象。
过渡层模板
中间一层模板复制到一个新文件在MATLAB。这个模板提供了一个中间的结构层类定义。概述:
可选
属性
块层属性,可学的参数和状态参数。层构造函数。
可选
初始化
函数。的
预测
功能和可选的向前
函数。可选
resetState
功能层与国家性质。可选
落后的
函数。
classdefmyLayer < nnet.layer.Layer%……% & nnet.layer。为mattable ... % (Optional)% & nnet.layer。Acceleratable %(可选)属性%(可选)层属性。%声明层属性。结束属性(可学的)%(可选)层可学的参数。%这里声明可学的参数。结束属性(状态)%(可选)层状态参数。%申报状态参数。结束属性(可学的,状态)%(可选)嵌套dlnetwork对象都可学的%参数和状态参数。%声明嵌套网络可学的和状态参数。结束方法函数层= myLayer ()%(可选)创建一个myLayer。%这个函数必须具有相同的名称作为类。%定义层构造器函数。结束函数层=初始化(层、布局)%(可选)初始化层可学的和状态参数。%%的输入:%初始化层-层%布局-数据布局,指定为一个networkDataLayout%的对象%%输出:%层-层初始化%%,与多个输入层,取代布局% layout1,…,layoutN, where N is the number of inputs.%定义层的初始化函数。结束函数[Z,状态]=预测(层,X)%前进通过层预测时间和输入数据%输出结果和状态更新。%%的输入:%层-层向前传播% X -输入数据%输出:% Z -输出层的功能%——(可选)更新层状态%%,与多个输入层,取代X X1,…, XN,% N是输入的数量。%,与多个输出层,取代Z% Z1,…,Z米,在那里米is the number of outputs.%——层具有多个状态参数,更换状态% state1,…,状态K,在那里Kis the number of state%的参数。%定义层预测函数。结束函数向前(Z、状态、内存)=(层,X)%(可选)正向输入数据通过层培训%的时间和输出结果,更新后的状态,和记忆%值。%%的输入:%层-层向前传播% X -层输入数据%输出:% Z -输出层的功能%——(可选)更新层状态%的记忆——自定义(可选的)内存值落后%的功能%%,与多个输入层,取代X X1,…, XN,% N是输入的数量。%,与多个输出层,取代Z% Z1,…,Z米,在那里米is the number of outputs.%——层具有多个状态参数,更换状态% state1,…,状态K,在那里Kis 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
与residualBlockLayer
。
classdefresidualBlockLayer < nnet.layer.Layer%……% & nnet.layer。为mattable ... % (Optional)% & nnet.layer。Acceleratable %(可选)…结束
如果你不指定一个落后的函数,那么层函数,默认情况下,接收无格式dlarray
对象作为输入。指定层接收到格式化dlarray
对象作为输入和输出格式dlarray
对象,也继承了nnet.layer.Formattable
类在定义自定义层。
通过传递数据dlnetwork
需要格式化dlarray
对象。使层接收格式化dlarray
对象作为输入,继承nnet.layer.Formattable
。层的功能支持加速度,因此也继承金宝appnnet.layer.Acceleratable
。加快定制层函数的更多信息,请参阅自定义层加速度函数。
classdefresidualBlockLayer < nnet.layer.Layer…& nnet.layer.Formattable…& nnet.layer.Acceleratable…结束
接下来,重命名myLayer
构造函数(第一个函数方法
部分),具有相同的名称作为层。
方法函数层= residualBlockLayer ()……结束…结束
保存层
层类文件保存在一个新文件命名residualBlockLayer.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
属性层构造函数。例如,看到的定义定制的深度学习与多个输入层。
剩余块层不需要任何额外的属性,所以你可以删除属性
部分。
这个自定义层只有一个可学的参数,作为指定的残块本身dlnetwork
对象。网络也有状态参数(因为它有批标准化层),所以宣布这个参数属性(可学的,国家)
节和调用参数网络
。
属性(可学的,状态)%嵌套dlnetwork对象都可学的%参数和状态参数。%残块。网络结束
创建构造函数
创建的函数结构层和初始化层属性。指定任何变量需要创建构造函数作为输入层。
剩余块层构造函数需要四个输入参数:
数量的卷积过滤器
步(可选,默认步1)
标志包括卷积跳过连接(可选,默认标志
假
)层名称(可选,默认名称
”
)
的构造函数residualBlockLayer
,指定所需的输入参数numFilters
的名称和可选参数名称-值对NameValueArgs
。添加一个评论的函数,函数的语法解释道。
函数层= residualBlockLayer (numFilters NameValueArgs)% = residualBlockLayer层(numFilters)创建一个残余%块层指定数量的过滤器。%% = residualBlockLayer层(numFilters名称=值)指定使用一个或多个名称参数%额外选项:%%的跨步,大步的卷积操作%(默认为1)%% IncludeSkipConvolution——国旗包括卷积%跳过连接%(默认错误)%%的名字—层名称%(默认)…结束
解析输入参数
解析输入参数使用参数
块。列表中的参数顺序功能语法和指定默认值。然后,提取的值NameValueArgs
输入。
%解析输入参数。参数numFilters NameValueArgs。步= 1 NameValueArgs。IncludeSkipConvolution = false NameValueArgs。Name =”结束步= NameValueArgs.Stride;includeSkipConvolution = NameValueArgs.IncludeSkipConvolution;= NameValueArgs.Name名称;
初始化层属性
在构造函数初始化图层属性,包括dlnetwork
对象。取代的评论%层构造函数
初始化的代码层属性。
设置的名字
属性输入参数的名字
。
%设置图层名称。层。Name =的名字;
通过设置给图层一行描述描述
层的属性。设置描述描述层和任何可选属性。
%设置层描述。描述=“残块与“+ numFilters +“过滤器,步伐”+步伐;如果=描述+ includeSkipConvolution描述”,并跳过卷积”;结束层。描述=描述;
通过设置指定类型的层类型
财产。的价值类型
当层显示在一个出现层
数组中。
%设置层类型。层。类型=“剩余块”;
定义残块。您可以创建剩余块层作为一个未初始化的嵌套dlnetwork
对象没有一个输入层,让软件自动初始化可学的训练时间和状态参数。有关更多信息,请参见自动初始化可学的dlnetwork对象进行训练。
首先,创建一个层数组包含的主要层块和将其转换为一层图。
%定义嵌套层图。层= [convolution2dLayer (3 numFilters填充=“相同”,步=步)batchNormalizationLayer reluLayer convolution2dLayer (3 numFilters填充=“相同”)batchNormalizationLayer additionLayer (Name =“添加”)reluLayer);lgraph = layerGraph(层);
接下来,添加跳过连接。如果includeSkipConvolution
国旗是真正的
卷积,然后还包括一层一层和批处理标准化的跳过连接。
%添加跳过连接。如果includeSkipConvolution层= [convolution2dLayer (1 numFilters跨步=步)batchNormalizationLayer (Name =“bnSkip”));lgraph = addLayers (lgraph层);lgraph = connectLayers (lgraph,“bnSkip”,“添加/ in2”);结束
由于没有输入层,这个网络有两个无关的输入。如果网络没有跳过连接,输入到第一层和卷积的输入之一“添加”
层是无关的。如果网络有跳过连接,然后独立输入输入第一个卷积层和卷积层跳过连接。
最后,将层图转换成dlnetwork
对象并设置层网络
财产。创建一个未初始化的dlnetwork
对象。的重量和可学的参数dlnetwork
对象的完整网络组装时自动初始化培训。
%转换为dlnetwork。网= dlnetwork (lgraph,“初始化”、假);%设置网络属性。层。Network = net;
把构造函数完成。
函数层= residualBlockLayer (numFilters NameValueArgs)% = residualBlockLayer层(numFilters)创建一个残余%块层指定数量的过滤器。%% = residualBlockLayer层(numFilters名称=值)指定使用一个或多个名称参数%额外选项:%%的跨步,大步的卷积操作%(默认为1)%% IncludeSkipConvolution——国旗包括卷积%跳过连接%(默认错误)%%的名字—层名称%(默认)%解析输入参数。参数numFilters NameValueArgs。步= 1 NameValueArgs。IncludeSkipConvolution = false NameValueArgs。Name =”结束步= NameValueArgs.Stride;includeSkipConvolution = NameValueArgs.IncludeSkipConvolution;= NameValueArgs.Name名称;%设置图层名称。层。Name =的名字;%设置层描述。描述=“残块与“+ numFilters +“过滤器,步伐”+步伐;如果=描述+ includeSkipConvolution描述”,并跳过卷积”;结束层。描述=描述;%设置层类型。层。类型=“剩余块”;%定义嵌套层图。层= [convolution2dLayer (3 numFilters填充=“相同”,步=步)batchNormalizationLayer reluLayer convolution2dLayer (3 numFilters填充=“相同”)batchNormalizationLayer additionLayer (Name =“添加”)reluLayer);lgraph = layerGraph(层);%添加跳过连接。如果includeSkipConvolution层= [convolution2dLayer (1 numFilters跨步=步)batchNormalizationLayer (Name =“bnSkip”));lgraph = addLayers (lgraph层);lgraph = connectLayers (lgraph,“bnSkip”,“添加/ in2”);结束%转换为dlnetwork。网= dlnetwork (lgraph,初始化= false);%设置网络属性。层。Network = net;结束
使用此构造函数,该命令residualBlockLayer(64步= 2,IncludeSkipConvolution = true, Name = " res5 ")
与64年创建一个剩余块层过滤器,一个跨步,跳过一个卷积连接,这个名字“res5”
。所需的重量和尺寸参数确定时,网络培训组装完成。
因为嵌套网络支持自动初始化,定义金宝app初始化
函数是可选的。层,要求信息从输入数据初始化可学的参数,例如,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
对象预测
函数使用适当的预测层操作。如果dlnetwork
也有状态参数,然后返回网络状态。
因为剩余块只有一个输入,一个输出,和一个状态参数,预测自定义层的语法[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
函数,输入和输出序列的长度必须匹配。
剩余块层,层是一个简单的传球前进的向前传球dlnetwork
对象。
实现此操作的定义层的功能预测
。执行的向前传球dlnetwork
预测,使用预测
函数dlnetwork
对象。在这种情况下,残余的输入块层作为两个独立的输入的输入dlnetwork
对象,这样的语法预测
为dlnetwork
对象是[Z,状态]=预测(净X, X)
。
因为层dlnetwork
对象不不同在训练和剩余块层不需要内存或一个不同的函数进行训练,你可以删除向前
函数的类文件。
创建预测
函数并将评论添加到顶部的函数,函数的语法解释道。
函数[Z,状态]=预测(层,X)%前进通过层预测时间和输入数据%输出结果和状态。%%的输入:%层-层向前传播% X -输入数据%输出:% Z -输出层的功能% -层状态%预测使用网络。网= layer.Network;[Z,状态]=预测(净,X, X);结束
因为预测
函数只使用功能的支持金宝appdlarray
对象,定义落后的
函数是可选的。支持的功能列表金宝appdlarray
对象,看到与dlarray支持函数的列表金宝app。
完成一层
视图层完成类文件。
classdefresidualBlockLayer < nnet.layer.Layer…& nnet.layer.Formattable…& nnet.layer.Acceleratable%示例自定义剩余块层。属性(可学的,状态)%嵌套dlnetwork对象都可学的%参数和状态参数。%残块。网络结束方法函数层= residualBlockLayer (numFilters NameValueArgs)% = residualBlockLayer层(numFilters)创建一个残余%块层指定数量的过滤器。%% = residualBlockLayer层(numFilters名称=值)指定使用一个或多个名称参数%额外选项:%%的跨步,大步的卷积操作%(默认为1)%% IncludeSkipConvolution——国旗包括卷积%跳过连接%(默认错误)%%的名字—层名称%(默认)%解析输入参数。参数numFilters NameValueArgs。步= 1 NameValueArgs。IncludeSkipConvolution = false NameValueArgs。Name =”结束步= NameValueArgs.Stride;includeSkipConvolution = NameValueArgs.IncludeSkipConvolution;= NameValueArgs.Name名称;%设置图层名称。层。Name =的名字;%设置层描述。描述=“残块与“+ numFilters +“过滤器,步伐”+步伐;如果=描述+ includeSkipConvolution描述”,并跳过卷积”;结束层。描述=描述;%设置层类型。层。类型=“剩余块”;%定义嵌套层图。层= [convolution2dLayer (3 numFilters填充=“相同”,步=步)batchNormalizationLayer reluLayer convolution2dLayer (3 numFilters填充=“相同”)batchNormalizationLayer additionLayer (Name =“添加”)reluLayer);lgraph = layerGraph(层);%添加跳过连接。如果includeSkipConvolution层= [convolution2dLayer (1 numFilters跨步=步)batchNormalizationLayer (Name =“bnSkip”));lgraph = addLayers (lgraph层);lgraph = connectLayers (lgraph,“bnSkip”,“添加/ in2”);结束%转换为dlnetwork。网= dlnetwork (lgraph,初始化= false);%设置网络属性。层。Network = net;结束函数[Z,状态]=预测(层,X)%前进通过层预测时间和输入数据%输出结果和状态。%%的输入:%层-层向前传播% X -输入数据%输出:% Z -输出层的功能% -层状态%预测使用网络。网= layer.Network;[Z,状态]=预测(净,X, X);结束结束结束
GPU的兼容性
如果层转发功能完全支持金宝appdlarray
对象,则GPU兼容层。否则,必须支持GPU兼容,层功能的输入并返回输出类型金宝appgpuArray
(并行计算工具箱)。
许多MATLAB内置函数的支持金宝appgpuArray
(并行计算工具箱)和dlarray
输入参数。支持的功能列表金宝appdlarray
对象,看到与dlarray支持函数的列表金宝app。对GPU执行的函数的列表,看看运行在GPU MATLAB函数(并行计算工具箱)。使用GPU深度学习,你也必须有一个支持GPU设备。金宝app支持设备的信息,请参阅金宝appGPU计算的需求(并行计算工具箱)。在MATLAB与gpu的更多信息,见在MATLAB GPU计算(并行计算工具箱)。
在这个例子中,使用MATLAB函数预测
所有的支金宝app持dlarray
对象,所以GPU兼容层。
另请参阅
setLearnRateFactor
|checkLayer
|setL2Factor
|getLearnRateFactor
|getL2Factor
|assembleNetwork
|networkDataLayout