如果Deep Learning Toolbox™没有提供分类或回归问题所需的层,则可以定义自己的自定义层。有关内置层的列表,请参见深度学习层名单.
这个例子使用可学习参数定义自定义深度学习层显示如何创建自定义proLu层并通过以下步骤:
给图层命名——给图层命名,这样你就可以在MATLAB中使用它®.
声明图层属性——指定图层的属性以及在训练过程中学习到的参数。
创建构造函数(可选) - 指定如何构建图层并初始化其属性。如果未指定构造函数,则在创建时,软件初始化名称
那描述
,类型
属性[]
并设置层输入和输出的数量为1。
创建前向功能 - 指定数据如何通过预测时间和培训时间通过层(正向传播)来转发。
创建反向函数(可选) - 指定关于输入数据和学习参数的丢失的导数(向后传播)。如果未指定向后函数,则前向功能必须支持金宝appdlarray
对象。
如果转发函数只使用支持的函数金宝appdlarray
对象,然后创建一个反向函数是可选的。在这种情况下,软件使用自动微分自动确定导数。获取支持的函数列表金宝appdlarray
对象,参见支持dlarray的函数列表金宝app.如果要使用不支持的功能金宝appdlarray
对象,或者想要使用特定算法的后退功能,然后您可以使用此示例定义自定义后向功能作为指南。
这个例子使用可学习参数定义自定义深度学习层显示如何创建proLu层。PReLU层执行阈值操作,对于每个通道,任何小于零的输入值都乘以在训练时学到的标量。[1]对于小于零的值,PRELU层应用缩放系数 到输入的每个通道。这些系数构成一个可学习的参数,该层在训练过程中进行学习。
PReLU操作由
在哪里 非线性激活的输入是什么F在频道上一世, 是控制负极部分的斜率的系数。下标一世在 表明非线性激活可以在不同的通道上变化。
查看示例中创建的图层使用可学习参数定义自定义深度学习层.这一层没有落后的
功能。
Classdef.prelulayer%例子自定义proLu层。特性(学习)%层可学习参数%缩放系数α结尾方法函数第= Prelulayer(NumChannels,名称)% layer = preluLayer(numChannels, name)创建一个PReLU层%用于使用numChannels通道和指定的2-D图像输入%图层名称。%设置图层名称。层。名称=Name;%设置图层描述。layer.description =.“prelu与”+ numchannels +“通道”;%初始化缩放系数。层。α=rand([1 1 numChannels]);结尾函数z =预测(图层,x)%z =预测(图层,x)通过输入数据x转发%层并输出结果Z.z = max(x,0)+ layer.alpha。* min(0,x);结尾结尾结尾
实施落后的
函数,返回损耗对输入数据和可学习参数的导数。
语法落后的
是[dLdX1,…,dLdXn, dLdW1,…,dLdWk] =向后(Z1,层,X1,…,Xn…,Zm评选,dLdZ1,…,dLdZm,内存)
, 在哪里:
x1,...,xn
是N
层输入
Z1,…,Zm评选
是m
层转发函数的输出
dLdZ1,…,dLdZm
渐变是从下一层传播的渐变
记忆
是内存输出向前
如果向前
定义,否则,记忆
是[]
.
的输出,dldx1,...,dldxn
是关于层输入的损失的衍生物dldw1,...,dldwk
是关于损失的衍生品K.
学习参数。通过防止在前向和后向通过之间保存未使用的变量来减少内存使用,请替换相应的输入参数〜
.
小费
如果输入的数量落后的
可以变化,然后使用吗varargin.
而不是之后的输入参数层
.在这种情况下,varargin.
是输入的单元格数组,在哪里变长度输入宗量{我}
对应于西
为了一世
= 1,......,NumInputs
那变长度输入宗量{NumInputs + j}
和varargin {numinputs + numoutputs + j}
对应于Zj
和dLdZj
分别为j
= 1,......,numoutput.
,varargin {结束}
对应于记忆
.
如果输出的数量可以变化,那么使用varargout
而不是输出参数。在这种情况下,varargout
是一个单元格数组的输出,在哪里varargout{我}
对应于dldxi.
为了一世
= 1,......,NumInputs
和varargout {NumInputs + t}
对应于dLdWt
为了T.
= 1,......,K.
,在那里K.
是学习参数的数量。
因为prolu层只有一个输入,一个输出,一个可知参数,并且不需要图层前进函数的输出或内存值,但是落后的
对于prelu层是[dldx,dldalpha] =向后(图层,x,〜,dldz,〜)
.尺寸X
与前向功能相同。尺寸dLdZ
和输出的尺寸一样吗Z.
前向功能。尺寸和数据类型dLdX
的维度和数据类型相同X
.维度和数据类型dLdAlpha
是否与可学习参数的维度和数据类型相同α
.
在后退通过期间,该图层使用相应的衍生物自动更新可学习的参数。
要在网络中包含自定义层,层转发函数必须接受前一层的输出,并以下一层期望的大小向前传播阵列。同样的,当落后的
是指定的,落后的
函数必须接受与前向函数的相应输出具有相同大小的输入,并向后传播具有相同大小的导数。
损耗对输入数据的导数为
在哪里 是从下一层传播的渐变,激活的衍生物是
损耗对可学习参数的导数为
在哪里一世索引的频道,j根据高度、宽度和观察值对元素进行索引,激活的梯度为
创建返回这些衍生工具的后退函数。
函数[dldx,dldalpha] =向后(图层,x,〜,dldz,〜)%[dldx,dldalpha] =向后(图层,x,〜,dldz,〜)%反向传播损失函数的导数%穿过图层。%的输入:%层 - 层向后传播通过%X - 输入数据%dldz - 梯度从更深层传播%输出:% dLdX -关于的损失的导数%的输入数据% dLdAlpha -损失对的导数%学习参数alphadldx = tillay.alpha。* dldz;dldx(x> 0)= dldz(x> 0);dlalpha = min(0,x)。* DLDZ;dlalpha = sum(dldalpha,[1 2]);在迷你批处理中的所有观察中总和。dLdAlpha = (dLdAlpha, 4)之和;结尾
查看已完成的图层类文件。
Classdef.prelulayer%例子自定义proLu层。特性(学习)%层可学习参数%缩放系数α结尾方法函数第= Prelulayer(NumChannels,名称)% layer = preluLayer(numChannels, name)创建一个PReLU层%用于使用numChannels通道和指定的2-D图像输入%图层名称。%设置图层名称。层。名称=Name;%设置图层描述。layer.description =.“prelu与”+ numchannels +“通道”;%初始化缩放系数。层。α=rand([1 1 numChannels]);结尾函数z =预测(图层,x)%z =预测(图层,x)通过输入数据x转发%层并输出结果Z.z = max(x,0)+ layer.alpha。* min(0,x);结尾函数[dldx,dldalpha] =向后(图层,x,〜,dldz,〜)%[dldx,dldalpha] =向后(图层,x,〜,dldz,〜)%反向传播损失函数的导数%穿过图层。%的输入:%层 - 层向后传播通过%X - 输入数据%dldz - 梯度从更深层传播%输出:% dLdX -关于的损失的导数%的输入数据% dLdAlpha -损失对的导数%学习参数alphadldx = tillay.alpha。* dldz;dldx(x> 0)= dldz(x> 0);dlalpha = min(0,x)。* DLDZ;dlalpha = sum(dldalpha,[1 2]);在迷你批处理中的所有观察中总和。dLdAlpha = (dLdAlpha, 4)之和;结尾结尾结尾
如果层转发功能完全支持金宝appdlarray
对象,那么该层是GPU兼容的。否则,要与GPU兼容,层函数必须支持类型的输入和返回输出金宝appGPUArray.
(并行计算工具箱).
许多MATLAB内置功能支持金宝appGPUArray.
(并行计算工具箱)和dlarray
输入参数。获取支持的函数列表金宝appdlarray
对象,参见支持dlarray的函数列表金宝app.有关在GPU上执行的函数列表,请参见在GPU上运行matlab函数(并行计算工具箱).要使用GPU进行深度学习,您还必须具有支持的GPU设备。金宝app有关支持设备的信息,请参阅金宝appGPU支金宝app持版本(并行计算工具箱).有关使用Matlab的GPU的更多信息,请参阅GPU计算在Matlab中(并行计算工具箱).
[1]“深入研究整流器:超过Imagenet分类的人力水平表现。”2015 IEEE计算机视觉国际会议(ICCV)1026 - 34。圣地亚哥,智利:IEEE, 2015。https://doi.org/10.1109/ICCV.2015.123。