各种卷积的理解笔记(2D,3D,1x1,可分离卷积)
作者:互联网
卷积
1. 2D卷积
卷积的目的是从输入中提取有用的特征。在图像处理中,卷积可以选择多种不同的滤波器。每种类型的过滤器都有助于从输入图像中提取不同的方面或特征,例如横向/纵向/对角线边缘。同样,在卷积神经网络中,通过卷积,利用训练过程中自动学习权值的滤波器来提取不同的特征。然后,所有这些提取的特征被“组合”以做出决定。
卷积有几个优点,如权值共享和平移不变性。卷积还考虑了像素的空间关系。这些任务可能非常有用,尤其是在许多计算机视觉任务中,因为这些任务通常涉及识别某些组件与其他组件在空间上有一定关系的对象(例如,狗的身体通常与头部、四条腿和尾巴相连)。
单通道版本
深度学习中,卷积是元素的乘法和加法。对于具有一个通道的图像(灰度图像),卷积如图所示,过滤器也即卷积核是3x3矩阵,元素为[[0,1,2],[2,2,0],[0,1,2]]。滤波器在输入端滑动。在每一个位置上,它都进行元素乘法和加法。每个滑动位置以一个数字结束。最后的输出是一个3×3的矩阵。(注意,在本例中,步幅=1,填充=0。这些概念将在下面的算术部分中描述。
多通道版本
在许多应用程序中,我们处理的是具有多个通道的图像。一个典型的例子是RGB图像。
多通道数据的另一个例子是卷积神经网络中的层。卷积网络层通常由多个信道(通常是数百个信道)组成。每个通道描述前一层的不同方面。我们如何在不同深度的层之间进行转换?如何将深度为n的层转换为深度为m的层?
澄清一些术语:层,通道,特征图,滤波器,核。从层次结构角度来看,层和滤波器概念属于同一层次,而通道和核处于下面的一个层次。通道和特征图是一样的。一个图层可以有多个通道(或特征图):如果输入是RGB图像,则输入图层有3个通道。“通道”通常用来描述“层”的结构。类似地,“核”用于描述“滤波器”的结构。
“层”(“滤波器”)和“通道”(“核”)之间的区别:
滤波器和核之间区别有些棘手。有时,它们可以互换使用,这会造成混乱。本质上,这两个术语有细微的区别。
“核”是指一个二维权重数组。
“滤波器”是指堆叠在一起的多个核的三维结构
对于二维滤波器,滤波器和核是一样的。但对于一个3D滤波器和深度学习中的大多数卷积来说,滤波器就是核的集合。每个核都是唯一的,强调输入通道的不同方面。
有了这些概念,多通道卷积就如下所示。每个核被应用到前一层的输入通道上,以输出一个输出通道。这是一个核扩展的过程。我们对所有核重复这样的过程以生成多个通道。然后将这些通道中的每一个相加,形成一个单独的输出通道。如图
这里输入层是一个5x5x3矩阵,有3个通道。滤波器是一个3x3x3矩阵。
首先滤波器中的每个核分别应用于输入层的3个通道,进行3次卷积,产生3个尺寸为3x3的通道。
然后将这三个通道相加(元素相加),形成一个单通道(3x3x1)。该通道是使用滤波器(3x3x3矩阵)对输入层(5x5x3矩阵)进行卷积的结果。
我们可以把这个过程看作是在输入层中滑动一个三维过滤矩阵。请注意,输入层核滤波器具有相同的深度(通道数=核数)。3D滤波器尽在图像的两个方向:高度和宽度上移动(这就是为什么这种操作称为二维卷积,尽管3D滤波器用于处理三维体积数据)。在每个滑动位置,我们执行元素相乘和相加,结果是一个数字。在下面示例中,滑动5个水平位置和5个垂直位置执行。总的来说,我们得到一个单一的输出通道。
现在我们可以看到如何在不同深度之间进行过渡。假设输入层有Din通道,我们希望输出层有Dout通道。我们需要做的是将Dout个滤波器应用到输入层,每个滤波器都有Din个核。每个滤波器提供一个输出通道。在应用了Dout个滤波器后,我们就有了Dout通道,这些通道可以叠加在一起形成输出层。如下图所示:
2. 3D卷积
在上一节得最后一个插图中,我们看到我们实际上对一个3D卷积,通常仍称这种操作为深度学习中得二维卷积。3D滤波器仅沿两个方向移动(图像得高度和宽度)。这种操作的输出是一个二维图像(只有一个通道)
3D卷积是二维卷积的推广。3D卷积中,滤波深度小于输入层深度(核大小<通道大小)。因此,3D滤波器可以在所有三个方向(图像的高度,宽度,通道)移动。在每个位置,元素的乘法和加法都提供一个数字。由于滤波器在三维空间滑动,因此输出数字也排列在三维空间中,然后输出三维数据。
3D卷积广泛应用于视频理解领域,用于提取视频中的时间特征与空间特征。
3D卷积与多通道卷积有什么区别呢?
多通道卷积不同通道上的卷积核的参数是不同的
3D卷积由于卷积核本身是3D的,所以这个由于“深度”造成的看似不同通道上用的就是同一个卷积,权重共享嘛。
多了一个深度通道,这个深度可能是视频上的连续帧
3. 1x1卷积
为什么这是有帮助的。我们只是把一个数字乘以输入层中的每个数字吗?对于只有一个通道的层来说,操作很简单。在这里,我们将每个元素乘以一个数字。
如果输入层有多个通道,事情就会变得有趣。下图说明了1 x 1卷积如何用于尺寸为H x W x D的输入层。在1 x 1卷积(滤波器尺寸为1 x 1 x D)之后,输出通道的尺寸为H x W x 1。如果我们应用n个这样的1×1卷积,然后将结果连接在一起,我们就可以得到一个尺寸为h×w×n的输出层。
1 x 1卷积,其中滤波器尺寸为1 x 1 x D
最初,在Network-in-network论文中提出了1×1卷积。然后,他们在谷歌的inception论文中被广泛使用。1 x 1卷积的几个优点是:
有效减少维度
有效低维嵌入
卷积后再应用非线性
上图中可以看到前两个优点。经过1×1的卷积,我们显著地减小了尺寸深度。假设原始输入有200个通道,那么1x1卷积将把这些通道(特性)嵌入到单个通道中。第三个优点是在1×1卷积之后,可以添加非线性激活,如relu。非线性允许网络学习更复杂的功能。
作用
降维/升维
由于 1×1 并不会改变 height 和 width,改变通道的第一个最直观的结果,就是可以将原本的数据量进行增加或者减少。这里看其他文章或者博客中都称之为升维、降维。
增加非线性
1*1卷积核,可以在保持feature map尺度不变的(即不损失分辨率)的前提下大幅增加非线性特性(利用后接的非线性激活函数),把网络做的很deep。
跨通道信息交互(channal 的变换)
使用1x1卷积核,实现降维和升维的操作其实就是channel间信息的线性组合变化,3x3x64channels的输入后面添加一个1x1x28channels的卷积核,就变成了3x3x28channels的输出,原来的64个channels就可以理解为跨通道线性组合变成了28channels,这就是通道间的信息交互。
应用
inception
在GoogLeNet里。对于每一个Inception模块(如下图),原始模块是左图,右图中是加入了1×1卷积进行降维的。虽然左图的卷积核都比较小,但是当输入和输出的通道数很大时,乘起来也会使得卷积核参数变的很大,而右图加入1×1卷积后可以降低输入的通道数,卷积核参数、运算复杂度也就跟着降下来了。
以GoogLeNet的3a模块为例,输入的feature map是28×28×192,3a模块中1×1卷积通道为64,3×3卷积通道为128,5×5卷积通道为32,如果是左图结构,那么卷积核参数为1×1×192×64+3×3×192×128+5×5×192×32,而右图对3×3和5×5卷积层前分别加入了通道数为96和16的1×1卷积层,这样卷积核参数就变成了1×1×192×64+(1×1×192×96+3×3×96×128)+(1×1×192×16+5×5×16×32),参数大约减少到原来的三分之一。
同时在并行pooling层后面加入1×1卷积层后也可以降低输出的feature map数量,左图pooling后feature map是不变的,再加卷积层得到的feature map,会使输出的feature map扩大到416,如果每个模块都这样,网络的输出会越来越大。
而右图在pooling后面加了通道为32的1×1卷积,使得输出的feature map数降到了256。GoogLeNet利用1×1的卷积降维后,得到了更为紧凑的网络结构,虽然总共有22层,但是参数数量却只是8层的AlexNet的十二分之一(当然也有很大一部分原因是去掉了全连接层)
Resnet
ResNet同样也利用了1×1卷积,并且是在3×3卷积层的前后都使用了,不仅进行了降维,还进行了升维,参数数量进一步减少,如下图的结构
其中右图又称为”bottleneck design”,目的一目了然,就是为了降低参数的数目,第一个1x1的卷积把256维channel降到64维,然后在最后通过1x1卷积恢复,整体上用的参数数目:1x1x256x64 + 3x3x64x64 + 1x1x64x256 = 69632,而不使用bottleneck的话就是两个3x3x256的卷积,参数数目: 3x3x256x256x2 = 1179648,差了16.94倍。
对于常规ResNet,可以用于34层或者更少的网络中,对于Bottleneck Design的ResNet通常用于更深的如101这样的网络中,目的是减少计算和参数量(实用目的)。
4. 卷积算法
我们现在知道如何处理卷积中的深度。让我们继续讨论如何处理其他两个方向(高度和宽度)的卷积,以及重要的卷积算法。
下面是一些术语:
卷积核大小:卷积核在前面的章节讨论过。卷积核大小决定了卷积的感受野大小。
步长:它定义了卷积核扫过特征图时的步长大小。步长为1表示卷积核逐个扫过特征图的像素。步长为2表示卷积核以每步移动2个像素(即跳过一个元素)扫描特征图。我们可以用步长(>=2)对特征图进行向下采样。
填充:它定义了如何处理特征图的边框。如果必要的话,在输入边界进行全0填充,填充卷积(Tersorflow中padding=‘same’)将保持输出和输入的特征图尺寸相同。另一方面,完全不使用填充的卷积( Tersorflow中padding=‘valid’)只对输入的像素执行卷积,而不在输入边界填充0。输出的特征图尺寸小于输入的特征图尺寸。
下图展示了一个卷积核大小为3、步长为1和填充为1的二维卷积。
对于尺寸为i、卷积核大小为k、填充为p、步长为s的输入图像,卷积后的输出图像尺寸o:
例如图中的例子:尺寸为i=5,卷积核大小k=3,填充p=1,步长s=1,卷积后的图像尺寸o=(5+2*1-3)/1 + 1 = 5
输入尺寸为i=8,卷积核大小k=3,天才p=1,步长s=2,卷积后的输出图像尺寸o=(8+2*1-3)/2 + 1 = 4。
因为前部分向下取整为3,加1得4。这也是很多网络取步长stride=2进行下采样的原理,得到输出尺寸为输入尺寸一半。
5. 可分离卷积
可分离卷积用于一些神经网络架构,例如 MobileNet。可分离卷积分为空间可分离卷积(spatially separable convolution)和深度可分离卷积(depthwise separable convolution)。
空间可分离卷积
空间可分离卷积在图像的2维空间维度上执行,例如高和宽两个维度。从概念上来看,顾名思义,空间可分离卷积将卷积分解为两项单独的操作。下面例子中,一个卷积核为 3x3 的 Sobel 卷积核被拆分成了 3x1 和 1x3的两个卷积核。
在卷积中,3x3 卷积核可以直接对图像进行卷积操作。在空间可分离卷积中,首先由 3x1 卷积核对图像进行卷积,之后再应用 1x3 卷积核。当执行相同的操作中,就值需要 6 个参数就够了,不用9个。
此外,比起卷积,空间可分离卷积要执行的矩阵乘法运算也更少。举一个具体的例子,用3x3卷积核在 5x5 图像上做卷积操作,要求横向扫描 3 个位置(以及纵向扫描 3 个位置)上的卷积核,共有 9 个位置,如下图标出的 9 个点所示。在每个位置都进行 9 次元素级别的乘法运算,共执行 9 x 9 = 81 次运算。
对于空间可分离卷积,我们首先在5x5图像上用3x1卷积。这样的话卷积核就能横向扫描5个位置,纵向扫描3个位置,总共有5x3=15个位置,如下图所标的点所示。这样的话共要进行15x3=45次乘法运算。现在得到的是一个3x5的矩阵,这个矩阵经过1x3卷积核的卷积操作——从横向上的 3 个位置以及纵向上的 3个位置来扫描该矩阵。对于这 9 个位置中的每一个,都进行了 3 次元素级别的乘法运算,这个步骤总共要求 9 x 3=27 次乘法运算。因此,总体上,该空间可分离卷积共进行了 45 + 27 = 72 次乘法运算,也比标准的卷积所要进行的乘法运算要少。
稍微概括一下上面的案例。假设我们现在设置 m x m 卷积核、卷积步长stride=1 、填充padding=0 ,对 N x N 图像做卷积操作。传统的卷积需要进行 (N-2) x (N-2) x m x m 次乘法运算,而空间可分离卷积只需要进行 N x (N-2) x m + (N-2) x (N-2) x m = (2N-2) x (N-2) x m 次乘法运算。空间可分离卷积与标准的卷积的计算成本之比为:
对于图像大小为N大于过滤器大小(N >> m),这个比率就变成了 2 / m,这就意味着在这种渐进情况(N >> m)下,对于一个 3x3 的filter,空间可分离卷积与标准的卷积之间的计算成本比率为 2/3;对于一个 5x5 的过滤器,比率为 2/5;对于一个 7x7 的过滤器,比如为 2/7,以此类推。
虽然空间可分离卷积节省了计算成本,但是它很少应用于深度学习中。一个主要的原因是,并不是所有的卷积核都能被拆分为 2 个更小的卷积核。如果我们用这种空间可分离卷积来取代所有传统的卷积,就会束缚我们去搜寻训练期间所有可能存在的卷积核,因为这个训练的解可能是次优的。
深度可分离卷积
深度可分离卷积 depthwise separable convolutions,它在深度学习中的应用要更普遍得多(例如在 MobileNet 和 Xception 中)。深度可分离卷积由两步组成:depthwise卷积以及 1x1 卷积。
介绍这些步骤前,值得回顾一下前面部分所提到的 2D 卷积和 1x1 卷积。让我们先快速过一下标准的 2D 卷积。举一个具体的案例,假设输入层的大小为 7 x 7 x 3(高 x 宽 x 通道),filter大小为 3 x 3 x 3,经过一个filter的 2D 卷积后,输出层的大小为 5 x 5 x 1(仅剩 1 个通道)。
一般来说,两个神经网络层间应用了多个filter,现在假设filter个数为 128。128 次 2D 卷积得到了 128 个 5 x 5 x 1 的输出映射。然后将这些映射堆叠为一个大小为 5 x 5 x 128 的单个层。空间维度如高和宽缩小了,而深度则扩大了。
现在有了深度可分离的卷积,让我们看看我们如何实现相同的转换。
首先,我们在输入层上应用深度卷积。我们在 2D 卷积中分别使用 3 个卷积核(每个的大小为 3 x 3 x 1),而不使用一个 3 x 3 x 3大小的filter。每个卷积核仅对输入层的 1 个通道做卷积,这样的卷积每次都得出大小为 5 x 5 x 1 的映射,之后再将这些映射堆叠在一起创建一个 5 x 5 x 3 的图像,最终得出一个大小为 5 x 5 x 3 的输出图像。这样的话,图像的空间维度缩小了,但是深度保持与原来的一样。
深度可分离卷积的第二步是扩大深度,我们用大小为 1x1x3 的卷积核做 1x1 卷积操作。每个 1x1x3 卷积核对 5 x 5 x 3 输入图像做卷积后都得出一个大小为 5 x 5 x1 的映射。
这样,做 128 次 1x1 卷积后,就可以得出一个大小为 5 x 5 x 128 的层
深度可分离卷积完成这两步后,同样可以将一个 7 x 7 x 3 的输入层转换为 5 x 5 x 128 的输出层。
深度可分离卷积的完整过程如下图所示:
因此,做深度可分离卷积的优势是什么?高效!相比于 2D 卷积,深度可分离卷积的执行次数要少得多。
让我们回忆一下 2D 卷积案例中的计算成本:128 个 3x3x3 的卷积核移动 5x5 次,总共需要进行的乘法运算总数为 128 x 3 x 3 x 3 x 5 x 5 = 86,400 次。
那可分离卷积呢?在深度卷积这一步,有 3 个 3x3x3 的卷积核移动 5x5 次,总共需要进行的乘法运算次数为 3x3x3x1x5x5 = 675 次;在第二步的 1x1 卷积中,有 128 个 1x1x3 的卷积核移动 5x5 次,总共需要进行的乘法运算次数为 128 x 1 x 1 x 3 x 5 x 5 = 9,600 次。因此,深度可分离卷积共需要进行的乘法运算总数为 675 + 9600 = 10,275 次,花费的计算成本仅为 2D 卷积的 12%。
因此对于任意大小的图像来说,应用深度可分离卷积能节省多少次计算呢?我们稍微概括一下上面的案例。假设输入图像大小为 H x W x D,2D 卷积的卷积步长为 1,填充为 0,卷积核大小为 h x h x D(两个 h 相等)、个数为 Nc。2D 卷积后,大小为 (H x W x D) 的输入层最终转换为大小为(H-h+1 x W-h+1 x Nc) 的输出层,总共需要进行的乘法运算次数为:
Nc x h x h x D x (H-h+1) x (W-h+1)
针对同样的转换,深度可分离卷积总共需要进行的乘法运算次数为:
D x h x h x 1 x (H-h+1) x (W-h+1) + Nc x 1 x 1 x D x (H-h+1) x (W-h+1) = (h x h + Nc) x D x (H-h+1) x (W-h+1)
深度可分离卷积与 2D 卷积之间的乘法运算次数之比为:
对于大部分现代框架而言,输出层往往都有许多个通道,例如几百甚至几千个通道。对于 Nc >> h 的层,上面的表达式会缩短为 1/h/h,这就意味着对于这个表达式而言,如果使用的 3 x 3大小的filter,这样2D卷积需要进行的乘法运算次数是深度可分离卷积的9 倍;使用大小为 5 x5 的过滤器,则是25 倍。
使用深度可分离卷积有什么缺点吗?当然有。深度可分离卷积减少了卷积中的参数数量。因此,在小型模型中,如果用深度可分离卷积替换2D卷积,则模型容量可以显着降低。结果,该模型可能变得次优。但是,如果使用得当,深度可分离卷积可以提高效率而不会明显损害模型的性能。
标签:滤波器,卷积,分离,2D,1x1,深度,输入,通道 来源: https://blog.csdn.net/WadeDu3/article/details/114552763