定义定制的深度学习与多个输入层
如果深入学习工具箱™不提供层你需要为你的分类或回归问题,那么您可以定义自己的自定义层使用这个例子作为参考。一个内置的图层列表,看到深度学习层的列表。
定义一个自定义的深度学习层,您可以使用提供的模板在这个例子中,需要通过以下步骤:
名字一层一层——给一个名称,这样您就可以在MATLAB中使用它®。
声明层属性指定图层的属性,包括可学的参数和状态参数。
创建一个构造函数(可选)——指定层如何构造和初始化它的属性。如果你不指定一个构造函数,那么在创建、软件初始化
的名字
,描述
,类型
属性与[]
并设置输入和输出层的数量为1。创建向前函数——指定数据传递通过层(向前传播)在预测时间和培训时间。
创建重置状态函数(可选)——指定如何重置状态参数。
创建一个反向功能(可选)——指定的衍生品损失对输入数据和可学的参数(向后传播)。如果你不指定一个落后的函数,那么远期功能必须支持金宝app
dlarray
对象。
这个例子展示了如何创建一个加权加法层,这一层具有多个输入和可学的参数,并使用它在一个卷积神经网络。加权加法层尺度和来自多个神经网络的输入层element-wise补充道。
过渡层模板
中间一层模板复制到一个新文件在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
与weightedAdditionLayer
。
classdefweightedAdditionLayer < nnet.layer.Layer%……% & nnet.layer。为mattable ... % (Optional)% & nnet.layer。Acceleratable %(可选)…结束
如果你不指定一个落后的函数,那么层函数,默认情况下,接收无格式dlarray
对象作为输入。指定层接收到格式化dlarray
对象作为输入和输出格式dlarray
对象,也继承了nnet.layer.Formattable
类在定义自定义层。
层的功能支持加速度,因此也继承金宝appnnet.layer.Acceleratable
。加快定制层函数的更多信息,请参阅自定义层加速度函数。层不需要formattable输入,所以删除可选nnet.layer.Formattable
超类。
classdefweightedAdditionLayer < nnet.layer.Layer…& nnet.layer.Acceleratable…结束
接下来,重命名myLayer
构造函数(第一个函数方法
部分),具有相同的名称作为层。
方法函数层= weightedAdditionLayer ()……结束…结束
保存层
层类文件保存在一个新文件命名weightedAdditionLayer.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
属性层构造函数。
加权加法层不需要任何额外的属性,所以你可以删除属性
部分。
加权加法层只有一个可学的参数,权重。宣布这可学的参数属性(可学的)
节和调用参数权重
。
属性(可学的)%层可学的参数%比例系数权重结束
创建构造函数
创建的函数结构层和初始化层属性。指定任何变量需要创建构造函数作为输入层。
加权加法层构造函数需要两个输入:输入层和层数的名字。这个数量的输入层指定的大小可学的参数权重
。指定两个输入参数命名numInputs
和的名字
在weightedAdditionLayer
函数。添加一个评论的函数,函数的语法解释道。
函数层= weightedAdditionLayer (numInputs、名称)% = weightedAdditionLayer层(numInputs、名称)创建一个%加权加法层和指定输入的数量%和图层名称。…结束
初始化层属性
初始化图层属性,包括可学的参数,构造函数。取代的评论%层构造函数
初始化的代码层属性。
设置NumInputs
属性输入参数numInputs
。
%设置输入的数量。层。NumInputs = numInputs;
设置的名字
属性输入参数的名字
。
%设置图层名称。层。的名字=的名字;
通过设置给图层一行描述描述
层的属性。设置描述描述层的类型和它的大小。
%设置层描述。层。描述=“加权加法”+ numInputs +…“输入”;
加权加法层每一层输入比率乘以相应的系数权重
并添加在一起产生的值。初始化可学的参数权重
是一个随机向量的大小1×-numInputs
。权重
层对象的一个属性,所以你必须分配向量layer.Weights
。
%初始化层的重量layer.Weights=rand(1,numInputs);
把构造函数完成。
函数层= weightedAdditionLayer (numInputs、名称)% = weightedAdditionLayer层(numInputs、名称)创建一个%加权加法层和指定输入的数量%和图层名称。%设置输入的数量。层。NumInputs = numInputs;%设置图层名称。层。的名字=的名字;%设置层描述。层。描述=“加权加法”+ numInputs +…“输入”;%初始化层的权重。layer.Weights=rand(1,numInputs);结束
使用此构造函数,该命令“添加”weightedAdditionLayer (3)
创建一个加权加法层有三个输入和这个名字“添加”
。
创建向前函数
在预测创建层转发功能使用时间和培训时间。
创建一个函数命名预测
通过层传播数据的转发预测的时间并输出结果。
的预测
函数的语法取决于类型的层。
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
对象预测
函数使用适当的预测层操作。
因为加权加法层只有一个输出和数量可变的输入的语法预测
层是加权加法Z =预测(层,变长度输入宗量)
,在那里变长度输入宗量{我}
对应于习
为正整数我
小于或等于NumInputs
。
默认情况下,该层使用预测
函数在训练时间。使用不同的函数在训练时间,或保留值所需的反向功能,您必须创建一个函数命名向前
。
的尺寸取决于类型的数据输入和输出的连接层:
层的输入 | 输入的大小 | 观察维度 |
---|---|---|
特征向量 | 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
对象向前
函数使用适当的层操作培训。
加权的转发功能层
在哪里X(1)、…X(n)对应于输入和层W1、…Wn层的权重。
实现功能预测
。在预测
,输出Z
对应于
。加权加法层不需要内存或一个不同的函数进行训练,所以你可以删除向前
函数的类文件。添加一个评论的函数,函数的语法解释道。
提示
如果你preallocate数组使用等功能0
,那么你必须确保这些数组的数据类型是一致的输入层功能。创建一个数组相同数据类型的零作为另一个数组,使用“喜欢”
选择0
。例如,初始化一个数组大小的0深圳
具有相同数据类型的数组X
,使用Z = 0(深圳,“喜欢”,X)
。
函数Z =预测(层,变长度输入宗量)% Z =预测(层,X1,…,Xn)将输入数据转发X1,%……,Xn通过层和输出结果Z。X =变长度输入宗量;W = layer.Weights;%初始化输出X1 = X {1};深圳=大小(X1);Z = 0(深圳,“喜欢”X1);%加权加法为i = 1:层。NumInputsZ=Z+ W(i)*X{i};结束结束
因为预测
函数只使用功能的支持金宝appdlarray
对象,定义落后的
函数是可选的。支持的功能列表金宝appdlarray
对象,看到与dlarray支持函数的列表金宝app。
完成一层
视图层完成类文件。
classdefweightedAdditionLayer < nnet.layer.Layer…& nnet.layer.Acceleratable%示例自定义加权加法层。属性(可学的)%层可学的参数%比例系数权重结束方法函数层= weightedAdditionLayer (numInputs、名称)% = weightedAdditionLayer层(numInputs、名称)创建一个%加权加法层和指定输入的数量%和图层名称。%设置输入的数量。层。NumInputs = numInputs;%设置图层名称。层。的名字=的名字;%设置层描述。层。描述=“加权加法”+ numInputs +…“输入”;%初始化层的权重。layer.Weights=rand(1,numInputs);结束函数Z =预测(层,变长度输入宗量)% Z =预测(层,X1,…,Xn)将输入数据转发X1,%……,Xn通过层和输出结果Z。X =变长度输入宗量;W = layer.Weights;%初始化输出X1 = X {1};深圳=大小(X1);Z = 0(深圳,“喜欢”X1);%加权加法为i = 1:层。NumInputsZ=Z+ W(i)*X{i};结束结束结束结束
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兼容层。
检查的有效性与多个输入层
检查自定义层的层有效性weightedAdditionLayer
。
定义一个自定义加权加法层。创造这一层,保存文件weightedAdditionLayer.m
在当前文件夹。
创建一个实例层的使用和检查它的有效性checkLayer
。指定有效输入大小的典型尺寸单个观察每层的输入。预计4 - d数组输入层,前三个维度对应高度,宽度,和前面的通道数层输出,和第四维对应于观测。
指定一个观察的典型输入的大小和设置“ObservationDimension”
4。
层= weightedAdditionLayer (2“添加”);24 20 validInputSize ={[24],[20] 24日24};validInputSize checkLayer(层,“ObservationDimension”4)
跳过GPU测试。不兼容的GPU设备发现。跳过代码生成的兼容性测试。检查代码生成层的有效性,指定“CheckCodegenCompatibility”和“ObservationDimension”选项。nnet.checklayer运行。TestLayerWithoutBackward .......... ........nnet.checklayer完成。TestLayerWithoutBackward __________测试总结:18了,10 0失败,0不完整,跳过。时间:0.32426秒。
在这里,函数层没有发现任何问题。
使用自定义加权加法在网络层
您可以使用一个自定义层以同样的方式与其他层深度学习工具。本节将展示如何创建和训练一个网络数字使用前面创建的加权加法层分类。
负荷训练数据的例子。
[XTrain, TTrain] = digitTrain4DArrayData;
定义一个自定义加权加法层。创造这一层,保存文件weightedAdditionLayer.m
在当前文件夹。
创建一个层图包括自定义层weightedAdditionLayer
。
层= [imageInputLayer ([28 28 1]) convolution2dLayer (5、20) reluLayer (“名字”,“relu1”20岁的)convolution2dLayer (3“填充”20岁的,1)reluLayer convolution2dLayer (3“填充”1)reluLayer weightedAdditionLayer (2“添加”)fullyConnectedLayer (10) softmaxLayer classificationLayer];lgraph = layerGraph(层);lgraph = connectLayers (lgraph,“relu1”,“添加/ in2”);
设置培训方案和培训网络。
选择= trainingOptions (“亚当”,“MaxEpochs”10);网= trainNetwork (XTrain TTrain、lgraph选项);
培训在单CPU。初始化输入数据规范化。| = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | | | |时代迭代时间| Mini-batch | Mini-batch |基地学习| | | | (hh: mm: ss) | | |损失精度率| | = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | | 1 | 1 | 00:00:01 | 12.50% | 2.2951 | 0.0010 | | 2 | 50 | 00:00:14 | 72.66% | 0.7879 | 0.0010 | | 3 | 100 | 00:00:26 | 89.84% | 0.2982 | 0.0010 | | 150 | | 00:00:38 | 94.53% | 0.1559 | 0.0010 | | 6 | 200 | 00:00:52 | 99.22% | 0.0391 | 0.0010 | | 250 | | 00:01:06 | 99.22% | 0.0363 | 0.0010 | | 300 | | 00:01:20 | 100.00% | 0.0195 | 0.0010 | | 350 | | 00:01:33 | 99.22% | 0.0127 | 0.0010 | | 390 | | 00:01:43 | 100.00% | 0.0039 | 0.0010 | | = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = |培训完成:马克思时代完成。
视图中所学到的权重加权加法层。
net.Layers .Weights (8)
ans =1 x2单一的行向量1.0226 - 1.0009
评估网络性能预测新数据和计算的准确性。
(XTest, tt) = digitTest4DArrayData;YPred =分类(净,XTest);精度=意味着(tt = = YPred)
精度= 0.9898
另请参阅
functionLayer
|checkLayer
|setLearnRateFactor
|setL2Factor
|getLearnRateFactor
|getL2Factor
|findPlaceholderLayers
|replaceLayer
|assembleNetwork
|PlaceholderLayer