PVAnet综述以及CNN常用结构与trick小结

《PVANET: Deep but Lightweight Neural Networks for Real-time Object Detection》

想和大家分享一篇早一点的论文,主要目的有两点。一是做一个学习笔记备份,以防我的OneNote那天崩了。二是这篇文章运用了先前许多论文的trick和优点,可以通过这篇文章回顾一下CNN的进化史。


论文地址:https://arxiv.org/abs/1608.08021


提出背景:

    通常的目标检测都是CNN feature extraction + region proposal + RoI classification

The key design principle:

    less channels with more layers

正文开始:

PVANET主要运用了改进C.ReLU,Inception,HyperNet,Residual Structures,Batch Normalization,Plateau detection这几种方法。下面依次介绍。

1. C.ReLU:

    由于底层检测的特征大多都是成对出现,例如检测桌角,检测眼睛,检测耳朵等,底层卷积层卷积核存在相位相反的情况,如果只是用ReLU作为激活函数则会丢失负响应信息,可以认为底层卷积层的卷积核之间存在冗余。 于是提出C.ReLU ,注意卷积核个数减半



从图中可以看出许多卷积核都是相位相反出现的。而根据统计直方图则更直观了。


    公式很简单,就是将原始的响应乘以-1,然后再经过ReLU,然后将两种响应叠加,即输出维度为输入维度2倍。但减少了一半的卷积核,所以总体维度不变,计算量减半。

回到PVA网络中,则是加了一层调整激活函数斜率和偏差。如下图结构:



2. Inception:

Inception V1网络 

提出背景: 通常认为,更深更宽的网络会更好。然而更大的网络意味着更多的参数,容易过拟合,尤其是当标记的样本在训练集中是有限的。同时会利用更多的计算资源。 用多尺度的卷积核可以学习到特征的多样性。


具体结构:

    具体结构如图a,但是这样做数据量很大,则用1*1卷积核进行降维 具体过程为,假设现在有28*28*192特征图,要用128个3*3卷积核卷积,则需要3*3*192*128 然而如果先用96个1*1卷积核进行通道整合,则需要1*1*192*96+3*3*96*128,是原来0.58倍。

InceptionV3网络(V2后面说):

 设计准则:(这个是直接copy别人博客的一段内容)https://blog.csdn.net/wspba/article/details/68065564

    (1. 避免表达的瓶颈,表达的尺寸(即feature map的大小)不应该出现急剧的衰减,如果对流经层(尤其是卷积层)的信息过度的压缩,将会丢失大量的信息,对模型的训练也造成了困难。 

    (2. 在网络中对高维的表达进行局部的处理,将会使网络的训练增快。 

    (3. 在较低维度的输入上进行空间聚合,将不会造成任何表达能力上的损失,因为feature map上,临近区域上的表达具有很高的相关性,如果对输出进行空间聚合,那么将feature map的维度降低也不会减少表达的信息。这样的话,有利于信息的压缩,并加快了训练的速度。 

    (4.设计网络的深度和宽度达到一个平衡的状态,要使得计算资源平衡的分配在模型的深度和宽度上面,才能最大化的提高模型的性能



V3网络和V1网络的主要改进就在于将5*5结构转换成了3*3结构。这个也符合VGG最小卷积核特点。

回到PVA网络中,使用了Inception结构,区别也就是将5*5变成了3*3,如下图:



3. HyperNet结构

由于要进行目标检测,多尺度的特征组合肯定是必要的,其核心思想就是从不同卷积层中提取出feature map,将它们组合在一起然后ROI Pooling得到新的feature map,然后再进行目标检测,类似于特征金字塔。结构如下:


没什么好说的,PVA感觉就是直接拿过来用了。


4. Residual Structures:

    这也是用的非常多的一种结构,由微软亚研院弄得深度残差网络结构,主要是为了解决网络加深之后的退化问题和梯度弥散问题,结构众所周知,在PVA中只是在inception layers之间加了short cut



5. 在ReLU激活层之前增加Batch Normalization层:

 BN也是在InceptionV2网络中弄的,就是一公式,推导比较复杂我就不列写了。我个人感觉BN已经成了做深度学习的标配,主要是解决反向传播中的提督问题。


6. Plateau detection:

    这是一种非常有意思的动态控制学习速率的方法。主要思想是根据一个周期内loss的平均改变量来决定是否改变学习速率。举个例子,首先利用移动平均线方法处理loss,在某个周期内如果loss下降的量小于阈值,则认为模型处于plateau,则将学习速率以某种方式衰减,然后继续迭代,直到预定的迭代次数或者学习速率降到阈值以下等停止训练。


总结:

先放一张PVA的全图:


感觉这个网络主要是一种思想的融合,效果也不错,代码在github有,我还在调准备把前面部分拿过来接上yolo后面试试效果。


参考文献:

1. C.ReLU: Understanding and Improving Convolutional Neural Networks via Concatenated Rectified Linear Units

2. Going deeper with convolutions

3. Batch normalization: Accelerating deep network training by reducing internal covariate shift.

4. Rethinking the Inception Architecture for Computer Vision

5. PVANET: Deep but Lightweight Neural Networks for Real-time Object Detection

猜你喜欢

转载自blog.csdn.net/m0_37731749/article/details/80049386