主要内容

指定自定义图层后退功能

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

榜样使用可学习参数定义自定义深度学习层演示如何创建一个自定义PreLU层,并通过以下步骤:

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

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

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

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

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

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

如果forward函数只使用支持的函数万博1manbetxdlarray对象,则创建向后函数是可选的。在这种情况下,软件使用自动微分来自动确定衍生品。获取支持的函数列表万博1manbetxdlarray对象,看到支持dlarray的函数列表万博1manbetx.如果你想使用不支持的函数万博1manbetxdlarray对象,或者希望对向后函数使用特定的算法,则可以使用此示例作为指南定义自定义向后函数。

创建自定义层

榜样使用可学习参数定义自定义深度学习层显示如何创建预渲染层。PReLU层执行阈值操作,其中对于每个通道,任何小于零的输入值都乘以在训练时学习的标量。[1]对于小于零的值,预编程层应用缩放系数 α 每个输入通道。这些系数形成了一个可学习的参数,该参数在训练过程中被层学习。

PReLU运算由

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

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

查看示例中创建的图层使用可学习参数定义自定义深度学习层.这一层没有向后的函数。

classdef预层%示例自定义PReLU层。性质(可学的)%层可学习参数%比例系数阿尔法结束方法作用层= preluLayer (numChannels, args)% layer = preluLayer(numChannels)创建一个PReLU层%与numChannels通道。%layer=preluLayer(numChannels,Name=Name)还指定%层的名字。参数numChannels args.Name=""结束%设置图层名称。layer.Name=名称;%设置图层描述。图层.说明=“PReLU与“+数字通道+“频道”%初始化缩放系数。层。阿尔法=rand([1 1 numChannels]);结束作用Z=预测(层,X)% Z = predict(layer, X)将输入数据X通过%图层并输出结果Z。Z=最大(X,0)+层α。*最小(0,X);结束结束结束

请注意

如果该层有自定义的向后函数,那么您仍然可以继承nnet.layer.Formattable

创建向后函数

实现向后的函数,返回损失相对于输入数据和可学习参数的导数。

向后的函数语法取决于层的类型。

  • dLdX =向后(层,X, Z, dLdZ,内存)返回衍生品dLdX相对于层输入的损耗,其中具有单个输入和单个输出。Z对应于正向功能输出和dLdZ对应于与以下各项有关的损失的导数:Z.函数的输入记忆力对应于前进功能的存储器输出。

  • [dLdX,dLdW]=向后(层,X,Z,dLdZ,内存)也返回导数dLdW相对于可学习参数的损失,其中只有一个可学习的参数。

  • [dLdX, dLdSin] =向后(层,X, Z, dLdZ dLdSout,内存)也返回导数dLdSin与使用任何前面语法的状态输入相关的损失有一个状态参数和dLdSout对应于损耗相对于层状态输出的导数。

  • [dLdX, dLdW dLdSin] =向后(层,X, Z, dLdZ dLdSout,内存)也返回导数dLdW关于可学习参数的损失,并返回导数dLdSin与使用任何前面语法的层状态输入相关的损失,其中具有单个状态参数和单个可学习参数。

您可以调整具有多个输入、多个输出、多个可学习参数或多个状态参数的层的语法:

  • 对于具有多个输入的图层,请替换XdLdXX1,…,XNdLdX1,…,dLdXN,分别在哪里N是输入的数量。

  • 对于具有多个输出的图层,请替换ZdLdZZ1,…,ZMdLdZ1,…,dLdZM,分别在哪里为输出数。

  • 对于具有多个可学习参数的图层,请替换dLdWdLdW1,…,dLdWP,在那里P是可学习参数的数目。

  • 对于具有多个状态参数的图层,请替换dLdSindLdSoutdLdSin1,…,dLdSinKdLdSout1,…,dLdSoutK,分别在哪里K是状态参数的个数。

要通过防止在向前和向后传递之间保存未使用的变量来减少内存使用,请将相应的输入参数替换为

提示

如果输入的数量向后的可以变化,然后使用瓦拉金而不是后面的输入参数.在这种情况下,瓦拉金一个单元格数组的输入,第一个在哪里N元素对应于N层输入,下一个元素对应于层输出,下一个元素对应于损耗对的导数层输出,下一个K元素对应于K损失对的导数K状态输出,最后一个元素对应于记忆力

如果输出的数量可以变化,则使用瓦拉戈特而不是输出参数。在本例中,瓦拉戈特是一个单元格数组的输出,哪里是第一个N元素对应于N损失对的导数N层输入,下一个P元素对应于损耗对的导数P可学习参数,然后K元素对应于损耗对的导数K国家投入。

请注意

dlnetwork对象不支持需要自定义向后函数中万博1manbetx的内存值的自定义层。控件中使用带有自定义向后函数的自定义层dlnetwork对象记忆力输入的向后的函数定义必须是

因为PReLU层只有一个输入,一个输出,一个可学习的参数,不需要层前向函数的输出或内存值,语法向后的对于PReLU层是[dLdX, dLdAlpha] =向后(层,X, ~, dLdZ, ~).产品的尺寸X与前进功能中的相同。的尺寸dLdZ是否与输出的尺寸相同Z正向函数。的维度和数据类型dLdX与的维度和数据类型相同吗X.的维度和数据类型dLdAlpha与可学习参数的维度和数据类型相同阿尔法

在反向传递过程中,该层使用相应的导数自动更新可学习参数。

为了在网络中包含自定义层,层转发函数必须接受前一层的输出,并按照下一层所期望的大小转发传播数组。同样的,当向后的是指定的,向后的函数必须接受与正向函数的相应输出大小相同的输入,并向后传播大小相同的导数。

损失对输入数据的导数为

l x l f x f x x

哪里 l / f x 梯度是否从下一层传播,激活的导数是

f x x 1 如果 x 0 α 如果x < 0

损失对可学习参数的导数为

l α j l f x j f x j α

哪里索引通道,j索引元素的高度、宽度和观察值,激活的梯度为

f x α 0 如果 x 0 x 如果 x < 0

创建返回这些导数的向后函数。

作用[dLdX, dLdAlpha] =向后(layer, X, ~, dLdZ, ~)% [dLdX, dLdAlpha] =向后(layer, X, ~, dLdZ, ~)%向后传播损失函数的导数%穿过这层。%的输入:%层-要向后传播的层%X-输入数据% dLdZ -梯度从更深的层传播%输出:%dLdX-损失相对于%输入数据%dLdAlpha-损失与%可学习参数αdLdX=layer.Alpha.*dLdZ;dLdX(X>0)=dLdZ(X>0);dLdAlpha=min(0,X)。*dLdZ;dLdAlpha=sum(dLdAlpha,[12]);汇总所有的观察在小批。dLdAlpha = (dLdAlpha, 4)之和;结束

完整的层

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

classdef预层%示例自定义PReLU层。性质(可学的)%层可学习参数%比例系数阿尔法结束方法作用层= preluLayer (numChannels, args)% layer = preluLayer(numChannels)创建一个PReLU层%与numChannels通道。%layer=preluLayer(numChannels,Name=Name)还指定%层的名字。参数numChannels args.Name=""结束%设置图层名称。layer.Name=名称;%设置图层描述。图层.说明=“PReLU与“+数字通道+“频道”%初始化缩放系数。层。阿尔法=rand([1 1 numChannels]);结束作用Z=预测(层,X)% Z = predict(layer, X)将输入数据X通过%图层并输出结果Z。Z=最大(X,0)+层α。*最小(0,X);结束作用[dLdX, dLdAlpha] =向后(layer, X, ~, dLdZ, ~)% [dLdX, dLdAlpha] =向后(layer, X, ~, dLdZ, ~)%向后传播损失函数的导数%穿过这层。%的输入:%层-要向后传播的层%X-输入数据% dLdZ -梯度从更深的层传播%输出:%dLdX-损失相对于%输入数据%dLdAlpha-损失与%可学习参数αdLdX=layer.Alpha.*dLdZ;dLdX(X>0)=dLdZ(X>0);dLdAlpha=min(0,X)。*dLdZ;dLdAlpha=sum(dLdAlpha,[12]);汇总所有的观察在小批。dLdAlpha = (dLdAlpha, 4)之和;结束结束结束

GPU的兼容性

如果层转发功能完全支持万博1manbetxdlarray对象,则该层是GPU兼容的。否则,为了与GPU兼容,层函数必须支持输入和返回输出类型万博1manbetxgpuArray(并行计算工具箱)

许多MATLAB内置函数支持万博1manbetxgpuArray(并行计算工具箱)dlarray输入参数。获取支持的函数列表万博1manbetxdlarray对象,看到支持dlarray的函数列表万博1manbetx.有关在GPU上执行的函数列表,请参见在GPU上运行MATLAB函数(并行计算工具箱)要使用GPU进行深度学习,您还必须有支持的GPU设备。万博1manbetx有关支持的设备的信息,请参见万博1manbetxGPU支万博1manbetx持情况(并行计算工具箱)有关在MATLAB中使用GPU的更多信息,请参见MATLAB中的GPU计算(并行计算工具箱)

参考文献

[1] “深入研究整流器:在ImageNet分类方面超越人类水平的性能。”2015 IEEE计算机视觉国际会议(ICCV)1026 - 34。智利圣地亚哥:IEEE, 2015。https://doi.org/10.1109/ICCV.2015.123。

另请参阅

|||||||||

相关话题