CNN Understanding
文章目录
CNN 网络中常见层的介绍和理解。
一、边界检测(引子)
通过设计某个滤波器(filter,也可以称为 kernel),去和图像做卷积操作,可以发现图像中的某些特征。CNN 就是通过一个个 filter, 不断提取特征,从局部的特征到整体的特征,从而完成了图像识别的功能。
二、CNN 中的基本概念
CNN网络中常见的结构是:卷积、池化和激活。卷积层是CNN 网络的核心,激活函数获得非线性特征,池化层主要体现在降采样:保留显著特征、降低特征的维度、扩大 kernel 的感受野。
pooling 可以提供旋转不变性?
更加准确的是说 max pooling 具有微小形变的鲁棒性。当我们正面拍一些图像,在某些地方得到 activation,然后旋转一定的角度,依然能够在这个点得到 activation。这个其实 maxpooling 的决定的。
- padding 填白
从上面的引子中,我们可以知道,原图像在经过filter卷积之后,变小了,从(8,8)变成了(6,6)。假设我们再卷一次,那大小就变成了(4,4)了。这样有啥问题呢? 主要有两个问题:
- 每次卷积,图像都缩小,这样卷不了几次就没了;
- 相比于图片中间的点,图片边缘的点在卷积中被计算的次数很少。这样的话,边缘的信息就易于丢失。
为了解决这个问题,我们可以采用padding的方法。我们每次卷积前,先给图片周围都补一圈空白,让卷积之后图片跟原来一样大,同时,原来的边缘也被计算了更多次。
我们把上面这种“让卷积之后的大小不变”的padding方式,称为 “Same”方式, 把不经过任何填白的,称为 “Valid”方式。这个是我们在使用一些框架的时候,需要设置的超参数。
- stride 步长
前面我们所介绍的卷积,都是默认步长是1,但实际上,我们可以设置步长为其他的值。
3.pooling 池化
这个pooling,是为了提取一定区域的主要特征,并减少参数数量,防止模型过拟合。 除了MaxPooling,还有AveragePooling,顾名思义就是取那个区域的平均值。
global average pooling or global max pooling
GAP 可以实现任意图像大小的输入。
global average pooling 和 average pooling (local)的差别在于 global,local 是取feature map 上的一个子区域求均值和最大值,然后滑动子区域;global 就是针对整个 feature map 求解均值和最大值。
Global Pooling就是池化窗口的大小 = 整张特征图的大小。这样,每个 W×H×C 的特征图输入就会被转化为 1×1×C 的输出,也等同于每个位置权重都为 1/(W×H) 的全连接层操作。
使用全局池化之后,特征图每个 channel 都被压缩成了一个点,实际上是对没给个channel 进行了信息压缩。
4.对多通道(channels)图片的卷积
如果输入图片是三维的呢(即增多了一个channels),比如是(8,8,3),这个时候,我们的filter的维度就要变成(3,3,3)了,它的 最后一维要跟输入的channel维度一致。 这个时候的卷积,是三个channel的所有元素对应相乘后求和,也就是之前是9个乘积的和,现在是27个乘积的和。因此,输出的维度并不会变化。还是(6,6)。
但是,一般情况下,我们会 使用多了filters同时卷积,比如,如果我们同时使用4个filter的话,那么 输出的维度则会变为(6,6,4)。
三、CNN的结构组成
-
Convolutional layer(卷积层–CONV)
-
Pooling layer (池化层–POOL)
Pooling layers are generally used to reduce the size of the inputs and hence speed up the computation.
注意这里的 filter size 是2, 然后stride 是2.
In summary, the hyperparameters for a pooling layer are:
- Filter size
- Stride
- Max or average pooling
CNN 中 stride、kernel、padding 的计算
定义以下参数定义 , ,
输入尺寸为
输出尺寸为
则有卷积尺寸变化为 $$ W_{n e w}=\frac{W-F+2 * P}{S}+1 $$
比如,输入是28,卷积核是$3*3$, 步长 stride为 1,padding 为1,通过上述的公式得到新的输出是 28。和原来的输入是一样的。
- Fully Connected layer(全连接层–FC)
这里需要说明的是,在经过数次卷积和池化之后,我们 最后会先将多维的数据进行“扁平化”,也就是把 (height,width,channel)的数据压缩成长度为 height × width × channel 的一维数组,然后再与 FC层连接,这之后就跟普通的神经网络无异了。
- Batch normalization & ReLU
After applying filters on the input, we apply a batch normalization followed by a ReLU for non-linearity. The batch normalization renormalizes data to make learning faster with the Gradient descent. 使用batch normalization是为了 learn faster(gradient descent); 使用 relu 是为了增加非线性
全连接层过多的参数会导致过拟合,所以有一些专门的方法去解决过拟合,比如说 dropout。
四、卷积网络 VS. 传统神经网络
卷积网络相比于传统神经网络有两点好处:
1.参数共享机制(parameters sharing)
参数共享机制,让我们的网络的参数数量大大地减少。从此明白了卷积神经网络(CNN)
- 连接的稀疏性(sparsity of connections)
由卷积的操作可知,输出图像中的任何一个单元,只跟输入图像的一部分有关系:
Computer Vision 中常见的是以下三类问题:
- Image classification
- Object detection
- Neural style transfer
1D convolution is covered here, because it’s usually under-explained, but it has noteworthy benefits.
They are used to reduce the depth (number of channels). Width and height are unchanged in this case. If you want to reduce the horizontal dimensions, you would use pooling, increase the stride of the convolution, or don’t add paddings. The 1D convolutions computes a weighted sum of input channels or features, which allow selecting certain combinations of features that are useful downstream. 可以降低 number of channels (depth),而不改变 width or height。如果想要改变该尺寸,那么使用 pooling 技术
CNN 概念介绍
alexnet
卷积简单说是相乘然后累加求和。
卷积填充中的mode: valid,same,full。valid:不进行填充;same:是以卷积核的中心和图像array的左上角进行对齐;full:以卷积核的右下角和图像array的左上角对齐。
卷积核
水平卷积核识别横线
垂直卷积核识别竖线
Scharr边界更加锐利
所以卷积核是否能够识别,归结为“物以类聚”。如果卷积核形状和图像的物体形状相似,那么是容易识别;如果相反,那么不容易识别。
传统的CNN 结构
同一图像输入,用不同的卷积核得到的是不同的结果,但其中也有一些类似的地方。
为什么深层次的网络识别效果好?
- 深层次网络的 receptive (感受野)更大
- 浅层次的特征可以汇聚成更复杂的特征
pooling: 降采样的操作,提高效率(特征数量减少);使得某些特征更健壮。
dropout 中的 keep_prob=1
表示保留全部的数据; keep_prob=0
表示全部丢弃数据。注意其余的数据还需要进行1/keep_prob
,以保证和不变。
在卷积网络中一般倾向于使用多个小的卷积核而不是一个大的卷积核。原因:参数量 $77 > 33*3$;多层卷积核可以引入非线性。
adam 对于不同的参数使用不同的学习率;BGD 对于不同的参数使用相同的学习率。所以建议使用 adam 作为optim。
图像识别的实质仍然是分类,进一步的工作就是目标检测。(如果图像分类做好了,那么是可以去做目标检测)。object detection的演变流程:
- R-CNN: region-CNN, 首先是对于图像处理得到若干CNN 能够直接处理的小图,然后每个图进行得到的embedding +svm 得到该小框物体的置信度,执行度最大的话就是最后的结果。
- Fast R-CNN:首先图像过一个CNN得到feature map,然后提取region 中相应的feature,feature +svm 得到置信度。这样共享了 feature map,大大提高了时间效率。(解决的是多次计算CNN 的效率问题)
- Faster R-CNN:首先图像过CNN得到feature map,然后通过
region proposel network
从CNN 中得到框,然后通过一个 classifer得到置信度。(解决的是计算 region的效率问题)
五种卷积
训练更加高效的神经网络逐渐成为人们关注的焦点,设计轻量级模型主要通过以下三种方式:
(1)减少网络参数量和计算量
(2)量化参数,减少每个参数占用内存
(3)神经网络架构搜索(NAS)
以下四种网络是通过第一种方式来设计轻量级模型。
Separable Convolution
Separable Convolution 或者 Depthwise Separable Convolution 来自Google设计的移动端轻量化网络 mobilenet。
Separable Convolution 将传统卷积分解为Depthwise Convolution与Pointwise Convolution两部分,有效的减小了参数数量。
下面给出一个例子说明。
此时,卷积层共4个Filter,每个Filter包含了3个Kernel,每个Kernel的大小为3×3。因此卷积层的参数数量可以用如下公式来计算:
核心思想是将一个完整的卷积运算分解为两步进行,Depthwise Convolution(逐通道卷积,卷积核的shape $ 卷积核w * 卷积核 h * 输入通道数$)与Pointwise Convolution(逐点卷积,卷积核的shape $1*1 * 输入通道数 * 输出通道数$)。
Depthwise Convolution完成后的Feature map数量与输入层的depth相同,但是这种运算对输入层的每个channel独立进行卷积运算后就结束了,没有有效的利用不同map在相同空间位置上的信息。因此需要增加另外一步操作来将这些map进行组合生成新的Feature map,即接下来的Pointwise Convolution。
Pointwise Convolution的运算与常规卷积运算非常相似,不同之处在于卷积核的尺寸为 1×1×M,M为上一层的depth。所以这里的卷积运算会将上一步的map在深度方向上进行加权组合,生成新的Feature map。
对比一下两个的参数量:
|
|
所以同样是 4 个feature map, separable convolution 的参数个数基本上是常规卷积的 $1/3$。所以在参数量相同的情况下,采用 Separable Convolution 的神经网络可以做到更深。
普通卷积同时考虑区域和通道,而可分离卷积先考虑区域然后再考虑通道,实现了区域和通道的分离。
但 Separable Convolution 也不是没有缺点,使用该卷积的网络结构在 train 的时候占用显存比较大。
efficientnet 的模型很小,因为本地保存的模型 ckpt 容量代销和模型的参数量相关,模型参数和模型自身 layer 的设计有关,但是模型训练时占用的显存不是和模型参数量成一定的线性关系,更多的是和模型 inference 与 backward 过程中产生的 feature map 大小有关,另外和网络的深度也有一定的关系(这样中间变量可能更多了),在 backward 的时候更是直接翻倍,因为需要保存特征图的梯度,可能需要 2 倍的显存占用。
同时网络中的多分支也是比较消耗内存的,参考凯明大佬的regnet
参考文献
MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications
EfficientDet和EfficientNet的模型很小,为什么占用的显存很高呢?
Group Convolution
分组卷积最早出现在 AlexNet 中,当时的硬件资源有限,训练 AlexNet 时卷积操作不能全部放在同一个 GPU 处理,所以作者把 feature maps 分给多个 GPU 分别进行处理,最后把多个 GPU 的结果进行融合。
图中将输入数据分成 2 组(组数为 g),注意这个只是在深度上进行划分,即几个通道编成一组,具体的数量由 $C_1 /g$ 决定。因为输出数据的改变,相应的,卷积核也需要做出同样的改变。即每组中卷积核的深度也就变成了(C1/g),而卷积核的大小是不需要改变的,此时每组的卷积核的个数就变成了(C2/g)个,而不是原来的C2了。
然后用每组的卷积核同它们对应组内的输入数据卷积,得到了输出数据以后,再用concatenate的方式组合起来,最终的输出数据的通道仍旧是C2。也就是说,分组数g决定以后,那么我们将并行的运算g个相同的卷积过程,每个过程里(每组),输入数据为H1×W1×C1/g,卷积核大小为h1×w1×C1/g,一共有C2/g个,输出数据为H2×W2×C2/g。
Dilation Convolution
dilation convolution (空洞卷积)最早应用于语义分割任务。语义分割是一个密集型预测任务,需要针对图像进行像素级别(pixel-wise)分类。
- pooling下采样操作导致的信息丢失是不可逆的,通常的分类识别模型,只需要预测每一类的概率,所以我们不需要考虑pooling会导致损失图像细节信息的问题,但是做像素级的预测时(譬如语义分割),就要考虑到这个问题了。
- 增加感受野,适应不同物体尺寸的变化。
因此,空洞卷积能够在不降低空间分辨率的情况下,有效地提取不同尺度的上下文信息。
所以就要有一种卷积代替pooling的作用(成倍的增加感受野),而空洞卷积就是为了做这个的。通过卷积核插“0”的方式,它可以比普通的卷积获得更大的感受野,这个idea的motivation就介绍到这里。
下面是常规的卷积操作
卷积核有个参数 diated rate (扩张率)
参考文献
MULTI-SCALE CONTEXT AGGREGATION BY DILATED CONVOLUTIONS
Transposed Convolutions
反卷积和上采样的区别
转置卷积 (transposed convolution) 一般又称为反卷积(Deconvolution)。可以理解为卷积的逆过程,实现上采用转置卷积核的方式。但是这种反卷积的叫法不合适,转置卷积不能实现卷积操作的逆过程,只能还原 shape 打下,不能还原 value 的大小。
普通的卷积和池化会缩小图像的尺寸,有时候为了得到和原图等大的分割图,需要进行上采样卷积。
从卷积到转置卷积的理解可以查看这里:https://www.malaoshi.top/show_1EF52HLXBmqf.html
(对于反卷积,以下有不同的形态)
反卷积的使用场景一般在语义分割和生成模型(比如说GAN )中使用较多。
upPooling: 当upPooling 的时候填充的是0。
(这里针对MaxPooling)可以看到UnPooling操作相当于在进行MaxPooling操作时候对局部最大值的出现位置进行了记录,然后在反向过程补全的时候将最大值填充回原处,然后剩余的地方全部填充零。
这个是需要记录位置的
Deformable convolutional networks
deformable convolutional networks (DCN)
Paper: Deformable Convolutional Networks
github: https://github.com/CharlesShang/DCNv2
这个论文也是非常的简单直白,关键是从结果上也是非常有效的。
Convolutional neural networks (CNNs) are inherently limited to model geometric transformations due to the fixed geometric structures in their building modules. In this work, we introduce two new modules to enhance the transformation modeling capability of CNNs, namely, de- formable convolution and deformable RoI pooling.
这个是 DCN (deformable convolutional networks) 的初衷:大多使用 fixed filter,作者提出可以使用可变的 filter。
The first is to build the training datasets with sufficient desired variations. This is usually realized by augmenting the existing data samples, e.g., by affine transformation. (extensive data augmentation)
The second is to use transformation-invariant features and algorithms.
提高模型的效果的两种方法:(1)大数据去覆盖所有的 case(2)提高算法模型本身的泛化性能
左图是 standard 3*3 conv 和 DCN conv 直观的对比;右图是具体实现时候的细节:
As illustrated in Figure 2, the offsets are obtained by applying a convolutional layer over the same input feature map. The convolution kernel is of the same spatial resolu- tion and dilation as those of the current convolutional layer (e.g., also 3 × 3 with dilation 1 in Figure 2). The output offset fields have the same spatial resolution with the input feature map. The channel dimension 2N corresponds to N 2D offsets. During training, both the convolutional kernels for generating the output features and the offsets are learned simultaneously. To learn the offsets, the gradients are back- propagated through the bilinear operations in Eq. (3) and Eq. (4). It is detailed in appendix A.
实现的细节还不是很懂
特征图,再额外经过一个卷积层,生成 offset 的结果,然后把这个 offset 和特征图融合。
可解释性
从效果图上看,这个还是有提升的。并且不会增加 train 和 test 的成本。
可以看出在几乎不增加参数量与运行时间的情况下,论文的方法带来了较大的性能提升。
deformable Convolution可变卷积针对的对象是卷积本身,因此膨胀卷积,3D卷积都可以用可变卷积的形式
参考文献(TODO)
sparse convolution
SECOND- Sparsely Embedded Convolutional Detection
point cloud data contain accurate depth information and can be generated by LiDAR or RGB-D camers.
VoxelNet 效果比较好,但很慢,所以需要使用 SPConv 而不是传统的 Conv
our sparse-convolution-based detector achieves a factor-of-4 speed enhancement during training on the KITTI dataset and a factor-of-3 improvement in the speed of inference.
投影到 BEV (Bird’s-Eye-View-Based) 或者前视(front-view)
3D Semantic Segmentation with Submanifold Sparse Convolutional Networks
这个提出了其中的一种 sparse convolutional network
First, we pad the input with (f − 1)/2 zeros on each side, so that the output will have the same size as the input. Next, we restrict an output site to be active if and only if the site at the corresponding site in the input is active (i.e., if the central site in the receptive field is ac- tive). Whenever an output site is determined to be active, its output feature vector is computed by the SSC convo- lution
参考资料
SECOND: Sparsely Embedded Convolutional Detection
这个已经读过了,但不懂稀疏conv 的操作和细节
3D Semantic Segmentation with Submanifold Sparse Convolutional Networks
英文版:https://towardsdatascience.com/how-does-sparse-convolution-work-3257a0a8fd1
中文版:通俗易懂的解释Sparse Convolution过程
虽然中文版也没有看懂
文章作者 jijeng
上次更新 2020-04-07