主要内容

用可学习参数定义自定义深度学习层

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

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

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

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

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

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

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

在前向功能支持时,定义后向功能是可选的金宝appdlarray对象作为输入。使用dlarray通过允许您标记尺寸,对象使高维数据更容易。例如,您可以使用使用的标记对应于空间,时间,频道和批处理尺寸的维度标记“年代”“T”“C”,“B”标签,分别。对于未指定的和其他尺寸,请使用“U”标签。为dlarray通过特定尺寸运行的对象功能,可以通过格式化维度标签来指定维度标签dlarray对象,或使用'datomformat'选项

使用格式化dlarray自定义层中的对象还允许您定义输入和输出具有不同格式的图层,例如置换,添加或删除尺寸的图层。例如,您可以定义一层,该图层以格式为输入的百分比图像“SSCB”(空间、空间、通道、批处理)并输出带有格式的序列的小批处理“认知行为治疗”(通道、批量、时间)。

支持使用格式化金宝appdlarray对象中的自定义层forward函数,也继承自nnet.layer.Formattable在定义自定义层时初始化。例如,请参见定义带有格式化输入的自定义深度学习层

这个例子展示了如何创建PReLU层,这是一个具有可学习参数的层,并在卷积神经网络中使用它。PRELU层执行阈值操作,其中对于每个信道,任何小于零的任何输入值都乘以训练时间的标量。[1]对于小于零的值,PReLU层应用缩放系数 α. 到输入的每个通道。这些系数形成了一种学习参数,该层在训练期间学习。

这图[1]比较ReLU和PReLU层函数。

带有可学习参数模板的图层

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

classdefmyLayer % & net.layer. format(可选)属性%(可选)图层属性。%图层属性到这里。结束属性(可学的)%(可选)层学习参数。%图层可学习的参数在这里。结束方法函数tillay = myLayer()%(可选)创建一个myLayer。%该函数必须与类名相同。%层构造函数在这里。结束函数[Z1,…,Zm]=预测(层,X1,…,Xn)%在预测时间通过层转发输入数据%输出结果。%输入:% layer -要转发的层% X1,…,Xn- Input data%产出:% Z1,…,Z米- Outputs of layer forward function%用于预测的层前向函数在这里。结束函数(Z1,…,Zm评选、内存)=前进(层,X1,…,Xn)%(可选)在训练时通过层转发输入数据%时间并输出结果和一个内存值。%输入:% layer -要转发的层% X1,…,Xn- Input data%产出:% Z1,…,Z米- Outputs of layer forward function% memory -自定义向后传播的内存值%用于训练的图层正向功能在这里。结束函数[dldx1,...,dldxn,dldw1,...,dldwk] =...向后(层,X1,…,Xn Z1,…,Zm评选,dLdZ1,…,dLdZm,内存)%(可选)反向传播损失的导数%函数通过层。%输入:%图层-图层向后传播通过% X1,…,Xn- Input data% Z1,…,Z米- Outputs of layer forward function% dLdZ1,…,dLdZm - Gradients propagated from the next layers% memory - forward函数的内存值%产出:%dldx1,...,dldxn  - 关于损失的衍生物%输入% dLdW1,…,dLdWk - Derivatives of the loss with respect to each%可学的参数%图层向后函数在这里。结束结束结束

层的名字

首先,给图层命名。在类文件的第一行中,替换现有的名称迈莱尔preluLayer

classdefpreluLayer < nnet.layer.Layer...结束

接下来,重命名迈莱尔函数中的第一个函数方法Section),以便它与图层具有相同的名称。

方法函数层=预层()。。。结束...结束

保存图层

将层类文件保存在一个名为preluLayer.m.文件名必须与层名匹配。要使用该层,必须将文件保存在当前文件夹或MATLAB路径上的文件夹中。

声明属性和可学习参数

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

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

财产 描述
的名字 层名,指定为字符向量或字符串标量。若要在层图中包含层,必须指定非空的唯一层名。如果你用层和的名字被设定为'',然后软件在训练时自动为该层分配一个名称。
描述

层的一行描述,指定为字符向量或字符串标量。该描述出现在层显示在数组中。如果不指定层描述,则软件将显示层类名称。

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

如果该层没有其他属性,则可以省略属性部分。

提示

如果你正在创建一个有多个输入的图层,那么你必须设置numinputs.InputNames属性在层构造函数中。如果你正在创建一个有多个输出的图层,那么你必须设置NumOutputs输出名称属性在层构造函数中。例如,请参见定义自定义深度学习层与多个输入

PReLU层不需要任何额外的属性,所以您可以删除属性部分。

ProLu层只有一个学习参数,缩放系数一个.属性中声明这个可学习参数属性(可学习)分段并调用参数Α

属性(可学的)%层可学习的参数%比例系数Α结束

创建构造函数

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

PReLU层构造函数需要两个输入参数:预期输入数据的通道数量和层名。通道的数量指定了可学习参数的大小Α.指定两个命名的输入参数NumChannels.的名字在里面preluLayer函数。在函数的顶部添加注释,解释函数的语法。

函数层=预层(numChannels,名称)% layer = preluLayer(numChannels)创建一个PReLU层% numChannels通道并指定层名。...结束

初始化层属性

初始化层属性,包括构造函数中的可学习参数。取代的评论%层构造函数在这里使用初始化图层属性的代码。

设置的名字属性设置为输入参数的名字

%设置图层名称。层。的名字=的名字;

给层一个单行描述通过设置描述层的属性。设置描述以描述图层的类型及其大小。

%设置图层描述。层。描述=“PReLU与“+ numChannels +“通道”

对于PReLU层,当输入值为负时,该层将输入的每个通道乘以对应的通道Α.初始化可学习参数Α是一个大小为1 × 1 × -的随机向量NumChannels..第三个维度指定为尺寸NumChannels.,层可以使用前向函数中输入的元素乘。Α是图层对象的属性,所以你必须将矢量赋给tillay.alpha.

%初始化缩放系数。tillay.Alpha = Rand([1 1 NumChannels]);

查看已完成的构造函数。

函数层=预层(numChannels,名称)% layer = preluLayer(numChannels, name)创建一个PReLU层用NumChannels通道输入的2-D图像输入和指定%层名。%设置图层名称。层。的名字=的名字;%设置图层描述。层。描述=“PReLU与“+ numChannels +“通道”%初始化缩放系数。tillay.Alpha = Rand([1 1 NumChannels]);结束

使用这个构造函数,命令preluLayer(“prelu”)创建一个带有三个通道和名称的PReLU层“prelu”

创建向前函数

创建用于预测时间和训练时间的层前向函数。

创建一个名为预测将数据向前传播到预测的时间并输出结果。

的语法预测(Z1,…,Zm评选)=预测(层,X1,…,Xn), 在哪里X1,…,Xnn层输入和Z1,…,Zm评选层输出。的值n必须对应于numinputs.NumOutputs层的属性。

提示

如果输入的数量预测可以变化,然后使用变长度输入宗量而不是X1,…,Xn. 在这种情况下,,变长度输入宗量输入的单元格数组在哪里varargin {i}对应于xi..如果输出的数量可以变化,则使用varargout而不是Z1,…,Zm评选. 在这种情况下,,varargout是输出的单元阵列,其中varargout {j}对应于ZJ.

提示

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

因为ProLu层只有一个输入和一个输出,所以语法预测对于PReLU层是Z =预测(层,X)

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

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

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

对于输出序列的层,层可以输出任意长度的序列或输出没有时间维度的数据。请注意,在训练使用trainNetwork函数时,输入序列和输出序列的长度必须匹配。

向前函数将数据向前传播到层培训时间并输出内存值。

的语法向前(Z1,…,Zm评选、内存)=前进(层,X1,…,Xn), 在哪里X1,…,Xnn层的输入,Z1,…,Zm评选层的输出,内存是记忆层。

提示

如果输入的数量向前可以变化,然后使用变长度输入宗量而不是X1,…,Xn. 在这种情况下,,变长度输入宗量输入的单元格数组在哪里varargin {i}对应于xi..如果输出的数量可以变化,则使用varargout而不是Z1,…,Zm评选. 在这种情况下,,varargout是输出的单元阵列,其中varargout {j}对应于ZJ.j= 1,…,NumOutputsvarargout {NumOutputs + 1}对应于内存

提示

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

PReLU运算由

f x x 如果 x > 0 α. x 如果 x 0

在哪里 x 是非线性激活的输入吗f频道, α. 是控制负部分斜率的系数。下标 α. 表示非线性激活可以在不同的通道上变化。

在中执行此操作预测.在预测,输入X对应于x在等式中。输出Z对应于 f x .PReLU层不需要记忆或不同的前向功能来训练,所以你可以删除向前来自类文件的函数。在函数的顶部添加注释,该函数解释了函数的语法。

提示

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

函数Z =预测(层,X)% Z = predict(layer, X)将输入数据X通过%层并输出结果Z。Z = max(X,0) +图层。α。*分钟(0,X);结束

因为这预测函数只使用支持的函数金宝appdlarray对象,定义落后的函数是可选的。获取支持的函数列表金宝appdlarray对象,请参见Dlarray支持的函数列表金宝app

完成一层

查看已完成的层类文件。

classdefpreluLayer < nnet.layer.Layer%示例自定义PReLU层。属性(可学的)%层可学习的参数%比例系数Α结束方法函数层=预层(numChannels,名称)% layer = preluLayer(numChannels, name)创建一个PReLU层用NumChannels通道输入的2-D图像输入和指定%层名。%设置图层名称。层。的名字=的名字;%设置图层描述。层。描述=“PReLU与“+ numChannels +“通道”%初始化缩放系数。tillay.Alpha = Rand([1 1 NumChannels]);结束函数Z =预测(层,X)% Z = predict(layer, X)将输入数据X通过%层并输出结果Z。Z = max(X,0) +图层。α。*分钟(0,X);结束结束结束

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兼容。

使用以下命令检查层的有效性checkLayer

检查自定义层的层有效性preluLayer

定义一个自定义PReLU层。要创建这个图层,保存文件preluLayer.m在当前文件夹中。

创建该层的实例并使用checkLayer.将有效输入大小指定为对层的典型输入的单个观察的大小。该层需要4-D阵列输入,其中前三个维度对应于前一层输出的高度、宽度和通道数量,第四个维度对应于观测值。

指定观察和集合的输入的典型大小“ObservationDimension”4。

层= preluLayer (20,“prelu”);validInputSize = [24 24 20];validInputSize checkLayer(层,“ObservationDimension”4)
跳过GPU测试。找不到兼容的GPU设备。跳过代码生成兼容性测试。要检查代码生成层的有效性,请指定“CheckCodegenCompatibility”和“ObservationDimension”选项。正在运行nnet.checklayer.TestLayerWithoutBackward。。。完成nnet.checklayer.TestLayerWithoutBackward测试摘要:13通过,0失败,0不完整,9跳过。所用时间:0.18046秒。

在这里,函数没有检测到层的任何问题。

在网络中包含自定义层

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

加载示例培训数据。

[XTrain, YTrain] = digitTrain4DArrayData;

定义一个自定义PReLU层。要创建这个图层,保存文件preluLayer.m在当前文件夹中。创建包含自定义层的层阵列preluLayer

图层= [imageInputlayer([28 28 1])卷积2dlayer(5,20)BatchnormalizationLayer prelulayer(20,“prelu”) fulllyconnectedlayer (10) softmaxLayer classificationLayer;

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

选择= trainingOptions (“亚当”“MaxEpochs”,10);net = trainnetwork(xtrain,ytrain,图层,选项);
单CPU训练。初始化输入数据规范化。|========================================================================================| | 时代| |迭代时间| Mini-batch | Mini-batch |基地学习  | | | | ( hh: mm: ss) | | |丧失准确性  | |========================================================================================| | 1 | 1 |就是| | 3.0526 | 0.0010 10.94%||2|50| 00:00:07 | 71.88% | 0.8378 | 0.0010 | | 3 | 100 | 00:00:15 | 85.94% | 0.4878 | 0.0010 | | 4 | 150 | 00:00:23 | 88.28% | 0.4069 | 0.0010 | | 6 | 200 | 00:00:30 | 96.09% | 0.1691 | 0.0010 | | 7 | 250 | 00:00:38 | 96.88% | 0.1372 | 0.0010 | | 8 | 300 | 00:00:46 | 99.22% | 0.0745 | 0.0010 | | 9 | 350 | 00:00:54 | 99.22% | 0.0593 | 0.0010 | | 10 | 390 | 00:01:00 | 100.00% | 0.0465 | 0.0010 | |========================================================================================|

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

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

工具书类

[1] "深入研究整流器:在图像网分类上超越人类水平的表现"2015年IEEE计算机愿景国际会议(ICCV)1026 - 34。智利圣地亚哥:IEEE, 2015。https://doi.org/10.1109/ICCV.2015.123。

另请参阅

|

相关的话题