CNN Case Study

常见CNN模型总结

Posted by huanrong on 2019-04-29

本文根据《计算机与智能硬件体系结构》课程所介绍的几个经典CNN网络整理而成。

AlexNet


网络结构

不算输入层,总共为8层。

第一层
$227×227×3$(原图中223应该为笔误)的图像;卷积核数量为96,用两个GPU各计算一半;步长为4;padding=0,表示不补充边缘。
卷积后的图像大小为:$w =h= \lfloor \frac{227-11}{4} + 1 \rfloor = 55$;维度(dimension)为:96。

然后做了一次Local Response Normalized。池化层pool_size = $(3, 3)$, stride = 2, padding = 0。最终获得第一层卷积的feature map,输出的大小为$27 \times 27 \times 96$。

第二层
输入为第一层的feature map
卷积核大小为 $3 \times 3 \times 48$;卷积核数量为256,其中两个GPU各有128个卷积核;pad = 2, stride = 1。
进行LRN,池化层pool_size = $(3, 3)$, stride = 2
输出大小$13 \times 13 \times 256$。
计算过程如下:
$w_1 =h_1 = \lfloor \frac{27+2 -3}{1} + 1 \rfloor = 27$
$w_2 =h_2 = \lfloor \frac{27-3}{2} + 1 \rfloor = 13$
注意此处的pad与吴恩达深度学习课程中的padding含义不同。

第三层
输入为第二层的输出,卷积核个数为384,kernel_size = $3 \times 3 \times 256$, padding = 1,第三层没有做LRN和pooling。

第四层
输入为第三层的输出,卷积核个数为384, kernel_size = $3 \times 3$, padding = 1, 和第三层一样,没有LRN和Pool

第五层
输入为第四层的输出,卷积核个数为256, kernel_size = $3 \times 3$, padding = 1, 然后进行max_pooling, pool_size = (3, 3), stride = 2。
输出大小:$6 \times 6 \times 256$
$\lfloor {\frac{13-3}{2}} \rfloor +1 = 6$
(MathJax解析不了\over,调试了好久……)

第六层
采用的滤波器的尺寸 $(6 \times 6 \times 256)$ 和待处理的feature map的尺寸$(6\times 6\times 256)$相同,即每个$(6 \times 6 \times 256)$ 尺寸的滤波器对第六层的输入数据进行卷积运算生成一个运算结果,通过一个神经元输出这个运算结果。
共有4096个这样尺寸的滤波器对输入数据进行卷积,通过4096个神经元的输出运算结果;然后通过ReLU激活函数以及dropout运算输出4096个本层的输出结果值。

第七、八层
全连接层。最后经过一个softmax生成1000维的输出。全连接层中使用了RELU和Dropout。


(在单GPU下的网络结构图)

Local Response Normalization(局部响应归一化)

在神经网络中,用激活函数将神经元的输出做一个非线性映射。tanh和sigmoid这样的传统激活函数值域都是有范围的,但是ReLU激活函数值域没有区间,因此需要对ReLU得到的结果进行归一化。

论文中应用的局部归一化公式为:
$$b^i_{(x,y)} = \frac{a^i_{(x,y)}} {k+\alpha
\displaystyle\sum_{j=max(0,i-n/2)}^{min(N-1,i+n/2)}((a_{(x,y)}^j)^2)^ \beta}$$

类似于最大最小归一化。
假设有一个向量 $X = [x_1, x_2, …, x_n]$
那么将所有的数归一化到0-1之间的归一化规则是:$x_i = \frac{x_i}{x_{max} - x_{min}}$

但此处为什么分母是平方和我还没弄清楚(或许是为了让$b^i_{(x,y)}$更小,更容易落入(0,1)的区间?)。

参数$\alpha, \beta, k$在验证集中确定,最终结果为:$k=2, n=5, \alpha=10^{-4}, \beta = 0.75$

Overlapping Pooling(覆盖的池化操作)

在top-1,和top-5中使用覆盖的池化操作分别将error rate降低了0.4%和0.3%。论文中说,在训练模型过程中,覆盖的池化层更不容易过拟合。

如何防止Overfitting

Data Augmentation

数据扩张也是一个值得研究的领域,只需要对原始的数据进行合适的变换(如剪切、翻转、改变像素值等操作),就可以获得更多的数据集,以防止过拟合。论文中就是从$256\times 256$大小的图片中随机提出$227\times 227$的patches来实现的。(最近实验室项目也正在研究这个问题,场景是产生足够多带标签的物品的图片,以进行文字识别)

Dropout

在全连接层中去掉了一些神经节点,达到防止过拟合的目的

理解dropout

VGGNet



Reference

  1. ImageNet Classification with Deep Convolutional Neural Networks
  2. 机器学习进阶笔记之三 | 深入理解Alexnet
  3. 深入理解AlexNet网络