最近在研究卷积网络的改性,有必要对各种卷积层的结构深入熟悉一下。为此写下这篇学习笔记。
文章大部分内容来自于网络的各种博客总结,本博文仅仅作为学习笔记,不做商业用途。
卷积层
信号处理中,卷积被定义为:一个函数经过翻转和移动后与另一个函数的乘积的积分。
在深度学习中,卷积中的过滤函数是不经过翻转的。故此,深度学习中的卷积本质上就是信号/图像处理中的互相关(cross-correlation)
首先通过下面一张动图,清晰看出什么是卷积
(3*3kernel,padding为1)
(3*3kernel,padding为0)
执行卷积的目的是从输入中提取有用的特征。在图像处理中,执行卷积操作有诸多不同的过滤函数可供选择,每一种都有助于从输入图像中提取不同的方面或特征,如水平/垂直/对角边等。类似地,卷积神经网络通过卷积在训练期间使用自动学习权重的函数来提取特征。所有这些提取出来的特征,之后会被「组合」在一起做出决策。
CONV的优点:权重共享(weights sharing)和平移不变性(translation invariant),可以考虑像素空间的关系。
单通道版本的卷积操作如下图所示:
下面再通过动图,清晰看出什么是卷积
(3*3kernel,padding为1)
(3*3kernel,padding为0)
多通道卷积(空间卷积)
对于实际的图片,往往是RGB三通道的。而对于卷积层而言,也是如此,一个卷积层往往也是多个通道组成的,每个通道描述一个方面的特征。
生成一个输出通道,就需要将每一个卷积核应用到前一层的输出通道上,这是一个卷积核级别的操作过程。对所有的卷积核都重复这个过程以生成多通道,之后,这些通道组合在一起共同形成一个单输出通道。设输入层是一个 5 x 5 x 3 矩阵,它有 3 个通道。过滤器则是一个 3 x 3 x 3 矩阵。首先,过滤器中的每个卷积核都应用到输入层的 3 个通道,执行 3 次卷积后得到了尺寸为 3 x 3 的 3 个通道。如下图所示
之后,这 3 个通道都合并到一起(元素级别的加法)组成了一个大小为 3 x 3 x 1 的单通道。这个通道是输入层(5 x 5 x 3 矩阵)使用了过滤器(3 x 3 x 3 矩阵)后得到的结果。
可以将这个过程视作将一个 3D 过滤器矩阵滑动通过输入层。注意,这个输入层和过滤器的深度都是相同的(即通道数=卷积核数)。这个 3D 过滤器仅沿着 2 个方向(图像的高&宽)移动(这也是为什么 3D 过滤器即使通常用于处理 3D 体积数据,但这样的操作还是被称为 2D 卷积)
可分离卷积(separable convolution)
在一个可分离卷积中,我们可以将内核操作拆分成多个步骤。我们用y = conv(x,k)表示卷积,其中y是输出图像,x是输入图像,k是内核。这一步很简单。接下来,我们假设k可以由下面这个等式计算得出:k = k1.dot(k2)。这将使它成为一个可分离的卷积,因为我们可以通过对k1和k2做2个一维卷积来取得相同的结果,而不是用k做二维卷积。
以通常用于图像处理的Sobel内核为例。你可以通过乘以向量[1,0,-1]和[1,2,1] .T获得相同的内核。在执行相同的操作时,你只需要6个而不是9个参数。
深度可分离卷积(depthwise separable convolution)
空间可分离卷积(上一小节),而在深度学习中,深度可分离卷积将执行一个空间卷积,同时保持通道独立,然后进行深度卷积操作。
假设我们在一个16输入通道和32输出通道上有一个3x3的卷积层。那么将要发生的就是16个通道中的每一个都由32个3x3的内核进行遍历,从而产生512(16x32)的特征映射。接下来,我们通过将每个输入通道中的特征映射相加从而合成一个大的特征映射。由于我们可以进行此操作32次,因此我们得到了期望的32个输出通道。
那么,针对同一个示例,深度可分离卷积的表现又是怎样的呢?我们遍历16个通道,每一个都有一个3x3的内核,可以给出16个特征映射。现在,在做任何合并操作之前,我们将遍历这16个特征映射,每个都含有32个1x1的卷积,然后才逐此开始添加。这导致与上述4608(16x32x3x3)个参数相反的656(16x3x3 + 16x32x1x1)个参数。
分组卷积(Group convolution)
Group convolution 分组卷积,最早在AlexNet中出现,由于当时的硬件资源有限,训练AlexNet时卷积操作不能全部放在同一个GPU处理,因此作者把feature maps分给多个GPU分别进行处理,最后把多个GPU的结果进行融合。
扩张卷积(Dilated Convolutions)
扩张卷积引入另一个卷积层的参数被称为扩张率。这定义了内核中值之间的间距。扩张速率为2的3x3内核将具有与5x5内核相同的视野,而只使用9个参数。 想象一下,使用5x5内核并删除每个间隔的行和列。(如下图所示)
系统能以相同的计算成本,提供更大的感受野。扩张卷积在实时分割领域特别受欢迎。 在需要更大的观察范围,且无法承受多个卷积或更大的内核,可以才用它。
反卷积(转置卷积 Transposed Convolutions)
对于反卷积的,之前本人在复现老师的FSRCNN的时候已经用过了(执行上采样操作)。详细可参考博文《基于pytorch的FSRCNN的复现》《学习笔记之——基于pytorch的FSRCNN》
octave convolution
关于octconv的介绍可以参考本人之前博文《实验笔记之——基于SRResNet的Octave Convolution实验记录》
来自论文《Drop an Octave Reducing Spatial Redundancy in Convolutional Neural Networks with Octave Convolution》
是一种将feature map分为高频与低频特征的特殊的卷积层。可以降低存储量与计算量,增加感受野。即插即用。
参考资料:
https://blog.csdn.net/Chaolei3/article/details/79374563
https://zhuanlan.zhihu.com/p/28749411
http://www.cnblogs.com/marsggbo/p/9737991.html