主要内容

定义具有多个输入的自定义深度学习层

If深度学习工具箱™ 不提供分类或回归问题所需的图层,则可以使用此示例作为指南定义自己的自定义图层。有关内置图层的列表,请参阅深度学习层列表

要定义自定义深度学习层,可以使用此示例中提供的模板,这将带您完成以下步骤:

  1. 命名层-为层命名,以便在MATLAB中使用®

  2. 声明图层特性-指定图层的特性,包括可学习参数和状态参数。

  3. 创建构造函数(可选)-指定如何构造图层并初始化其属性。如果未指定构造函数,则在创建时,软件将初始化图层的名字,描述类型具有的属性[]并将图层输入和输出的数量设置为1。

  4. 创建前向函数——指定数据在预测时间和训练时间如何通过层(前向传播)。

  5. 创建重置状态功能(可选)-指定如何重置状态参数。

  6. 创建反向函数(可选)-指定损失相对于输入数据和可学习参数的导数(反向传播)。如果未指定向后函数,则向前函数必须支持万博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,WC分别对应图像的高度、宽度和通道数量,和N是观察数。 4.
三维图像 H-借-W-借-D-借-C-借-N哪里H,W,DC分别对应于三维图像的高度、宽度、深度和通道数,以及N是观察数。 5.
向量序列 C-借-N-借-s哪里C是序列的特征数,N是观察次数,以及s为序列长度。 2.
二维图像序列 H-借-W-借-C-借-N-借-s哪里H,WC分别对应于图像的高度、宽度和通道数,N是观察次数,以及s为序列长度。 4.
三维图像序列 H-借-W-借-D-借-C-借-N-借-s哪里H,W,DC分别对应于三维图像的高度、宽度、深度和通道数,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

提示

如果自定义图层具有数据链路网络对象的可学习参数,然后在向前地自定义层的函数,使用向前地委员会的职能数据链路网络对象。使用数据链路网络对象向前地功能确保软件使用正确的层操作进行培训。

加权加法层的正向函数为

F ( X ( 1. ) , , X ( N ) ) = = 1. N W X ( )

在哪里X(1), …,X(n)对应于层输入和W1.、……WN是层权重。

实施前向功能预测。在预测,输出Z对应于 F ( X ( 1. ) , , X ( N ) ) . 加权加法层不需要内存或用于训练的其他正向函数,因此您可以删除向前地类文件中的函数。在函数顶部添加注释,解释函数的语法。

提示

如果您使用诸如的函数预先采用阵列,则必须确保这些数组的数据类型与层函数输入一致“就像”选择。例如,初始化大小为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};终止终止终止终止

GPU兼容性

如果层转发功能完全支持万博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

另见

|||||||||

相关的话题