随着卷积同经网络在各种问题中的广泛应用,卷积层也逐渐衍生出了许多变种,比较有代表性的有:
分组卷积( 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−