If深度学习工具箱™ 不提供分类或回归问题所需的图层,则可以使用此示例作为指南定义自己的自定义图层。有关内置图层的列表,请参阅深度学习层列表。
要定义自定义深度学习层,可以使用此示例中提供的模板,这将带您完成以下步骤:
命名层-为层命名,以便在MATLAB中使用®。
声明图层特性-指定图层的特性,包括可学习参数和状态参数。
创建构造函数(可选)-指定如何构造图层并初始化其属性。如果未指定构造函数,则在创建时,软件将初始化图层的名字
,描述
和类型
具有的属性[]
并将图层输入和输出的数量设置为1。
创建前向函数——指定数据在预测时间和训练时间如何通过层(前向传播)。
创建重置状态功能(可选)-指定如何重置状态参数。
创建反向函数(可选)-指定损失相对于输入数据和可学习参数的导数(反向传播)。如果未指定向后函数,则向前函数必须支持万博1manbetxdlarray
物体。
这个例子展示了如何创建一个加权加法层,这是一个具有多个输入和可学习参数的层,并在卷积神经网络中使用它。加权加法层按元素扩展并添加来自多个神经网络层的输入。
将中间层模板复制到MATLAB中的新文件中。此模板概述了中间层类定义的结构。它概述了:
可选属性
块的层属性,可学习参数,和状态参数。
层构造函数。
这个预测
函数和可选的向前地
作用
可选重置静止
用于具有状态属性的图层的函数。
可选向后的
作用
classdefmyLayer%&nnet.layer.Formattable(可选)属性%(可选)图层属性。%在此声明图层特性。终止属性(可学习)%(可选)层学习参数。%在这里声明可学习的参数。终止属性(州)%(可选)图层状态参数。%在此声明状态参数。终止属性(可学习的,州)%(可选)嵌套dlnetwork对象都是可学习的%参数和状态。%在此处将嵌套网络声明为可读和状态参数。终止方法作用图层=myLayer()%(可选)创建一个myLayer。%该函数必须与类名相同。在这里定义层构造函数。终止作用[z,状态] =预测(图层,x)%在预测时通过层转发输入数据,并%输出结果和更新的状态。%%投入:%层-要向前传播的层%X-输入数据%产出:% Z -层前向函数的输出%状态-(可选)更新的图层状态。%%-对于具有多个输入的层,将X替换为X1,…,XN,%其中N是输入的数量。%-对于具有多个输出的图层,将Z替换为%Z1,…,ZM,其中M是输出的数量。%-对于具有多个状态参数的图层,请替换状态% state1,…,状态K哪里K我s the number of state%参数。%在这里定义层预测函数。终止作用[Z,状态,内存]=转发(层,X)%(可选)在训练时通过图层转发输入数据%时间并输出结果,更新状态和内存%值。%%投入:%层-要向前传播的层% X -层输入数据%产出:% Z -层前向函数的输出% state -(可选)更新的层状态%内存 - (可选)自定义后向后的内存值%作用%%-对于具有多个输入的层,将X替换为X1,…,XN,%其中N是输入的数量。%-对于具有多个输出的图层,将Z替换为%Z1,…,ZM,其中M是输出的数量。%-对于具有多个状态参数的图层,请替换状态% state1,…,状态K哪里K我s the number of state%参数。%在这里定义层转发函数。终止作用层= resetState(层)%(可选)重置层状态。%在这里定义重置状态函数。终止作用[dLdX,dLdW,dLdSin]=向后(层,X,Z,dLdZ,dLdSout,内存)%(可选)反向传播损失的导数%功能通过层。%%投入:%层-要向后传播的层% X -层输入数据%z层输出数据%dLdZ-损失对层的导数%输出% dLdSout -(可选)损失的衍生%陈述输出%memory-前进功能的记忆值%产出:%dLdX-损失对层输入的导数%dLdW—(可选)与以下各项有关的损失衍生工具:%可学的参数%dLdSin—(可选)与以下各项有关的损失衍生工具:%状态输入%%-对于具有状态参数的图层,必须使用向后语法%同时包括dLdSout和dLdSin,或两者都不包括。%-对于具有多个输入的图层,将X和dLdX替换为% X1,…,XN和DLdX1,...,dLdXN, respectively, where N is%输入的数量。% - 对于具有多个输出的图层,用z和dlz替换% Z1,…,ZM和DLdZ,...,dLdZM, respectively, where M is the%输出数。%-对于具有多个可学习参数的图层,请替换%dLdW带dLdW1,…,dLdWP,其中P是%可学的参数。%-对于具有多个状态参数的图层,请替换dLdSin%使用dLdSin1、…、dLdSinK和% dLdSout1,…DldSoutK, respectively, where K is the number百分比参数。%在这里定义层向后函数。终止终止终止
首先,为图层命名。在类文件的第一行中,替换现有名称MyLayer.
具有加权叠加层
。
classdef加权加法层%&nnet.layer.Formattable(可选)...终止
如果不指定反向函数,则该层函数默认接收无格式dlarray
对象作为输入。指定图层接收的格式化dlarray
对象作为输入,也作为格式化的输出dlarray
对象,也从nnet.layer.Formattable
定义自定义图层时初始化。
该层不需要formattable输入,因此删除可选的nnet.layer.Formattable
超类。
classdef加权加法层...终止
接下来,重命名MyLayer.
构造函数(函数中的第一个函数)方法
节),使其与图层具有相同的名称。
方法作用层=加权的添加层()。。。终止...终止
将图层类文件保存在名为的新文件中加权附加层
。文件名必须与层名匹配。要使用该层,必须将文件保存在当前文件夹或MATLAB路径上的文件夹中。
属性中声明图层属性属性
节,并通过在属性(学习)
部分
默认情况下,自定义中间层具有这些特性。不要在中声明这些属性属性
部分
所有物 | 描述 |
---|---|
的名字 |
图层名称,指定为字符向量或字符串标量。为了层 数组输入列车网络 ,汇编 ,分层图 和数据链路网络 函数自动将名称分配给图层的名字 着手'' 。 |
描述 |
层的单行描述,指定为字符串标量或字符向量。当图层显示在图形中时,将显示此说明 如果未指定图层描述,则软件将显示图层类名。 |
类型 |
层的类型,指定为字符向量或字符串标量。的价值 如果未指定图层类型,则软件显示图层类名。 |
努明普茨 |
层的输入数,指定为正整数。如果未指定此值,则软件会自动设置努明普茨 到中的姓名数输入名称 。默认值为1.。 |
输入名称 |
输入图层名称,指定为字符向量的单元格数组。如果未指定此值,则努明普茨 大于1,则软件会自动设置输入名称 来{“三机”,…,“客栈”} 哪里N 等于努明普茨 。默认值为{'在'} 。 |
NumOutputs |
图层的输出数,指定为正整数。如果未指定此值,则软件会自动设置NumOutputs 到中的姓名数输出名称 。默认值为1.。 |
输出名称 |
输出层的名称,指定为字符向量的单元格数组。如果未指定此值,则NumOutputs 大于1,则软件会自动设置输出名称 来{'out1',…,'outM'} 哪里M 等于NumOutputs 。默认值为{“出”} 。 |
如果该层没有其他属性,则可以省略属性
部分
提示
如果你正在创建一个有多个输入的图层,那么你必须设置努明普茨
或输入名称
属性。如果要创建具有多个输出的层,则必须设置NumOutputs
或输出名称
层构造函数中的属性。
加权添加层不需要任何其他特性,因此可以删除属性
部分
加权加法层只有一个可学习的参数,即权重。在属性(学习)
分段并调用参数砝码
。
属性(可学习)%层可学习参数%比例系数砝码终止
创建构建图层并初始化图层属性的函数。指定将图层创建为构造函数的输入所需的任何变量。
加权加法层构造函数需要两个输入:层的输入数和层名称。层的输入数量指定可学习参数的大小砝码
。指定两个名为努明普茨
和名称
在里面加权叠加层
作用在函数顶部添加注释,解释函数的语法。
作用层=加权的添加层(numInputs,名称)%layer=weightedAdditionLayer(numInputs,名称)创建一个%加权加法层并指定输入的数量%和图层名称。...终止
在构造函数中初始化图层属性,包括可学习的参数。替换注释%层构造函数在这里
使用初始化图层特性的代码。
设定努明普茨
属性设置为输入参数努明普茨
。
%设置输入数。layer.NumInputs=NumInputs;
设定的名字
属性设置为输入参数名称
。
%设置图层名称。layer.Name=名称;
给层一个单行描述通过设置描述
层的财产。设置描述以描述图层的类型及其大小。
%设置图层描述。层。描述=“加权加法”+ NumInputs +...“投入”;
加权加法层将每个层的输入乘以相应的系数砝码
并将结果值相加。初始化可学习参数砝码
是一个大小的随机向量1-by-努明普茨
。砝码
是图层对象的特性,因此必须将向量指定给层。重量
。
%初始化层权重层权重=兰特(1,单位);
查看已完成的构造函数。
作用层=加权的添加层(numInputs,名称)%layer=weightedAdditionLayer(numInputs,名称)创建一个%加权加法层并指定输入的数量%和图层名称。%设置输入数。layer.NumInputs=NumInputs;%设置图层名称。layer.Name=名称;%设置图层描述。层。描述=“加权加法”+ NumInputs +...“投入”;%初始化层权重。层权重=兰特(1,单位);终止
使用此构造函数,命令加权添加层(3,'add')
创建一个带有三个输入和名称的加权添加层“添加”
。
创建预测时和训练时使用的层转发函数。
创建一个名为预测
将数据向前传播到预测的时间并输出结果。
这个预测
函数语法取决于层的类型。
Z=预测(层,X)
转发输入数据X
通过该层并输出结果Z
哪里层
只有一个输入,一个输出。
[z,状态] =预测(图层,x)
还输出更新的状态参数状态
哪里层
只有一个状态参数。
您可以调整具有多个输入,多个输出或多个状态参数的图层的语法:
对于具有多个输入的图层,请替换X
具有X1,…,XN
哪里N
是输入的数量努明普茨
属性必须匹配N
。
对于有多个输出的层,替换Z
具有Z1,…,ZM
哪里M
是输出的数量NumOutputs
属性必须匹配M
。
对于具有多个状态参数的图层,请替换状态
具有state1,…,stateK
哪里K
是状态参数的数目。
提示
如果层的输入数量可能不同,则使用变长度输入宗量
而不是X1,…,XN
。在这种情况下,变长度输入宗量
是输入的单元格数组,其中瓦拉金{i}
对应于席
。
如果输出的数量可能不同,则使用瓦拉戈特
而不是Z1,…,锌
。在这种情况下,瓦拉戈特
是输出的单元格数组,其中varargout {j}
对应于Zj
。
提示
如果自定义图层具有数据链路网络
对象的可学习参数,然后在预测
自定义层的函数,使用预测
功能数据链路网络
。使用数据链路网络
对象预测
功能确保软件使用正确的层操作进行预测。
由于加权加法层只有一个输出和可变数量的输入,因此预测
对于加权加法层是z =预测(图层,varargin)
哪里瓦拉金{i}
对应于席
对于正整数我
小于或等于努明普茨
。
默认情况下,层使用预测
作为训练时的前进函数。若要在训练时使用不同的前进函数,或保留后退函数所需的值,还必须创建一个名为向前地
。
输入尺寸取决于数据类型和连接层的输出:
层输入 | 输入大小 | 观察维度 |
---|---|---|
特征向量 | C-借-N哪里C对应于通道数和N是观察数。 | 2. |
二维图像 | H-借-W-借-C-借-N哪里H,W和C分别对应图像的高度、宽度和通道数量,和N是观察数。 | 4. |
三维图像 | H-借-W-借-D-借-C-借-N哪里H,W,D和C分别对应于三维图像的高度、宽度、深度和通道数,以及N是观察数。 | 5. |
向量序列 | C-借-N-借-s哪里C是序列的特征数,N是观察次数,以及s为序列长度。 | 2. |
二维图像序列 | H-借-W-借-C-借-N-借-s哪里H,W和C分别对应于图像的高度、宽度和通道数,N是观察次数,以及s为序列长度。 | 4. |
三维图像序列 | H-借-W-借-D-借-C-借-N-借-s哪里H,W,D和C分别对应于三维图像的高度、宽度、深度和通道数,N是观察次数,以及s为序列长度。 | 5. |
对于输出序列的层,图层可以输出任何长度或输出数据的序列,没有时间尺寸。请注意,培训使用使用该序列输出序列的网络时列车网络
函数时,输入序列和输出序列的长度必须匹配。
这个向前地
函数通过位于的层向前传播数据训练时间并输出内存值。
这个向前地
函数语法取决于图层的类型:
Z=正向(层,X)
转发输入数据X
通过该层并输出结果Z
哪里层
只有一个输入,一个输出。
[Z,状态]=正向(层,X)
还输出更新的状态参数状态
哪里层
只有一个状态参数。
(__、内存)=(层,X)转发
还返回自定义的内存值向后的
使用以前的任何语法函数。如果该图层都有自定义向前地
函数和自定义向后的
函数,则前进函数必须返回一个内存值。
您可以调整具有多个输入,多个输出或多个状态参数的图层的语法:
对于具有多个输入的图层,请替换X
具有X1,…,XN
哪里N
是输入的数量努明普茨
属性必须匹配N
。
对于有多个输出的层,替换Z
具有Z1,…,ZM
哪里M
是输出的数量NumOutputs
属性必须匹配M
。
对于具有多个状态参数的图层,请替换状态
具有state1,…,stateK
哪里K
是状态参数的数目。
提示
如果层的输入数量可能不同,则使用变长度输入宗量
而不是X1,…,XN
。在这种情况下,变长度输入宗量
是输入的单元格数组,其中瓦拉金{i}
对应于席
。
如果输出的数量可能不同,则使用瓦拉戈特
而不是Z1,…,锌
。在这种情况下,瓦拉戈特
是输出的单元格数组,其中varargout {j}
对应于Zj
。
提示
如果自定义图层具有数据链路网络
对象的可学习参数,然后在向前地
自定义层的函数,使用向前地
委员会的职能数据链路网络
对象。使用数据链路网络
对象向前地
功能确保软件使用正确的层操作进行培训。
加权加法层的正向函数为
在哪里X(1), …,X(n)对应于层输入和W1.、……WN是层权重。
实施前向功能预测
。在预测
,输出Z
对应于
. 加权加法层不需要内存或用于训练的其他正向函数,因此您可以删除向前地
类文件中的函数。在函数顶部添加注释,解释函数的语法。
提示
如果您使用诸如的函数预先采用阵列零
,则必须确保这些数组的数据类型与层函数输入一致“就像”
选择零
。例如,初始化大小为0的数组深圳
使用与数组相同的数据类型X
,使用Z=零(sz,“类似”,X)
。
作用Z=预测(层,变精)%Z=预测(层,X1,…,Xn)转发输入数据X1,%……,XN通过该层并输出结果Z。X=varargin;W=层重量;%初始化输出X1=X{1};sz=size(X1);Z=zero(sz,“喜欢”,X1);%加权补充对于i=1:layer.NumInputs Z=Z+W(i)*X{i};终止终止
因为预测
函数仅使用支持万博1manbetxdlarray
对象,定义向后的
函数是可选的。获取支持的函数列表万博1manbetxdlarray
对象,参见支持dlarray的函数列表万博1manbetx。
查看已完成的层类文件。
classdef加权加法层%示例自定义加权添加层。属性(可学习)%层可学习参数%比例系数砝码终止方法作用层=加权的添加层(numInputs,名称)%layer=weightedAdditionLayer(numInputs,名称)创建一个%加权加法层并指定输入的数量%和图层名称。%设置输入数。layer.NumInputs=NumInputs;%设置图层名称。layer.Name=名称;%设置图层描述。层。描述=“加权加法”+ NumInputs +...“投入”;%初始化层权重。层权重=兰特(1,单位);终止作用Z=预测(层,变精)%Z=预测(层,X1,…,Xn)转发输入数据X1,%……,XN通过该层并输出结果Z。X=varargin;W=层重量;%初始化输出X1=X{1};sz=size(X1);Z=zero(sz,“喜欢”,X1);%加权补充对于i=1:layer.NumInputs Z=Z+W(i)*X{i};终止终止终止终止
如果层转发功能完全支持万博1manbetxdlarray
对象,然后该图层是GPU兼容。否则,兼容GPU,图层函数必须支持类型的输入和返回输出万博1manbetxgpuArray
(并行计算工具箱)。
许多MATLAB内置函数支持万博1manbetxgpuArray
(并行计算工具箱)和dlarray
输入参数。用于支持的函数列表万博1manbetxdlarray
对象,参见支持dlarray的函数列表万博1manbetx。有关在GPU上执行的函数的列表,请参阅在GPU上运行MATLAB函数(并行计算工具箱)。要使用GPU进行深入学习,您还必须拥有受支持的GPU设备。有关受支持设备的信息,请参阅万博1manbetxGPU版万博1manbetx本支持(并行计算工具箱)。有关在MATLAB中使用gpu的更多信息,请参见MATLAB中的GPU计算(并行计算工具箱)。
在本例中,使用了预测
全部支持万博1manbetxdlarray
对象,因此该层与GPU兼容。
检查自定义图层的图层有效性加权叠加层
。
定义自定义加权附加层。要创建此图层,请保存文件加权附加层
在当前文件夹中。
创建图层的实例,并使用检查层
。将有效输入大小指定为每个输入到图层的单个观察的典型大小。该层预期了4-D阵列输入,其中前三个尺寸对应于先前层输出的高度,宽度和通道的通道数,并且第四维度对应于观察。
指定观察和设置的输入的典型大小“观察维度”
到4。
层= weightedAdditionLayer (2“添加”); validInputSize={[2420],[2420]};checkLayer(层,validInputSize,“观察维度”4)
正在运行nnet.checklayer.TestLayerWithoutBackward………..完成nnet.checklayer.TestLayerWithoutBackward\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。
在这里,函数不会检测到层的任何问题。
您可以像使用深度学习工具箱中的任何其他层一样使用自定义层。本节介绍如何使用先前创建的加权加法层创建和训练数字分类网络。
加载示例培训数据。
[XTrain, YTrain] = digitTrain4DArrayData;
定义自定义加权附加层。要创建此图层,请保存文件加权附加层
在当前文件夹中。
创建包含自定义图层的图层图加权叠加层
。
图层= [imageInputLayer([28 28 1],“姓名”,“在”)卷积2层(5,20,“姓名”,“conv1”)雷卢耶(“姓名”,'relu1')卷积2层(3,20,“填充”1.“姓名”,“conv2”)雷卢耶(“姓名”,“relu2”)卷积2层(3,20,“填充”1.“姓名”,“conv3”)雷卢耶(“姓名”,“relu3”)加权附加层(2,“添加”)完全连接层(10,“姓名”,“fc”)软MaxLayer(“姓名”,“softmax”)分类层(“姓名”,“classoutput”)]; lgraph=层图(层);lgraph=连接层(lgraph,'relu1',“添加/ in2”);
设置培训选项并培训网络。
选项=培训选项(“亚当”,“MaxEpochs”,10);网络=列车网络(XTrain、YTrain、lgraph、选项);
单CPU训练。初始化输入数据规范化。|========================================================================================| | 时代| |迭代时间| Mini-batch | Mini-batch |基地学习 | | | | ( hh: mm: ss) | | |丧失准确性 | |========================================================================================| | 1 | 1 | 00:00:01 | | 2.2951 | 0.0010 12.50%||2.|5.0 | 00:00:16 | 72.66% | 0.7875 | 0.0010 | | 3 | 100 | 00:00:29 | 89.84% | 0.2991 | 0.0010 | | 4 | 150 | 00:00:43 | 94.53% | 0.1545 | 0.0010 | | 6 | 200 | 00:00:56 | 99.22% | 0.0375 | 0.0010 | | 7 | 250 | 00:01:10 | 100.00% | 0.0361 | 0.0010 | | 8 | 300 | 00:01:23 | 99.22% | 0.0193 | 0.0010 | | 9 | 350 | 00:01:36 | 99.22% | 0.0200 | 0.0010 | | 10 | 390 | 00:01:46 | 100.00% | 0.0066 | 0.0010 | |========================================================================================| Training finished: Max epochs completed.
查看加权加法层学习的权重。
净层数(8).重量
ans=1x2单行矢量1.0222 1.0004
通过预测新数据和计算精度来评估网络性能。
[XTest,YTest]=Digittest4ArrayData;YPred=分类(净,XTest);精度=总和(YTest==YPred)/numel(YTest)
精度= 0.9894
功能层
|检查层
|setLearnRateFactor
|setL2Factor
|getLearnRateFactor
|getL2Factor
|findPlaceholderLayers
|替换层
|汇编
|占位持票人