深度学习机器学习

深度学习网络中的卷积操作

2019-03-07  本文已影响0人  雨幻逐光

CNN从2012年的AlexNet发展到今天,一波又一波研究者对如何进行卷积操作进行了改良。这些操作使得我们的CNN模型一代更比一代深,一代更比一代准,一代更比一代块(轻量化)。接下来是我对于一些卷积操作的理解。因为本人水平有限,如有理解错误欢迎大家指出。

卷积操作

图像时二维的离散信号。所谓图像的卷积就是将一个卷积核在图像上进行滑动。将图像上的灰度值和对应的卷积核上的值进行相乘。接着讲所有相乘的值进行相加得到卷积核中心对应的像素点的灰度值。所以,当滑动结束后我们得到了一幅新的图像。


图像卷积

CNN中的卷积层

在CNN中,卷积层是有一定的厚度的。它是有多个卷积filter组成的。通过卷积得到的图像我们一般称为featuremap(因为卷积可以提取出图像的特征features)。
举个例子,我们的图像如果是彩色rgb的图像。那么图像本身的通道数(channels)就是3。卷积时我们可以直接用通道数为3的卷积层来进行卷积。这个过程可以分解成上面的卷积过程。首先对应r通道的filter对r通道卷积得到一张featuremap。一次我们可以得到3张中间过程的featuremap。最后我们将3张中间过程的featuremap对应位置相加得到最后本次卷积的结果,也就是一张featuremap。一般我们最后得到的featuremap张数称为输出通道数。有多少个输出通道就有多少个卷积层。(按照上面介绍的,每个卷积层最终能够得到一张featuremap(3个通道对应位置相加后就只剩下一张)。所以多少个卷积层就可以得到多少张最终的featuremap,也就是多少个输出的通道。

Group convolution(分组卷积)

Group convolution分组卷积最早是在AlexNet中出现。由于当时的硬件受限,卷积被拆分成多组分在不同的GPU上进行计算。


AlexNet

对于分组卷积的引入可以大量减少参数量。比如当input的channel为128,output的channel也为128,卷积核的kernel size为3x3的话。当不做group conv参数为128x3x3x128,若group为4。每个group的input channel和output channel均变为32(128/4)。每组所需要的参数为32x3x3x32。总共4组就是4x32x3x3x32是原来的四分之一。最终我们把4组的32个通道的输出concatenate起来就是32x4=128个output channels。也就等价于我们之前128个output channels。

迷你卷积核

所谓迷你卷积核的核心思想就是利用多个小kernel size的卷积核来提升感受野从而取代大的kernel size的卷积核。从而达到减少参数以及提升计算速度的目的。


用连个3x3的卷积核代替5x5的卷积核

每层卷积使用不同size的卷积

在提出这种结构之前,所有的CNN都是的有一层一层同类型的CNN堆叠而成。事实上,同一层的feature map可以分别使用多个不同尺寸的卷积核,以获得在此层不同感受野的特征。之后再把这些特征结合起来,往往能得到比使用单一卷积核更好的特征。谷歌的GoogleNet,或者说Inception系列的网络就使用了多个卷积核的结构:


Inception结构初版

如上图所示,一个featuremap通过几个卷积层后并concatenate在一块。这使得模型的参数相较于一个卷积层而言大大增加。于是有引出了改良的新结构:BottleNeck。

BottleNeck结构

正如上面所说,如果单单引入多个尺寸不同的卷积核将带来参数量急剧上升的问题。受到 Network in Network 的启发,他们在 Inception 中引入了以下结构:


加入1x1卷积核的Inception

我们根据上图所示来计算下通过引入1x1的卷积核参数量是否有减少。
首先观察左边第一种,我们知道输入输出都是256维。第一种采用 3x3 kernel size 的卷积核,所需要的参数是:256 * 3 * 3 * 256 = 589824。
第二种的参数量为:
256 * 1 * 1 * 64 + 64 * 3 * 3 * 64 + 64 * 1 * 1 * 256 = 16384 + 36864 + 16384 = 69632
我们可以发现,589824 / 69632 ≈ 8.47。因此我们可以发现引入了 1 * 1 结构后,大大地降低了参数量。1 * 1 的卷积核也因此在后续的大型网络中被大量采用用以减少参数量。

Resnet结构网络

Resnet skip connection
在 Resnet 残差网路提出之前,我们都知道阻碍网络变深的原因就是梯度消失。当网络变深时,梯度的消失使得网络参数得不到更新,从而导致越是浅层的网络越难以得到参数的更新,也就是无法得到有效训练。为了解决这个问题,Resnet 结构被提出。用 skip connection 的结构使得梯度能够更好地流向浅层的网络。这里列两个 reference 用以解释 skip connection 的作用。参考PPT参考文章

DepthWise 以及 PointWise 卷积操作

DepthWise 卷积和 PointWise 卷积结合起来是为 DepthWise Separable Convolution。该卷积模式和普通的卷积一样,可以用于提取图像的特征。该结构的提出仍然是为了减少参数量提高运算效率。从普通的卷积结构我们可以发现:每一次卷积都同时考虑到了空间信息和通道信息。即每次卷积得到的 feature map 上的每一个点都集合了对应某个空间区域(卷积核 kernel size 的大小)和所有输入通道数的信息。而问题是是否能够分开考虑这两部分信息而得到类似的结果?而分开操作正是 DepthWise Separable Convolution 中的两步:DW 和 PW。其中 DepthWise(DW) 所做的就是原始输入图像有多少个 channel,我就用多少个卷积核去卷积。每个卷积核对应相应的 channel。最终得到的 featuremap channel 数目和输入图像的 channel 数一样。我们把这个 channel 数记为 M。接着,我们用 1 * 1 * M 的卷积核来结合上一步输出 featuremap 的各通道信息。需要多少 channel 的输出,我们就用多少个这样的卷积核。比如需要输出 N channel,则我们的卷积核为 1 * 1 * M * N 个参数。这一步成为 PointWise 卷积,简称 PW。这里列出一篇参考文章
接下来我们举个例子来感受下这种结构相较于传统结构对于参数减少的贡献:
假设我们的输入图片为 3 个通道。我们想得到一张 channel 数为256 的 featuremap。我们定义我们的卷积核 kernel size 为 5 * 5 的话:

  1. 采用普通卷积,我们的卷积核参数量为 256 * 5 * 5 * 3 = 19200
  2. 采用 DW 和 PW 的方式我们的卷积核参数量为 3 * 5 * 5 + 256 * 1 * 1 * 3 = 75 + 768 = 843
    其中 19200 / 843 ≈ 22.76。从这个例子我们可以看出,所减少的参数量相当可观。

ShuffleNet

ShuffleNet有两大特征,这 两个特征 使其参数少,运行快,准确率还不低。
1. channel shuffle
在之前介绍分组卷积(Group Convolution)中,每次分组卷积得到的结果(feature map)一直处在原本分好的组中,并作为输入传给该组别的下一层级处理。直到最后才把所有组别得到的结果concatenate。因为各组别缺乏有效的信息交流(相对于非分组卷积,非分组卷积会把featuremap的所有通道数进行统一的卷积操作,相当于所有通道之间的信息有相互影响。而分组卷积只有组内的通道才有信息间的传递),所以模型的泛化能力相对较弱。为了解决这个问题,ShuffleNet在上一层所有组别得到的featuremap通道集合起来进行打乱。然后再讲打乱后的featuremap进行分组,并作为各组下一层级(一般就是卷积)的输入。下面是ShuffleNet结构示意图:

ShuffleNet
上图来源ShuffleNet论文
经过通道打乱(channel shuffle)操作之后,分组卷积(group convolution)在卷积时就考虑到了不同分组通道的信息,从而卷积输出的特征(feature map)的可能性也更多(可以理解为同样多的参数能够表征的映射方程集合变大了,从而从中选出新能表现更佳的可能性增大了)。
2. DepthWise卷积
在AlexNet中,所有的卷积操作还是用的标准卷积。而在ShuffleNet中,分组卷积操作用depthwise来替代。
总结:综上所述,ShuffleNet使用channel shuffle的方式增加了解空间的大小(用较少的参数做到了之前比较多参数才能做到的空间大小),提高了泛化能力。而DepthWise卷积又进一步减少了参数量。因此ShuffleNet能够在拥有超少的参数量同时达到了媲美AlexNet的准确率。

SENet

SE building block
上图是SENet中的SE building block的结构。如图所示原网络某层输出特征(即x经过之后的)分成两条路线。下面一条路线直接通过。上面一条分别经过Squeeze和Excitation操作后得到输出。最后用上面路线得到的输出对下面路线的特征进行重标定得到该block的输出。
其中,Squeeze操作就是Global Average Pooling,将每个通道的2维特征压缩成一维(上图中每个通道是的二维特征,压缩成的特征。最终对应的特征)。Excitation操作是引入神经网络的机制(用全连接层和激活函数)建模,用于得到上一层输出特征通道间的相关性。用得到的输出作为对应通道的权重,对特征进行重标定,完成特征通道的权重分配。
总结:Squeeze得到的特征具有对应通道的全局感受野,集合了全局信息。Excitation融合了前面个通道feature map的信息,然后得到最后的权重。因此,此结构引入了有助于提升感受野,综合考虑特征的更多信息。
上一篇下一篇

猜你喜欢

热点阅读