主要内容

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

如果Deep Learning Toolbox™没有为您的分类或回归问题提供所需的层,那么您可以使用此示例作为指南定义自己的自定义层。有关内置层的列表,请参见深度学习层名单

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

  1. 名称图层 - 为图层提供一个名称,以便您可以在MATLAB中使用它®

  2. 声明图层属性 - 指定图层的属性以及在培训期间了解的参数。

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

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

  5. 创建一个反向函数(可选)-指定损失对输入数据和可学习参数的导数(反向传播)。如果不指定向后函数,则必须支持前向函数金宝appdlarray.对象。

这个例子展示了如何创建一个加权加法层,它是一个具有多个输入和可学习参数的层,并在卷积神经网络中使用它。加权加法层缩放并从多个神经网络层元素中添加输入。

与学习参数模板的图层

将图层用学习参数模板复制到MATLAB中的新文件中。此模板概述了具有可知参数的图层的结构,并包括定义图层行为的函数。

Classdef.myLayer % & nnet.layer.Formattable(可选)特性%(可选)层属性。%图层属性到这里。结束特性(可学的)%(可选)层学习参数。%图层可学习参数在此处进行。结束方法功能tillay = myLayer()%(可选)创建一个MyLayer。%此函数必须与类具有相同的名称。%图层构造函数进入此处。结束功能[z1,...,zm] =预测(图层,x1,...,xn)%在预测时通过层转发输入数据%输出结果。%输入:% layer -转发通过的层%x1,...,xn  - 输入数据%产出:%z1,...,zm  - 图层前进函数的输出预测的层前向函数在这里。结束功能[z1,...,zm,memory] ​​=前进(图层,x1,...,xn)%(可选)通过training层转发输入数据%时间并输出结果和一个内存值。%输入:% layer -转发通过的层%x1,...,xn  - 输入数据%产出:%z1,...,zm  - 图层前进函数的输出%内存 - 自定义后向传播的内存值% Layer forward function for training到这里。结束功能[dldx1,...,dldxn,dldw1,...,dldwk] =......向后(层,X1,...,XN,Z1,...,ZM,DLDZ1,...,DLDZM,内存)%(可选)向后传播损耗的衍生物%通过图层函数。%输入:%层 - 层向后传播通过%x1,...,xn  - 输入数据%z1,...,zm  - 图层前进函数的输出%dldz1,...,dldzm  - 从下一个图层传播的渐变%内存 - 来自前向功能的内存值%产出:%dldx1,...,dldxn  - 关于损失的衍生物%输入%dldw1,...,dldwk  - 每个损失的衍生物%学习参数%层后向功能进入此处。结束结束结束

说出该图层

首先,给出一个名字。在课程文件的第一行,替换现有名称MyLayer.weightedAdditionLayer

Classdef.preceedadditionlayer ......结束

接下来,重命名MyLayer.构造函数(第一个功能方法部分)使其与图层具有相同的名称。

方法功能layer = weightedAdditionLayer()…结束......结束

保存图层

将层类文件保存到一个名为加权地区列达尔.M..文件名必须与图层名称匹配。要使用该图层,必须将文件保存在当前文件夹中或MATLAB路径上的文件夹中。

声明属性和学习参数

声明图层属性特性部分并通过列出它们来宣告学习参数属性(学习)部分。

默认情况下,自定义中间图层具有这些属性。

财产 描述
名称 图层名称,指定为字符向量或字符串标量。要在图层图中包含一个图层,必须指定非空,唯一的图层名称。如果您使用该图层培训系列网络名称设定为'',然后软件会自动为培训时间分配给图层的名称。
描述

层的单行描述,指定为字符向量或字符串标量。当图层以a中显示时,会出现此说明数组中。如果不指定层描述,则软件显示层类名。

类型 图层的类型,指定为字符向量或字符串标量。的价值类型当层显示在数组中。如果你没有指定层类型,软件就会显示层类名。
numinputs. 图层的输入数,指定为正整数。如果未指定此值,则软件会自动设置numinputs.到了名称的数量输入名称.默认值为1。
输入名称 输入层的名称,指定为字符向量的单元数组。如果没有指定此值,则numinputs.大于1,然后软件自动设置输入名称{'In1',...,'Inn'}, 在哪里N等于numinputs..默认值为{'在'}
NumOutputs 图层的输出数,指定为正整数。如果未指定此值,则软件会自动设置NumOutputs到了名称的数量输出名称.默认值为1。
输出名称 层的输出名称,指定为字符向量的单元数组。如果没有指定此值,则NumOutputs大于1,然后软件自动设置输出名称{着干活,…,“outM”}, 在哪里等于NumOutputs.默认值为{'出去'}

如果图层没有其他属性,那么您可以省略特性部分。

提示

如果要创建具有多个输入的图层,那么您必须设置numinputs.或者输入名称层构造函数中的属性。如果要创建具有多个输出的图层,则必须设置NumOutputs或者输出名称层构造函数中的属性。

加权加法层不需要任何其他属性,因此您可以删除特性部分。

加权附加层只有一个学习参数,权重。在此中声明此被动参数属性(学习)部分并致电参数权重

特性(可学的)%层学习参数%缩放系数权重结束

创建构造函数

创建构建图层并初始化图层属性的函数。指定将图层创建为构造函数的输入所需的任何变量。

加权加法层构造函数需要两个输入:该层的输入数和层名。该层的输入数量指定了可学习参数的大小权重.指定名为的两个输入参数numinputs.名称在里面weightedAdditionLayer功能。在函数顶部添加注释,该函数解释了函数的语法。

功能tillay = preceedadditionlayer(numinputs,name)%layer = preceedadditionlayer(numinputs,name)创建一个%加权加法层并指定输入的数量%和图层名称。......结束

初始化图层属性

在构造函数中初始化图层属性,包括可知参数。替换评论%层构造函数进入此处使用初始化图层属性的代码。

设定numinputs.输入参数的属性numinputs.

%设置输入数。layer.numinputs = numinputs;

设定名称输入参数的属性名称

%设置图层名称。layer.name = name;

通过设置来提供单线描述描述层的财产。设置描述以描述图层的类型及其大小。

%设置图层描述。layer.description =.“加权添加”+ NumInputs +......“输入”

加权加法层将每个层乘以相应的系数输入的每个层权重并将产生的值添加在一起。初始化被动参数权重是一个大小的随机向量1-by-numinputs.权重是层对象的属性,所以必须将向量赋值给tills.weight.

%初始化层权重tillay.weights = rand(1,NumInputs);

查看已完成的构造函数。

功能tillay = preceedadditionlayer(numinputs,name)%layer = preceedadditionlayer(numinputs,name)创建一个%加权加法层并指定输入的数量%和图层名称。%设置输入数。layer.numinputs = numinputs;%设置图层名称。layer.name = name;%设置图层描述。layer.description =.“加权添加”+ NumInputs +......“输入”%初始化层权重。tillay.weights = rand(1,NumInputs);结束

使用此构造函数,命令“添加”weightedAdditionLayer (3)创建具有三个输入和名称的加权附加层'添加'

创建前向功能

创建在预测时间和培训时间以使用的层前进函数。

创建一个名为预测这将数据传播通过图层预测时间并输出结果。

语法预测(Z1,…,Zm评选)=预测(层,X1,…,Xn), 在哪里x1,...,xnn层输入和z1,...,zm层输出。的值n必须符合numinputs.NumOutputs层的属性。

提示

如果输入数为预测可以变化,然后使用varargin.而不是x1,...,xn.在这种情况下,varargin.是输入的单元格数组,其中varargin {i}对应于xi..如果输出的数量可以变化,那么使用varargout.而不是z1,...,zm.在这种情况下,varargout.是输出的单元阵列,其中varargout {j}对应于ZJ.

提示

如果自定义层有dlnetwork.用于学习参数的对象,然后在其中预测自定义层的功能,使用预测函数为dlnetwork..使用dlnetwork.对象预测功能可确保软件使用正确的图层操作进行预测。

因为加权附加层只有一个输出和变量的输入,所以语法预测对于加权附加层是z =预测(图层,varargin), 在哪里varargin {i}对应于xi.对于正整数小于或等于numinputs.

默认情况下,图层使用预测作为训练时的前向函数。若要在训练时使用不同的前向函数,或保留后向函数所需的值,还必须创建名为向前

输入的维度取决于数据类型和连接层的输出:

层输入 输入大小 观察维度
2-D图像 h-经过-w-经过-c-经过-N, 在哪里hw, 和c对应于图像的高度,宽度和数量,以及N是观察人数。 4
3-D图像 h-经过-w-经过-d-经过-c-经过-N, 在哪里hwd, 和c对应于3-D图像的高度,宽度,深度和数量,以及N是观察人数。 5
矢量序列 c-经过-N-经过-年代, 在哪里c为序列的特征个数,N是观察人数,和年代是序列长度。 2
二维图像序列 h-经过-w-经过-c-经过-N-经过-年代, 在哪里hw, 和c对应于图像的频道的高度,宽度和数量,N是观察人数,和年代是序列长度。 4
三维图像序列 h-经过-w-经过-d-经过-c-经过-N-经过-年代, 在哪里hwd, 和c对应于3-D图像的高度,宽度,深度和数量,N是观察人数,和年代是序列长度。 5

对于输出序列的层,图层可以输出任何长度或输出数据的序列,没有时间尺寸。请注意,培训使用使用该序列输出序列的网络时Trainnetwork.功能,输入和输出序列的长度必须匹配。

向前函数通过图层向前传播数据训练时间并输出内存值。

语法向前[z1,...,zm,memory] ​​=前进(图层,x1,...,xn), 在哪里x1,...,xnn层输入,z1,...,zm图层输出,和记忆是图层的记忆。

提示

如果输入数为向前可以变化,然后使用varargin.而不是x1,...,xn.在这种情况下,varargin.是输入的单元格数组,其中varargin {i}对应于xi..如果输出的数量可以变化,那么使用varargout.而不是z1,...,zm.在这种情况下,varargout.是输出的单元阵列,其中varargout {j}对应于ZJ.j= 1,......,NumOutputsvarargout {numoutputs + 1}对应于记忆

提示

如果自定义层有dlnetwork.用于学习参数的对象,然后在其中向前自定义层的功能,使用向前的函数dlnetwork.目的。使用dlnetwork.对象向前功能可确保软件使用正确的图层操作进行培训。

加权加法层的前向函数为

f X 1 ... X n σ. 1 n W X

在哪里X(1),......,X(n)对应于图层输入和W1,......,Wn是层重量。

实施前向功能预测.在预测,输出Z对应于 f X 1 ... X n .加权加法层不需要记忆或不同的前向函数进行训练,因此可以删除向前来自类文件的函数。在函数的顶部添加注释,该函数解释了函数的语法。

提示

如果您使用诸如的函数预先采用阵列0然后,您必须确保这些阵列的数据类型与图层函数输入一致。要创建与另一个数组相同数据类型的零数组,请使用'喜欢'选择0.例如,初始化大小的零数组SZ.与数组相同的数据类型X, 用z = zeros(sz,'喜欢',x)

功能z =预测(图层,varargin)%z =预测(图层,x1,...,xn)向前转发输入数据x1,%......,Xn通过层并输出结果Z.x = varargin;w = tacle.weights;%初始化输出x1 = x {1};sz = size(x1);z = zeros(sz,'喜欢',x1);%加权补充i = 1:layer.numinputs z = z + w(i)* x {i};结束结束

因为这预测函数仅使用支持的功能金宝appdlarray.对象,定义落后功能是可选的。有关支持的功能列表金宝appdlarray.对象,参见Dlarray支持的函数列表金宝app

已完成的图层

查看已完成的图层类文件。

Classdef.preceedadditionlayer %示例自定义加权加法层。特性(可学的)%层学习参数%缩放系数权重结束方法功能tillay = preceedadditionlayer(numinputs,name)%layer = preceedadditionlayer(numinputs,name)创建一个%加权加法层并指定输入的数量%和图层名称。%设置输入数。layer.numinputs = numinputs;%设置图层名称。layer.name = name;%设置图层描述。layer.description =.“加权添加”+ NumInputs +......“输入”%初始化层权重。tillay.weights = rand(1,NumInputs);结束功能z =预测(图层,varargin)%z =预测(图层,x1,...,xn)向前转发输入数据x1,%......,Xn通过层并输出结果Z.x = varargin;w = tacle.weights;%初始化输出x1 = x {1};sz = size(x1);z = zeros(sz,'喜欢',x1);%加权补充i = 1:layer.numinputs z = 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

定义自定义加权附加层。要创建此图层,请保存文件加权地区列达尔.M.在当前文件夹中。

创建一个层的实例,并检查其有效性使用核对层.将有效输入大小指定为每个输入到图层的单个观察的典型大小。该层预期了4-D阵列输入,其中前三个尺寸对应于先前层输出的高度,宽度和通道的通道数,并且第四维度对应于观察。

指定观察和集合输入的典型大小'观察树'4。

tillay = preceedadditionlayer(2,'添加');validInputsize = {[24 24 20],[24 24 20]};CheckLayer(图层,validInputSize,'观察树'4)
运行nnet.checklayer.testlayerwithoutboutward .......... done nnet.checklayer.testlayerwithoutbackward __________测试摘要:17通过,0失败,0不完整,0跳过。经过时间:0.55735秒。

在这里,函数不会检测到该层的任何问题。

在网络中使用自定义加权附加层

您可以使用与Deep Learning Toolbox中的任何其他图层相同的自定义图层。本节介绍如何使用先前创建的加权附加层创建和培训用于数字分类的网络。

加载示例培训数据。

[xtrain,ytrain] = DigitTrain4darraydata;

定义自定义加权附加层。要创建此图层,请保存文件加权地区列达尔.M.在当前文件夹中。

创建包括自定义层的图层图weightedAdditionLayer

图层= [imageInputLayer([28 28 1],“名字”'在')卷积2dlayer(5,20,“名字”'conv1') reluLayer (“名字”'relu1')卷积2dlayer(3,20,'填充',1,“名字”'conv2') reluLayer (“名字”'relu2')卷积2dlayer(3,20,'填充',1,“名字”'conv3') reluLayer (“名字”'relu3')掌控度(2,'添加')全连接层(10,“名字”'fc')softmaxlayer(“名字”'softmax'scassificationlayer(“名字”'ClassOutput')];Lgraph = LayerGraph(层);Lgraph = ConnectLayers(LAPHAGE,'relu1''添加/ in2');

设置培训选项并培训网络。

选项=培训选项('亚当''maxepochs',10);net = trainnetwork(xtrain,ytrain,3.选项);
单CPU培训。初始化输入数据归一化。| ========================================================================================|时代|迭代|经过时间的时间迷你批量|迷你批量|基础学习| | | | (hh:mm:ss) | Accuracy | Loss | Rate | |========================================================================================| | 1 | 1 | 00:00:01 | 12.50% | 2.2951 | 0.0010 | | 2 | 50 | 00:00:18 | 72.66% | 0.7881 | 0.0010 | | 3 | 100 | 00:00:40 | 89.84% | 0.3005 | 0.0010 | | 4 | 150 | 00:01:01 | 94.53% | 0.1531 | 0.0010 | | 6 | 200 | 00:01:16 | 99.22% | 0.0376 | 0.0010 | | 7 | 250 | 00:01:29 | 99.22% | 0.0315 | 0.0010 | | 8 | 300 | 00:01:43 | 100.00% | 0.0081 | 0.0010 | | 9 | 350 | 00:01:58 | 99.22% | 0.0309 | 0.0010 | | 10 | 390 | 00:02:07 | 99.22% | 0.0376 | 0.0010 | |========================================================================================|

查看加权加法层学习到的权值。

net.Layers .Weights (8)
ans =.1x2单行矢量1.0230 1.0003

通过对新数据的预测和计算精度来评估网络性能。

[XTest,欧美]= digitTest4DArrayData;YPred =分类(净,XTest);精度=(欧美= = YPred) /元素个数之和(欧美)
精度= 0.9860.

另请参阅

||

相关话题