本文主要是介绍深度学习基础--卷积的变种,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
随着卷积同经网络在各种问题中的广泛应用,卷积层也逐渐衍生出了许多变种,比较有代表性的有:
分组卷积( Group Convolution )、转置卷积 (Transposed Convolution) 、空洞卷积( Dilated/Atrous Convolution )、可变形卷积( Deformable Convolution ),下面分别介绍下。
1. 分组卷积
在普通的卷积操作中,一个卷积核对应输出特征图的一个通道,而每个卷积核又会作用在输入特征图的素有通道上(即卷积核的通道数等于输入特征图的通道数),因此最终输出的特征图的每个通道都与输入特征图的所有通道相连接。也就是说,在通道这个维度上,是“全连接的”。
所谓分组卷积,其实就是将输入通道和输出通道都划分为同样的组数,然后仅仅让处于相同组号的输入通道和输出通道进行“全连接”,如图:
如果记g 为输入/输出通道所分的组数,则分组卷积能够将卷积操作的参数量和计算量都降低为普通卷积的1/g。分组卷积最初是在 A lexNe t 网络中引入的。当时,为了解决单个 G P U 无法处理合高较大计算量和存储需求的卷积层这个问题,就
采用分组卷积将计算和存储分配到多个 GPU 上。 后来随着计算硬件的不断升级,这个方向上的需求已经大为减少。目前,分组卷积更多的被用来构建移动设备的小型网络模型,例如深度可分离在积(),就极为依赖分组卷积。不过,分组卷积也存在一个潜在的问题:虽然在理论上它可以显著降低计算量,但是对内存的访问频繁程度并未降低,且现有的GPU加速库(如 cuDNN) 对其优化的程度有限,因此官在效率上的提升并不如理论上显著。
2. 转置卷积
普通卷积操作可以形式化为一个矩阵乘法运算,即:
y = A x (1.1) y=Ax \tag{1.1} y=Ax(1.1)
其中, x x x, y y y, 分别是卷积的输入和输出,维度分别是 d ( i ) d^{(i)} d(i)和 d ( o ) d^{(o)} d(o),A是由卷积核、滑动步长决定的常对角矩阵,维度为 d ( i ) × d ( o ) d^{(i)}×d^{(o)} d(i)×d(o),其每一行对应着卷积核的一次滑动位置。以一维卷积为例,假设输入向量 x = [ a , b , c , d , e , f , g ] T x=[a,b,c,d,e,f,g]^T x=[a,b,c,d,e,f,g]T,卷积和 K = [ x , y , z ] K=[x,y,z] K=[x,y,z],卷积核的滑动步长为2, 则输出向量为:
y − x ∗ K = [ a x + b y + c z c x + d y + e z e x + f y + g z ] = [ x y z 0 0 0 0 0 0 x y z 0 0 0 0 0 0 x y z ] [ a b c d e f g ] = A x (1.2) y-x*K= \left[ \begin{matrix} ax+by+cz \\ cx+dy+ez \\ ex+fy+gz \\ \end{matrix} \right] = \left[ \begin{matrix} x & y & z & 0 & 0& 0 & 0 \\ 0 & 0 & x & y & z & 0 & 0 \\ 0 & 0& 0 & 0 & x & y & z \\ \end{matrix} \right] \left[ \begin{matrix} a \\ b \\ c\\ d\\ e\\ f\\ g\\ \end{matrix} \right]=Ax \tag{1.2} y−x∗K= ax+by+czcx+dy+ezex+fy+gz = x00y00zx00y00zx00y00z abcdefg =Ax(1.2)
反过来,记 A T A^T AT为矩阵 A A A的转置,定义如下矩阵运算
y ^ = A T x ^ (1.3) \widehat{y}=A^T\widehat{x}\tag{1.3} y =ATx (1.3)
其所对应的操作被称为转置卷积,其中 y ^ \widehat{y} y 和 x ^ \widehat{x} x 分别是转置卷积的输入和输出,维度分别是 d ( i ) d^{(i)} d(i)和 d ( o ) d^{(o)} d(o)。转置卷积也可以称为反卷积,它可以看做是普通卷积的一个对称操作,这种“对称性”体现在以下两个方面:
- 转置卷积能将普通卷积中输入到输出的尺寸变换逆反过来,
- 根据矩阵运算的求导知识,在式 (1.1) 所示的普通卷积中,输出 y 对于输入 x 的导数为∂y/∂x = A;而在式 (1.2) 所示的转置卷积中,输出 y 对于输入 x 的导数为∂y/∂x = A。由此可以看出,转置卷积的信息正向传播与普通卷积的误差反向传播所用的矩阵相同,反之亦然。
以式( 1.2 ) 为例 , 我们可以写出转置卷积的具体计算公式:
可以看到,等号的右侧实际上就是一个普通卷积对应的矩阵乘法。因此,转置卷积本质上就是一个对输入数据进行适当变换(补零/上采样)的普通卷积操作。在具体实现时,以二维卷积为例,一个卷积核尺寸为 K H × K W K_H\times K_W KH×KW、移动步长为 ( S H , S W ) (S_H,S_W) (SH,SW)、边界填充尺寸为 ( P H , P W ) (P_H,P_W) (PH,PW)的普通卷积,其对应的转置卷积可以按照如下步骤来进行。
普通卷积和转置卷积所处理的基本任务是不同的。前者主要用来进行特征提取,倾向于压缩特征图尺寸;后者主要用于对特征图进行扩张或上采样,代表性的应用场景如下:
- 语义分割/实例分割等任务:由于需要提取输入图像的高层语义信息,网络的特征图尺寸一般会先缩小进行聚合。此外,这类任务一般需要输出与原始图像大小一致的像素级分割结果,因而需要扩张前面得到的语义信息较高的特征图,这就用到了转置卷积。
- 一些物体检测、关键点检测任务,需要输出与源图像大小一致的结果。
- 图像的自编码器、变分自编码器、生成式对抗网络等。
3. 空洞卷积
在语义分割(Semantic Segmentation)任务中,一般需要先缩小特征图尺寸,进行信息聚合,然后再复原到之前的尺寸,最终得到与原始图像尺寸相同的分割结果图。常见的语义分割模型,如全卷积网络(Fully Convolutional Networks,FCN),一般采用池化操作来扩大特征图的感受野,但这同时会降低特征图的分辨率,丢失一些信息(如内部数据结构、空间层级信息等),导致后续的上采样操作(如转置卷积)无法还原一些细节,从而限制最终分割精度的提升。
那么,如何不通过池化等下采样操作就能扩大感受野呢?空洞卷积应运而生。顾名思义,空洞卷积就是在标准的卷积核中注入“空洞”,以增加卷积核的感受野。空洞卷积引入了扩张率(dilation rate)这个超参数来指定相邻元素之间的间隔。扩张率为 r 的空洞卷积,其卷积核上相邻数据点之间有 r - 1 个空洞,如图 1.7 所示。
(图中有绿点的方格表示有效的数据点,黄色方格为空)。尺寸为 k w × k h k_w×k_h kw×kh 的标准卷积核,在扩张率为 r 的空洞卷积中,其尺寸变为 k e + ( r − 1 ) ( k − 1 ) , e ∈ [ w , h ] k_e+(r-1)(k-1),e∈[w,h] ke+(r−1)(k−1),e∈[w,h]。扩张率为 1 的空洞卷积实际上就是标准卷积(即无空洞)。
空洞卷积感受野的计算与上一节中介绍的普通卷积感受野的计算方法一致,只是其中的卷积核尺寸变为扩张后的空洞卷积核尺寸(即包括空洞在内)。以图 1.7 为例,假设依次使用图 1.7(a)、(b)、(c)中的空洞卷积构建三层神经网络:第一层是图 1.7(a)中 r=1 的空洞卷积,扩张后的卷积核尺寸为 3×3;第二层是图 1.7(b)中 r=2 的空洞卷积,扩张后的卷积核尺寸为 5×5;第三层是图 1.7(c)中 r=4 的空洞卷积,扩张后的卷积核尺寸为 9×9。根据上文中介绍的感受野计算公式,可以得到第一层、第二层、第三层的感受野依次为 3×3、7×7、15×15(如图 1.7 中深色阴影部分所示)。如果采用标准的 3×3 卷积核,则三层连接起来的感受野只有 7×7。因此,可见使用空洞卷积扩大了卷积核尺寸,不经过下采样操作即可扩大感受野,同时还能保留数据的内部结构。
4. 可变形卷积
普通的卷积操作是在固定的、规则的网格点上进行数据采样,如图 1.8(a)所示。这束缚了网络的感受野形状,限制了网络对几何形变的适应能力。为了克服这个限制,可变形卷积在卷积核的每个采样点上添加一个可学习的偏移量(offset),让采样点不再局限于规则的网格点,如图 1.8(b)所示。图 1.8(c)和图 1.8(d)是可变形卷积的两个特例:前者在水平方向上对卷积核有较大拉伸,体现了可变形卷积的尺度变换特性;后者则是对卷积核进行旋转。特别地,图 1.8(c)中的可变形卷积核形状类似于上一问中的空洞卷积,实际上,空洞卷积可以看作一种特殊的可变形卷积。
可变形卷积使网络具有了学习空间几何形变的能力。具体来说,可变形卷积引入了一个平行分支来端到端地学习卷积核采样点的位置偏移量。如图 1.9 所示,该平行分支先根据输入特征图计算出采样点的偏移量,然后再在输入特征图上采样对应的点进行卷积运算。这种结构让可变形卷积的采样点能根据当前图像的内容进行自适应调整。
我们以二维卷积为例,详细说明可变形卷积的计算过程。假设卷积核尺寸为 3×3,记 R = {(-1,-1)、(-1,0)、(-1,1)、(0,-1)、(0,0)、(0,1)、(1,-1)、(1,0)、(1,1)},它对应着卷积核的 9 个采样点。首先来看普通卷积,可以用公式形式化为:
y ( p 0 ) = ∑ p n ∈ R w ( p n ) ⋅ x ( p 0 + p n ) (1.3) y(p_0)=\sum_{p_n∈R}w(p_n)·x(p_0+p_n)\tag{1.3} y(p0)=pn∈R∑w(pn)⋅x(p0+pn)(1.3)
其中, x ( ⋅ ) x(·) x(⋅)、 y ( ⋅ ) y(·) y(⋅)分别是卷积层的输入特征图和输出特征图,$p_0 是卷积窗的中心点, 是卷积窗的中心点, 是卷积窗的中心点,p_n$ 是卷积核的采样点。对于可变形卷积,它的计算公式则是:
y ( p 0 ) = ∑ p n ∈ R w ( p n ) ⋅ x ( p 0 + p n + Δ p n ) (1.4) y(p_0)=\sum_{p_n∈R}w(p_n)·x(p_0+p_n+\Delta p_n)\tag{1.4} y(p0)=pn∈R∑w(pn)⋅x(p0+pn+Δpn)(1.4)
其中 Δ p n \Delta p_n Δpn 是采样点的位置偏移量。由于 Δ p n \Delta p_n Δpn是在网络中端到端地学习得到的,它可能不是整数,这会导致 p 0 + p n + Δ p n p_0+p_n+\Delta p_n p0+pn+Δpn不在整数网格点上,此时需要采用双线性插值:
x ( p ) = ∑ q G ( q , p ) ⋅ x ( q ) (1.5) x(p)=\sum_q G(q,p)·x(q) \tag{1.5} x(p)=q∑G(q,p)⋅x(q)(1.5)
其中,p 是任意位置点(例如取 p = p 0 + p n + Δ p n p=p_0+p_n+\Delta p_n p=p0+pn+Δpn),q是整数网格点,
G ( q , p ) = m a x ( 0 , 1 − ∣ q x − p x ∣ ⋅ m a x ( 0 , 1 − ∣ q y − p y ∣ ) G(q,p)=max(0,1-|q_x-p_x|·max(0,1-|q_y-p_y|) G(q,p)=max(0,1−∣qx−px∣⋅max(0,1−∣qy−py∣)
是双线性插值核。
适应物体在不同图片中出现的复杂几何形变(如尺度、形态、非刚性形变等),一直是物体识别领域的难点。可变形卷积网络给出了一个可行的解决方案,它可以端到端地学习几何形变的偏移量,不需要额外的监督信息,并且只增加了少许计算量,最终能带来性能的显著提升。图 1.10 是可变形卷积的一组效果示意图,图中结点是激活点,红点是激活点对应的三层 3×3 可变形卷积表示的采样位置(其有 9×9×9 = 729 个点)。可以看到,红色采样点基本覆盖了检测物体的全部区域,这说明可变形卷积会根据物体的尺度、形态进行自适应调整。
这篇关于深度学习基础--卷积的变种的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!