在全连接网络中,一张图片上的所有像素点会被展开成一个1维向量输入网络,如 下图 所示,28 x 28的输入数据被展开成为784 x 1 的数据作为输入。
这样往往会存在如下两个问题:
1、输入数据的空间信息被丢失。 空间上相邻的像素点往往具有相似的RGB值,RGB的各个通道之间的数据通常密切相关,但是转化成1维向量时,这些信息被丢失。如 下图 所示,空间位置相邻的两个点A和B,转化成1维向量后并没有体现出他们之间的空间关联性。
2、模型参数过多,容易发生过拟合。 由于每个像素点都要跟所有输出的神经元相连接。当图片尺寸变大时,输入神经元的个数会按图片尺寸的平方增大,导致模型参数过多,容易发生过拟合。例如:对于一幅1000×1000 的输入图像而言,如果下一个隐含层的神经元数目为106 个,那么将会有1000×1000×106=1012 个权重参数,可以想象,如此大规模的参数量使得网络很难训练。
为了解决上述问题,引入卷积(Convolution)来对输入的图像进行特征提取。卷积的计算范围是在像素点的空间邻域内进行的,因此可以利用输入图像的空间信息;此外,由于卷积具有局部连接、权重共享等特性,卷积核参数的数目也远小于全连接层。
卷积核(kernel):也被叫做滤波器(filter),假设卷积核的高和宽分别为 k h k_h kh 和 k w k_w kw,则将称为 k h × k w k_h×k_w kh×kw卷积,比如 3×5 卷积,就是指卷积核的高为3, 宽为5。卷积核中数值为对图像中与卷积核同样大小的子块像素点进行卷积计算时所采用的权重。
卷积计算(convolution):图像中像素点具有很强的空间依赖性,卷积(convolution)就是针对像素点的空间依赖性来对图像进行处理的一种技术。
特征图(feature map):卷积滤波结果在卷积神经网络中被称为特征图(feature map)。
在卷积神经网络中,卷积层的实现方式实际上是数学中定义的互相关 (cross-correlation)运算,具体的计算过程如下图所示,每张图的左图表示输入数据是一个维度为3 x 3的二维数组;中间的图表示卷积核是一个维度为2 x 2的二维数组。
卷积核的计算过程可以用下面的数学公式表示,其中 a a a 代表输入图片, b b b 代表输出特征图, w w w 是卷积核参数,它们都是二维数组, ∑ u , v \sum{u,v}{\ } ∑u,v 表示对卷积核参数进行遍历并求和。 b [ i , j ] = ∑ u , v a [ i + u , j + v ] ⋅ w [ u , v ] b[i, j] = \sum_{u,v}{a[i+u, j+v]\cdot w[u, v]} b[i,j]=u,v∑a[i+u,j+v]⋅w[u,v]举例说明,假如上图中卷积核大小是 2 × 2 2\times 2 2×2,则 u u u 可以取0和1, v v v 也可以取0和1,也就是说: b [ i , j ] = a [ i + 0 , j + 0 ] ⋅ w [ 0 , 0 ] + a [ i + 0 , j + 1 ] ⋅ w [ 0 , 1 ] + a [ i + 1 , j + 0 ] ⋅ w [ 1 , 0 ] + a [ i + 1 , j + 1 ] ⋅ w [ 1 , 1 ] b[i, j] = a[i+0, j+0]\cdot w[0, 0] + a[i+0, j+1]\cdot w[0, 1] + a[i+1, j+0]\cdot w[1, 0] + a[i+1, j+1]\cdot w[1, 1] b[i,j]=a[i+0,j+0]⋅w[0,0]+a[i+0,j+1]⋅w[0,1]+a[i+1,j+0]⋅w[1,0]+a[i+1,j+1]⋅w[1,1]
输入图像边缘位置的像素点无法进行卷积滤波,为了使边缘像素也参与卷积滤波,填充技术应运而生。填充是指在边缘像素点周围填充“0”(即0填充),使得输入图像的边缘像素也可以参与卷积计算。注意,在这种填充机制下,卷积后的图像分辨率将与卷积前图像分辨率一致,不存在下采样。
在上面的例子中,输入图片尺寸为 3 × 3 3\times3 3×3,输出图片尺寸为 2 × 2 2\times2 2×2,经过一次卷积之后,图片尺寸变小。卷积输出特征图的尺寸计算方法如下(卷积核的高和宽分别为 k h k_h kh和 k w k_w kw): H o u t = H − k h + 1 W o u t = W − k w + 1 H_{out}=H - k_h +1 \\ W_{out} = W - k_w + 1 Hout=H−kh+1Wout=W−kw+1如果输入尺寸为4,卷积核大小为3时,输出尺寸为4−3+1=2。当卷积核尺寸大于1时,输出特征图的尺寸会小于输入图片尺寸。如果经过多次卷积,输出图片尺寸会不断减小。为了避免卷积之后图片尺寸变小,通常会在图片的外围进行填充(padding)。
如上图(a)所示:填充的大小为1,填充值为0。填充之后,输入图片尺寸从 4 × 4 4\times4 4×4变成了 6 × 6 6\times6 6×6,使用 3 × 3 3\times3 3×3的卷积核,输出图片尺寸为 4 × 4 4\times4 4×4。
如上图(b)所示:填充的大小为2,填充值为0。填充之后,输入图片尺寸从 4 × 4 4\times4 4×4变成了 8 × 8 8\times8 8×8,使用 3 × 3 3\times3 3×3的卷积核,输出图片尺寸为 6 × 6 6\times6 6×6。
如果在输入图片第一行之前填充 p h 1 p_{h1} ph1行,在最后一行之后填充 p h 2 p_{h2} ph2行;在图片第1列之前填充 p w 1 p_{w1} pw1列,在最后1列之后填充 p w 2 p_{w2} pw2列;则填充之后的图片尺寸为 ( H + p h 1 + p h 2 ) × ( W + p w 1 + p w 2 ) (H + p_{h1} + p_{h2})\times(W + p_{w1} + p_{w2}) (H+ph1+ph2)×(W+pw1+pw2)。经过大小为 k h × k w k_h\times k_w kh×kw的卷积核操作之后,输出图片的尺寸为: H o u t = H + p h 1 + p h 2 − k h + 1 W o u t = W + p w 1 + p w 2 − k w + 1 H_{out} = H + p_{h1} + p_{h2} - k_h + 1 \\ W_{out} = W + p_{w1} + p_{w2} - k_w + 1 Hout=H+ph1+ph2−kh+1Wout=W+pw1+pw2−kw+1在卷积计算过程中,通常会在高度或者宽度的两侧采取等量填充,即 p h 1 = p h 2 = p h , p w 1 = p w 2 = p w p_{h1} = p_{h2} = p_h,\ \ p_{w1} = p_{w2} = p_w ph1=ph2=ph, pw1=pw2=pw,上面计算公式也就变为: H o u t = H + 2 p h − k h + 1 W o u t = W + 2 p w − k w + 1 H_{out} = H + 2p_h - k_h + 1 \\ W_{out} = W + 2p_w - k_w + 1 Hout=H+2ph−kh+1Wout=W+2pw−kw+1为了便于padding,卷积核大小通常使用1,3,5,7这样的奇数,这样如果使用的填充大小为 p h = ( k h − 1 ) / 2 , p w = ( k w − 1 ) / 2 p_h=(k_h-1)/2 ,p_w=(k_w-1)/2 ph=(kh−1)/2,pw=(kw−1)/2,则可以使得卷积之后图像尺寸不变。例如当卷积核大小为3时,padding大小为1,卷积之后图像尺寸不变;同理,如果卷积核大小为5,padding大小为2,也能保持图像尺寸不变。
在卷积操作时,通常希望输出图像分辨率与输入图像分辨率相比会逐渐减少,即图像被约减。因此,可以通过改变卷积核在输入图像中移动步长大小来跳过一些像素,进行卷积滤波。当Stride=1时,卷积核滑动跳过1个像素,这是最基本的单步滑动,也是标准的卷积模式。Stride=k表示卷积核移动跳过的步长是k。
下图步长为2的卷积过程,卷积核在图片上移动时,每次移动大小为2个像素点。
当高和宽方向的步幅分别为 s h s_h sh和 s w s_w sw时,输出特征图尺寸的计算公式是: H o u t = H + 2 p h − k h s h + 1 W o u t = W + 2 p w − k w s w + 1 H_{out} = \frac{H + 2p_h - k_h}{s_h} + 1 \\ W_{out} = \frac{W + 2p_w - k_w}{s_w} + 1 Hout=shH+2ph−kh+1Wout=swW+2pw−kw+1
卷积所得结果中,每个特征图像素点取值依赖于输入图像中的某个区域,该区域被称为感受野(receptive field),正所谓“管中窥豹、见微知著”。那么这个区域在哪呢,在卷积神经网络中,感受野是特征图(feature map)上的点对应输入图像上的区域。感受野内每个元素数值的变动,都会影响输出点的数值变化。
比如3×3卷积对应的感受野大小就是3×3:
而当通过两层3×3的卷积之后,感受野的大小将会增加到5×5:
因此,当增加卷积网络深度的同时,感受野将会增大,输出特征图中的一个像素点将会包含更多的图像语义信息。
前面介绍的卷积计算过程比较简单,实际应用时,处理的问题要复杂的多。例如:对于彩色图片有RGB三个通道,需要处理多输入通道的场景,相应的输出特征图往往也会具有多个通道。而且在神经网络的计算中常常是把一个批次的样本放在一起计算,所以卷积算子需要具有批量处理多输入和多输出通道数据的功能。
当输入含有多个通道时,对应的卷积核也应该有相同的通道数。假设输入图片的通道数为 C i n C_{in} Cin,输入数据的形状是 C i n × H i n × W i n C_{in}\times{H_{in}}\times{W_{in}} Cin×Hin×Win。
如果我们希望检测多种类型的特征,实际上我们可以使用多个卷积核进行计算。所以一般来说,卷积操作的输出特征图也会具有多个通道 C o u t C_{out} Cout,这时我们需要设计 C o u t C_{out} Cout个维度为 C i n × k h × k w C_{in}\times{k_h}\times{k_w} Cin×kh×kw的卷积核,卷积核数组的维度是 C o u t × C i n × k h × k w C_{out}\times C_{in}\times{k_h}\times{k_w} Cout×Cin×kh×kw。
假设输入图片的通道数为3,我们希望检测2种类型的特征,这时我们需要设计 2 2 2个维度为 3 × k h × k w 3\times{k_h}\times{k_w} 3×kh×kw的卷积核,卷积核数组的维度是 2 × 3 × k h × k w 2\times 3\times{k_h}\times{k_w} 2×3×kh×kw,如 下图所示。
对任一输出通道 c o u t ∈ [ 0 , 2 ) c_{out} \in [0, 2) cout∈[0,2),分别使用上面描述的形状为 3 × k h × k w 3\times{k_h}\times{k_w} 3×kh×kw的卷积核对输入图片做卷积。
将这 2 2 2个形状为 H o u t × W o u t H_{out}\times{W_{out}} Hout×Wout的二维数组拼接在一起,形成维度为 2 × H o u t × W o u t 2\times{H_{out}}\times{W_{out}} 2×Hout×Wout的三维数组。
在卷积神经网络的计算中,通常将多个样本放在一起形成一个mini-batch进行批量操作,即输入数据的维度是 N × C i n × H i n × W i n N\times{C_{in}}\times{H_{in}}\times{W_{in}} N×Cin×Hin×Win。由于会对每张图片使用同样的卷积核进行卷积操作,卷积核的维度是 C o u t × C i n × k h × k w C_{out}\times C_{in}\times{k_h}\times{k_w} Cout×Cin×kh×kw,那么,输出特征图的维度就是 N × C o u t × H o u t × W o u t N\times{C_{out}}\times{H_{out}}\times{W_{out}} N×Cout×Hout×Wout。
假设我们输入数据的维度是 2 × 3 × H i n × W i n 2\times{3}\times{H_{in}}\times{W_{in}} 2×3×Hin×Win,卷积核的维度与上面多输出通道的情况一样,仍然是 2 × 3 × k h × k w 2\times 3\times{k_h}\times{k_w} 2×3×kh×kw,输出特征图的维度是 2 × 2 × H o u t × W o u t 2\times{2}\times{H_{out}}\times{W_{out}} 2×2×Hout×Wout。如下图所示。
在卷积运算中,计算范围是在像素点的空间邻域内进行的,它代表了对空间邻域内某种特征模式的提取。对比全连接层将输入展开成一维的计算方式,卷积运算可以有效学习到输入数据的空间信息。
在上文中,我们介绍了感受野的概念,可以想像,在卷积操作中,每个神经元只与局部的一块区域进行连接。对于二维图像,局部像素关联性较强,这种局部连接保证了训练后的滤波器能够对局部特征有最强的响应,使神经网络可以提取数据的局部特征。全连接与局部连接的对比如下图所示。
同时,由于使用了局部连接,隐含层的每个神经元仅与部分图像相连,考虑本文开篇提到的例子,对于一幅 1000 × 1000 1000\times 1000 1000×1000 的输入图像而言,下一个隐含层的神经元数目同样为 1 0 6 10^6 106 个,假设每个神经元只与大小为 10 × 10 10\times 10 10×10 的局部区域相连,那么此时的权重参数量仅为 10 × 10 × 1 0 6 = 1 0 8 10\times 10\times 10^6=10^{8} 10×10×106=108 ,相交密集链接的全连接层少了4个数量级。
卷积计算实际上是使用一组卷积核在图片上进行滑动,计算乘加和。因此,对于同一个卷积核的计算过程而言,在与图像计算的过程中,它的权重是共享的。这其实就大大降低了网络的训练难度, 下图为权重共享的示意图。这里还使用上边的例子,对于一幅 1000 × 1000 1000\times 1000 1000×1000 的输入图像,下一个隐含层的神经元数目为 1 0 6 10^6 106 个,隐含层中的每个神经元与大小为 10 × 10 10\times 10 10×10 的局部区域相连,因此有 10 × 10 10\times 10 10×10 个权重参数。将这 10 × 10 10\times 10 10×10 个权重参数共享给其他位置对应的神经元,也就是 1 0 6 10^6 106 个神经元的权重参数保持一致,那么最终需要训练的参数就只有这 10 × 10 10\times 10 10×10个权重参数了。
在CNN网络中,通常使用多层卷积进行堆叠,从而达到提取不同类型特征的作用。比如:浅层卷积提取的是图像中的边缘等信息;中层卷积提取的是图像中的局部信息;深层卷积提取的则是图像中的全局信息。这样,通过加深网络层数,CNN就可以有效地学习到图像从细节到全局的所有特征了。对一个简单的5层CNN进行特征图可视化后的结果如下图所示。
通过上图可以看到,Layer1和Layer2种,网络学到的基本上是边缘、颜色等底层特征;Layer3开始变的稍微复杂,学习到的是纹理特征;Layer4中,学习到了更高维的特征,比如:狗头、鸡脚等;Layer5则学习到了更加具有辨识性的全局特征。
1×1 卷积,与标准卷积完全一样,唯一的特殊点在于卷积核的尺寸是1×1 ,也就是不去考虑输入数据局部信息之间的关系,而把关注点放在不同通道间。当输入矩阵的尺寸为3×3 ,通道数也为3时,使用4个1×1卷积核进行卷积计算,最终就会得到与输入矩阵尺寸相同,通道数为4的输出矩阵。
实现信息的跨通道交互与整合。考虑到卷积运算的输入输出都是3个维度(宽、高、多通道),所以1×1 卷积实际上就是对每个像素点,在不同的通道上进行线性组合,从而整合不同通道的信息。
对卷积核通道数进行降维和升维,减少参数量。经过1×1 卷积后的输出保留了输入数据的原有平面结构,通过调控通道数,从而完成升维或降维的作用。
利用1×1 卷积后的非线性激活函数,在保持特征图尺寸不变的前提下,大幅增加非线性
标准卷积是一种2D卷积,计算方式如下图所示。在2D卷积中,卷积核在图片上沿着宽和高两个维度滑动,在每次滑动过程时,对应位置的图像元素与卷积核中的参数进行乘加计算,得到输出特征图中的一个值。
2D卷积仅仅考虑2D图片的空间信息,所以只适用于单张2D图片的视觉理解任务。在处理3D图像或视频时,网络的输入多了一个维度,输入由 ( c , h e i g h t , w i d t h ) (c,height,width) (c,height,width) 变为了 ( c , d e p t h , h e i g h t , w i d t h ) (c,depth,height,width) (c,depth,height,width) ,其中 c c c 是通道数, d e p t h depth depth为输入数据的宽度。因此,对该数据进行处理时,就需要卷积也作出相应的变换,由2D卷积变为3D卷积。
在2D卷积的基础上,3D卷积[1]被提出。3D卷积在结构上较2D卷积多了一个维度,2D卷积的尺寸可以表示为 k h × k w k_h\times{k_w} kh×kw ,而3D卷积的尺寸可以表示为 k h × k w × k d k_h\times{k_w}\times{k_d} kh×kw×kd 。3D卷积的具体的计算方式与2D卷积类似,即每次滑动时与 c c c 个通道、尺寸大小为 ( d e p t h , h e i g h t , w i d t h ) (depth,height,width) (depth,height,width) 的图像做乘加运算,从而得到输出特征图中的一个值,如下图所示。
3D卷积的主要应用就是视频理解和医疗图像领域。
在视频理解任务中, k d k_d kd 就代表了时间维度,也就是每个3D卷积核处理的连续帧数。在视频理解领域的3D卷积计算中,首先会将 k d k_d kd 个连续帧组成一个3D的图像序列,然后在图像序列中进行卷积计算。3D卷积核会在 k d k_d kd 个连续帧上进行滑动,每次滑动 k d k_d kd 个连续帧中对应位置内的元素都要与卷积核中的参数进行乘加计算,最后得到输出特征图中的一个值。
3D CNN中,使用了3D卷积对人体行为进行识别,网络结构如下图所示。网络只有3个卷积层、1个全连接层以及2个池化层。其中,前两个卷积层为3D卷积层,卷积核大小为 7 × 7 × 3 7\times{7}\times{3} 7×7×3 和 7 × 6 × 3 7\times{6}\times{3} 7×6×3 ,也就是说每个卷积核处理3个连续帧中 7 × 7 7\times{7} 7×7 和 7 × 6 7\times{6} 7×6 大小的区域。
由于该模型使用了3D卷积,使得其可以从空间和时间的维度提取特征,从而捕捉从多个连续帧中得到的运动信息。
在医疗图像领域中,医学数据通常是3D的,比如我们要分割出的肿瘤就是3D的。如果用2D的图像处理模型去处理3D物体也是可以的,但是需要将生物医学影像图片的每一个切片成组的(包含训练数据和标注好的数据)的喂给模型进行训练,在这种情况下会存在一个效率问题,因此我们使用的模型即将U-Net中2D卷积改为3D的形式,即3D U-Net,如下图所示。
该模型的网络结构跟2D结构的U-Net基本一样,唯一不同就是将2D卷积操作换成了3D卷积,因此,不需要单独输入每个切片进行训练,而是可以采取输入整张图片到模型中。