普通卷积、空洞卷积、反卷积以及池化的感受野以及输出尺寸
本文主要是针对卷积神经网络中如何通过搭建正确的网络结构来提高目标分类、目标检测以及目标分割的精度。下面我将分别介绍常用卷积的不同以及不同卷积的各个用途。
普通卷积
目前随着计算机视觉的不断发展以及现在计算单元计算速度的提升,使得卷积神经网络进行视觉推理已经是不可阻挡的趋势,那么如何有效的搭建网络结构成为了提高精度的有效方法。
使用3个3x3来代替7x7: 研究发现一个尺寸较大的卷积核能够被几个较小的卷积核代替,由于他们在原图上拥有相同的感受野,但是,在几个较小卷积核构造成的module效果要比尺寸较大卷积核要好,原因有两点:(1)构造成的module参数量要比大的卷积核参数量少,比如一个7x7的卷积核,其参数量为49,3个3x3的卷积核便可以代替一个7x7,其参数量仅为3x3x3,少了接近2倍;(2)构成的module参数量比较少,相当于较大尺寸卷积核+正则化效果,这样的设计不仅可以大幅度减少参数量并且可以使得网络可以学到更加统一的、具有表征性质的特征空间。
DeppCNN缺点: 随着网络深度的不断提升,为了使得参数量减少,出现了up-sampling以及pooling层,虽然这些层可以有效的降低特征图的尺寸减少网络模型的参数量,但是其也有缺点,缺点主要为:(1)up-sampling以及pooling是选择性质的,并不具有可学习性质。(2)使用这些层,会造成内部数据结构丢失,空间层级化信息丢失。(3)小物体的特征信息重建困难,例如,网络结构中包含了4个pooling层,那么在重建小于2^4=16像素的目标物体理论上无法重建,丢失了目标物体的空间信息。
科普知识
普通卷积输出特征图大小计算公式:
out=[(in_feature+2 * padding-kernel_size)/stride]+1
普通卷积特征与特征之间的距离计算公式:
jout=jin * s
普通卷积特征图起始位置计算公式:
start_out=start_in+((kernel_size-1)/2-p)jin
普通卷积感受野计算公式:
rout=rin+jin(kernel_size-1)
为了解决由up_sampling以及pooling产生的空间信息以及层级信息丢失的问题,提出了空洞卷积(dilation convolution)。
空洞卷积
空洞卷积不仅可以扩大神经元的感受野,并且可以保留内部数据的空间结构。具体来说,主要是普通卷积如3x3卷积核,每一个上一层特征图上的点都会被卷积3次,第一次作为最右侧的像素被卷积,第二次作为中间的像素被卷积,第三次作为最左侧的像素被卷积,这样会造成累计卷积。那么,如果这个像素点正好是分割的边界点,那么他会和周围的像素融合在一起,如果融合了更多A物品的像素,则会判断为A的像素块,相反,如果融合了更多B物品的像素,则会判断为B的像素块,这样会造成物品与物品之间的边界的不确定性。而空洞卷积,则有效的减缓了该问题,让某些元素的卷积次数变得更少,更加保留了数据的空间信息。
空洞卷积其实是一种 特征图 上数据采样的方式,只是普通卷积是密集采样而空洞卷积是稀疏采样,不会改变学习到的参数,改变的只是输入数据的采样方式。空洞卷积与pooling同样的都是增加了感受野,但是最大的区别在于pooling引入了平移不变性的操作,而空洞卷积保留了特征图相对的空间信息,分类模型需要平移不变性来保证抽象的特征不因空间位置的改变而改变,而检测或者分割是要求保持空间位置的不变性,因此需要保持空间的相对不变性。
科普知识
空洞卷积输出特征图大小计算公式:
out=[(in_feature+2 * padding-d*(kernel_size-1)-1)/stride]+1
空洞卷积的感受野计算公式:
等效于空洞之前卷积的大小的感受野,只是空洞卷积的卷积核计算变为了dilate_rate*(kernel_size-1)+1,因此空洞卷积感受野可以等效为
rout=rin+dilate*(kernel_size-1)*jin
反卷积
反卷积操作和upsample是类似的。
Deformable Conv(可变形卷积)
普通卷积上图(a)所示,以3x3卷积为例,对于每个输出y0,都要从x上采样9个位置,而这9个位置就是就是向以x0中心位置扩散的一个grid形状,(-1,-1)即中心位置左上角,同理(1,1)即中心位置右下角,计算公式如图所示:
由上是普通卷积计算的方法,而Deformable Conv是也是类似,不过添加了一个方向向量即:
由于方向向量的增量并不一定是整数,因此,在计算卷积位置的时候需要进行双线性插值,获得对应的值。