If深度学习工具箱™ 不提供任务所需的图层,则可以使用此示例作为指南定义自己的自定义图层。有关内置图层的列表,请参阅深度学习层列表.
要定义自定义深度学习层,您可以使用本示例中提供的模板,该模板将引导您完成以下步骤:
命名层-为层命名,以便在MATLAB中使用®.
声明图层特性-指定图层的特性,包括可学习参数和状态参数。
创建构造函数(可选)-指定如何构造层并初始化其属性。如果未指定构造函数,则在创建时,软件将初始化名称
,描述
和类型
具有的属性[]
并将图层输入和输出的数量设置为1。
创建正向函数-指定数据在预测时和训练时如何通过层(正向传播)向前传递。
创建重置状态功能(可选)-指定如何重置状态参数。
创建反向函数(可选)-指定损失相对于输入数据和可学习参数的导数(反向传播)。如果未指定向后函数,则向前函数必须支持万博1manbetxdlarray
物体。
定义图层功能时,可以使用dlarray
物体。使用dlarray
对象通过允许您标记维度,使处理高维数据变得更容易。例如,您可以使用“S”
,“T”
,“C”
和“B”
标签,分别。对于未指定尺寸和其他尺寸,请使用“U”
标签对于dlarray
对于在特定标注上操作的对象函数,可以通过格式化dlarray
对象,或使用数据格式
选项
使用格式化dlarray
自定义图层中的对象还允许您定义输入和输出具有不同格式的图层,例如排列、添加或删除维度的图层。例如,您可以定义一个图层,该图层将具有不同格式的小批量图像作为输入“SSCB”
(空间、空间、通道、批次)并输出具有以下格式的序列的小批次“CBT”
(通道、批次、时间)。使用格式化dlarray
对象还允许您定义可以对具有不同输入格式的数据进行操作的图层,例如,支持具有不同格式输入的图层万博1manbetx“SSCB”
(空间、空间、通道、批次)和“CBT”
(通道、批次、时间)。
dlarray
对象还支持自动区分。这意味着如果您的转发万博1manbetx功能完全支持dlarray
对象,则定义向后函数是可选的。
启用对使用格式化万博1manbetxdlarray
自定义图层转发函数中的对象也继承自nnet.layer.Formattable
定义自定义层时初始化。有关示例,请参阅使用格式化输入定义自定义深度学习层.
此示例演示如何创建PReLU层,这是一个具有可学习参数的层,并将其用于卷积神经网络。PReLU层执行阈值操作,其中对于每个通道,任何小于零的输入值都乘以在训练时学习的标量。[1]对于小于零的值,PReLU层应用缩放系数 这些系数形成一个可学习的参数,该层在训练期间学习该参数。
这个数字来自[1]比较ReLU和PReLU图层功能。
将中间层模板复制到MATLAB中的新文件中。此模板概述了中间层类定义的结构。它概述了:
可选的性质
图层特性、可学习参数和状态参数的块。
层构造函数。
这个预测
函数和可选的向前地
作用
可选的重置状态
用于具有状态属性的图层的函数。
可选的向后的
作用
classdefmyLayer%&nnet.layer.Formattable(可选)性质%(可选)图层特性。%在此声明图层特性。终止性质(可学习)%(可选)图层可学习参数。%在这里声明可学习的参数。终止性质(州)%(可选)图层状态参数。%在这里声明状态参数。终止性质(可学习的,州)%(可选)具有两个可学习对象的嵌套dlnetwork对象%参数和状态。%在此处声明具有可学习和状态参数的嵌套网络。终止方法作用图层=myLayer()%(可选)创建myLayer。%此函数必须与类同名。%在这里定义层构造函数。终止作用[Z,状态]=预测(层,X)%在预测时通过层转发输入数据,并%输出结果和更新的状态。%%投入:%层-要向前传播的层%X-输入数据%产出:%Z—层前向函数的输出%状态-(可选)更新的图层状态。%%-对于具有多个输入的层,将X替换为X1,…,XN,%其中N是输入的数量。%-对于具有多个输出的图层,将Z替换为%Z1,…,ZM,其中M是输出的数量。%-对于具有多个状态参数的图层,请替换状态%对于state1,…,stateK,其中K是状态数%参数。%在这里定义层预测函数。终止作用[Z,状态,内存]=转发(层,X)%(可选)在训练时通过图层转发输入数据%计时并输出结果、更新状态和内存%价值观。%%投入:%层-要向前传播的层%X层输入数据%产出:%Z—层前向函数的输出%状态-(可选)更新的图层状态%内存-(可选)自定义向后的内存值%作用%%-对于具有多个输入的层,将X替换为X1,…,XN,%其中N是输入的数量。%-对于具有多个输出的图层,将Z替换为%Z1,…,ZM,其中M是输出的数量。%-对于具有多个状态参数的图层,请替换状态%对于state1,…,stateK,其中K是状态数%参数。%在这里定义层转发函数。终止作用图层=重置状态(图层)%(可选)重置图层状态。%在这里定义重置状态函数。终止作用[dLdX,dLdW,dLdSin]=向后(层,X,Z,dLdZ,dLdSout,内存)%(可选)反向传播损失的导数%功能通过层。%%投入:%层-要向后传播的层%X层输入数据%Z层输出数据%dLdZ-损失对层的导数%输出%dLdSout-(可选)损失的衍生工具%陈述输出%memory-前进功能的记忆值%产出:%dLdX-损失对层输入的导数%dLdW—(可选)与以下各项有关的损失衍生工具:%可学习参数%dLdSin—(可选)与以下各项有关的损失衍生工具:%状态输入%%-对于具有状态参数的图层,必须使用向后语法%同时包括dLdSout和dLdSin,或两者都不包括。%-对于具有多个输入的图层,将X和dLdX替换为%X1,…,XN和dLdX1,…,dLdXN,其中N是%输入的数量。%-对于具有多个输出的图层,将Z和dlZ替换为%Z1,…,ZM和dLdZ,…,dLdZM,其中M是%产出数量。%-对于具有多个可学习参数的图层,请替换%dLdW带dLdW1,…,dLdWP,其中P是%可学习的参数。%-对于具有多个状态参数的图层,请替换dLdSin%使用dLdSin1、…、dLdSinK和%dLdSout1,…dldSoutK,其中K是数字%状态参数的定义。%在这里定义层向后函数。终止终止终止
首先,为图层命名。在类文件的第一行中,替换现有名称迈莱尔
具有前奏者
.
classdef预层%&nnet.layer.Formattable(可选)...终止
如果未指定反向函数,则默认情况下,层函数将接收无格式dlarray
对象作为输入。指定图层接收的格式化dlarray
对象作为输入,也作为格式化的输出dlarray
对象,也从nnet.layer.Formattable
定义自定义图层时初始化。
该层不需要formattable输入,因此删除可选的nnet.layer.Formattable
超类。
classdef预层...终止
接下来,重命名迈莱尔
构造函数(函数中的第一个函数)方法
节),使其与图层具有相同的名称。
方法作用层=预层()。。。终止...终止
将图层类文件保存在名为的新文件中预演者
. 文件名必须与图层名匹配。要使用图层,必须将文件保存在当前文件夹或MATLAB路径上的文件夹中。
在中声明图层特性性质
节,并通过在属性(可学习)
部分
默认情况下,自定义中间层具有这些特性。不要在中声明这些属性性质
部分
所有物 | 描述 |
---|---|
名称 |
层名称,指定为字符向量或字符串标量。对于层 数组输入列车网络 ,装配网络 ,分层图 和数据链路网络 函数会自动将名称指定给具有名称 着手'' . |
描述 |
层的单行描述,指定为字符串标量或字符向量。当图层显示在图形中时,将显示此说明 如果未指定图层描述,则软件将显示图层类名。 |
类型 |
层的类型,指定为字符向量或字符串标量。价值 如果未指定图层类型,则软件将显示图层类名。 |
努明普茨 |
层的输入数,指定为正整数。如果未指定此值,则软件会自动设置努明普茨 到中的姓名数输入名称 . 默认值为1。 |
输入名称 |
输入图层名称,指定为字符向量的单元格数组。如果未指定此值,则努明普茨 大于1,则软件会自动设置输入名称 到{'in1',…,'inN'} 哪里N 等于努明普茨 。默认值为{'in'} . |
NumOutputs |
层的输出数,指定为正整数。如果未指定此值,则软件会自动设置NumOutputs 到中的姓名数输出名称 . 默认值为1。 |
输出名称 |
输出层的名称,指定为字符向量的单元格数组。如果未指定此值,则NumOutputs 大于1,则软件会自动设置输出名称 到{'out1',…,'outM'} 哪里M 等于NumOutputs 。默认值为{'out'} . |
如果图层没有其他特性,则可以忽略性质
部分
提示
如果要创建具有多个输入的图层,则必须设置努明普茨
或输入名称
层构造函数中的属性。如果要创建具有多个输出的图层,则必须设置NumOutputs
或输出名称
层构造函数中的属性。有关示例,请参见定义具有多个输入的自定义深度学习层.
PReLU层不需要任何其他特性,因此可以删除性质
部分
PReLU层只有一个可学习的参数,即缩放系数A.. 在属性(可学习)
节并调用参数阿尔法
.
性质(可学习)%层可学习参数%比例系数阿尔法终止
创建构造层的函数并初始化层属性。指定创建层所需的任何变量作为构造函数的输入。
PReLU layer构造函数需要一个输入参数(通道数)和一个可选参数(层名称)。通道数指定可学习参数的大小阿尔法
. 指定两个名为数字通道
和args
在前奏者
分别对应于通道数和可选输入参数的函数。在函数顶部添加注释,解释函数的语法。
作用层=预层(numChannels,args)%layer=preluLayer(numChannels)创建一个PReLU层%使用numChannels频道。%%layer=preluLayer(numChannels,Name=Name)还指定%图层名称...终止
初始化图层属性,包括构造函数中的可学习参数。替换注释%层构造函数在这里
使用初始化图层特性的代码。
使用论据
阻塞并设置名称
所有物
论据numChannels args.Name="";终止%设置图层名称。layer.Name=args.Name;
通过设置描述
层的属性。设置描述以描述层的类型及其大小。
%设置图层描述。图层.说明=“预习”+数字通道+“频道”;
对于PReLU层,当输入值为负值时,该层将输入的每个通道乘以阿尔法
. 初始化可学习参数阿尔法
是大小为1×1×1的随机向量-数字通道
.第三个尺寸指定为尺寸数字通道
,该层可以使用正向函数中输入的元素相乘。阿尔法
是图层对象的特性,因此必须将向量指定给阿尔法层
.
%初始化比例系数。层α=兰德([1个数字通道]);
查看已完成的构造函数。
作用层=预层(numChannels,args)%layer=preluLayer(numChannels)创建一个PReLU层%使用numChannels频道。%%layer=preluLayer(numChannels,Name=Name)还指定%图层名。论据numChannels args.Name="";终止%设置图层名称。layer.Name=名称;%设置图层描述。图层.说明=“预习”+数字通道+“频道”;%初始化比例系数。层α=兰德([1个数字通道]);终止
使用此构造函数,命令预备工(3,Name=“预备工”)
创建具有三个通道和名称的PReLU层“预备课程”
.
创建预测时和训练时使用的层转发函数。
创建一个名为预测
将数据向前传播通过位于的层预测时间并输出结果。
这个预测
函数语法取决于层的类型。
Z=预测(层,X)
转发输入数据X
通过该层并输出结果Z
哪里层
只有一个输入,一个输出。
[Z,状态]=预测(层,X)
还输出更新的状态参数状态
哪里层
只有一个状态参数。
可以调整具有多个输入、多个输出或多个状态参数的图层的语法:
对于具有多个输入的图层,请替换X
具有X1,…,XN
哪里N
是输入的数量努明普茨
属性必须匹配N
.
对于具有多个输出的图层,请替换Z
具有Z1,…,ZM
哪里M
是输出的数量。这个NumOutputs
属性必须匹配M
.
对于具有多个状态参数的图层,请替换状态
具有state1,…,stateK
哪里K
是状态参数的数目。
提示
如果层的输入数量可能不同,则使用瓦拉金
而不是X1,…,XN
.在这种情况下,瓦拉金
是输入的单元格数组,其中瓦拉金{i}
对应于席
.
如果输出的数量可能不同,则使用瓦拉戈特
而不是Z1,…,ZN
.在这种情况下,瓦拉戈特
是输出的单元格数组,其中varargout{j}
对应于Zj
.
提示
如果自定义图层具有数据链路网络
对象,然后在预测
自定义层的函数,使用预测
功能数据链路网络
. 使用数据链路网络
对象预测
功能确保软件使用正确的层操作进行预测。
因为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分别对应于三维图像的高度、宽度、深度和通道数,以及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)
还输出更新的状态参数状态
哪里层
只有一个状态参数。
[\uuuu,内存]=转发(层,X)
还返回自定义文件的内存值向后的
函数使用前面的任何语法。如果层同时具有自定义向前地
功能与习惯向后的
函数,则前进函数必须返回一个内存值。
可以调整具有多个输入、多个输出或多个状态参数的图层的语法:
对于具有多个输入的图层,请替换X
具有X1,…,XN
哪里N
是输入的数量努明普茨
属性必须匹配N
.
对于具有多个输出的图层,请替换Z
具有Z1,…,ZM
哪里M
是输出的数量。这个NumOutputs
属性必须匹配M
.
对于具有多个状态参数的图层,请替换状态
具有state1,…,stateK
哪里K
是状态参数的数目。
提示
如果层的输入数量可能不同,则使用瓦拉金
而不是X1,…,XN
.在这种情况下,瓦拉金
是输入的单元格数组,其中瓦拉金{i}
对应于席
.
如果输出的数量可能不同,则使用瓦拉戈特
而不是Z1,…,ZN
.在这种情况下,瓦拉戈特
是输出的单元格数组,其中varargout{j}
对应于Zj
.
提示
如果自定义图层具有数据链路网络
对象,然后在向前地
自定义层的函数,使用向前地
委员会的职能数据链路网络
对象使用数据链路网络
对象向前地
功能确保软件使用正确的层操作进行培训。
PReLU操作由以下公式给出:
哪里 是非线性激活的输入F频道上我和 是控制负部分斜率的系数。下标我在里面 表明非线性激活可以在不同通道上变化。
在中执行此操作预测
. 在里面预测
,输入X
对应于x在方程式中,输出Z
对应于
. PReLU层不需要内存或用于训练的其他转发功能,因此您可以删除向前地
函数从类文件中删除。在函数顶部添加注释,解释函数的语法。
提示
如果使用以下函数预分配数组:零
,则必须确保这些数组的数据类型与层函数输入一致“就像”
选择零
. 例如,初始化大小为0的数组深圳
使用与数组相同的数据类型X
使用Z=零(sz,“类似”,X)
.
作用Z=预测(层,X)%Z=预测(层,X)通过%图层并输出结果Z。Z=最大(X,0)+层α。*最小(0,X);终止
因为预测
函数仅使用支持万博1manbetxdlarray
对象,定义向后的
功能是可选的。有关支持的函数的列表万博1manbetxdlarray
对象,请参见支持dlarray的函数列表万博1manbetx.
查看已完成的图层类文件。
classdef预层%示例自定义PReLU层。性质(可学习)%层可学习参数%比例系数阿尔法终止方法作用层=预层(numChannels,args)%layer=preluLayer(numChannels)创建一个PReLU层%使用numChannels频道。%%layer=preluLayer(numChannels,Name=Name)还指定%图层名。论据numChannels args.Name="";终止%设置图层名称。layer.Name=名称;%设置图层描述。图层.说明=“预习”+数字通道+“频道”;%初始化比例系数。层α=兰德([1个数字通道]);终止作用Z=预测(层,X)%Z=预测(层,X)通过%图层并输出结果Z。Z=最大(X,0)+层α。*最小(0,X);终止终止终止
如果层转发功能完全支持万博1manbetxdlarray
对象,则层与GPU兼容。否则,要与GPU兼容,层函数必须支持类型为的输入和返回输出万博1manbetxgpuArray
(并行计算工具箱).
许多MATLAB内置函数支持万博1manbetxgpuArray
(并行计算工具箱)和dlarray
输入参数。用于支持的函数列表万博1manbetxdlarray
对象,请参见支持dlarray的函数列表万博1manbetx。有关在GPU上执行的函数的列表,请参阅在GPU上运行MATLAB函数(并行计算工具箱).要使用GPU进行深度学习,您还必须拥有受支持的GPU设备。有关支持的设备的信息,请参阅万博1manbetxGPU版万博1manbetx本支持(并行计算工具箱).有关在MATLAB中使用GPU的更多信息,请参见MATLAB中的GPU计算(并行计算工具箱).
在本例中,使用了预测
全部支持万博1manbetxdlarray
对象,因此该层与GPU兼容。
检查层
检查自定义图层的图层有效性前奏者
.
自定义图层前奏者
,作为支持文件附于此示例,将PReLU操作应用于输入数据。若要访问此层万博1manbetx,请将此示例作为实时脚本打开。
创建图层的实例,并使用检查层
。将有效输入大小指定为该层典型输入的单个观测值的大小。该层需要4-D阵列输入,其中前三个维度对应于前一层输出的高度、宽度和通道数,第四个维度对应于观测值。
指定观测输入的典型大小并设置观察维度
选项4。
图层=preluLayer(20);validInputSize=[24 24 20];检查图层(图层,validInputSize,ObservationDimension=4)
跳过GPU测试。找不到兼容的GPU设备。跳过代码生成兼容性测试。要检查代码生成层的有效性,请指定“CheckCodegenCompatibility”和“ObservationDimension”选项。不向后运行nnet.checklayer.TestLayer。。。。。。。。完成nnet.checklayer.TestLayerWithoutBackward测试摘要:18通过,0失败,0不完整,10跳过。所用时间:1.9312秒。
在这里,函数不会检测到层的任何问题。
您可以像使用深度学习工具箱中的任何其他层一样使用自定义层。本节介绍如何使用您先前创建的PReLU层创建和训练数字分类网络。
加载示例训练数据。
[XTrain,YTrain]=数字列车4DRARAYDATA;
创建包含自定义图层的图层阵列前奏者
,作为支持文件附于此示例。要访问此层,请将此示例作为实时脚本打开。万博1manbetx
layers=[imageInputLayer([28 28 1])卷积2dLayer(5,20)批规格化层预层(20)完全连接层(10)softmaxLayer分类层];
设置培训选项并培训网络。
选项=培训选项(“亚当”,MaxEpochs=10);net=列车网络(XTrain、YTrain、图层、选项);
单CPU培训。初始化输入数据规范化。|===================================================================================================================================================================================================================================================================================================================================================================================================================================================历元|迭代|经过的时间|小批量|小批量|基础学习| | | | | |(hh:mm:ss)第二种第二种第二种第二种第二种第二种第二种第二种第二种第四种第四种第四种第四种第二种第二种第二种第二种第第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第二种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种0.0010 | 3 | 100 | 00:00:16 | 85.94%| 0.4878 | 0.0010 | 4 | 150 | 00:00:23 | 88.28%| 0.4068 | 0.0010 | 6 | 200 | 00:00:32 | 96.09%|0.1690 0 0.1690 0 0.1691 0 0.0 0 0 0.1691 0 0 0 0 0 0 0 0 0.1691 0 0 0 0.1690 0 0 0 0.1691 0 0 0 0 0 0 0 0 0.0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.0010 | | |============================================================================================================================================================================================================培训已完成:最大时代完整的。
通过预测新数据和计算精度来评估网络性能。
[XTest,YTest]=digitTest4DArrayData;YPred=classify(net,XTest);精度=mean(YTest==YPred)
精度=0.9178
[1] “深入研究整流器:在ImageNet分类方面超越人类水平的性能。”2015年IEEE计算机视觉国际会议(ICCV), 1026–34. 智利圣地亚哥:IEEE,2015年。https://doi.org/10.1109/ICCV.2015.123.
功能层
|检查层
|setLearnRateFactor
|setL2Factor
|getLearnRateFactor
|getL2Factor
|findPlaceholderLayers
|替换层
|装配网络
|占位符层