本文参考了 这篇教程
(一)网络架构
CNN的网络架构中最常见的形式就是堆叠好几个[CONV-RELU]层再跟上一个POOL层,重复几次,直到输入图像已经被转换为空间尺寸很小的输出 。即:
∗
*
∗表示重复
POOL?表示可能池化也可能不池化
0
≤
N
≤
3
0\leq N\leq3
0≤N≤3
0
≤
K
<
3
0\leq K<3
0≤K<3
0
≤
M
0\leq M
0≤M
比如下面这几种网络形式:
几个Tips:
因为多个卷积和RELU非线性可以在灾难性池化之前尽量更多的提取输入中的信息,发现更复杂的特征。之所以用destructive 形容pooling是因为,常用的 2 ∗ 2 2*2 2∗2步长为2的池化会直接删掉75%的数据实现降维和减参,虽然有利于实际需要,但太暴力,直接失去卷积层提取出来的有关输入的大量信息。
假设堆叠3个 3 ∗ 3 3*3 3∗3的卷积核,卷积核之间当然是要引入非线性的(通过RELU)。
那么第一个卷积核可以看到输入体的 3 ∗ 3 3*3 3∗3的空间范围,而第二个卷积核可以看到第一个卷积核的输出体的 3 ∗ 3 3*3 3∗3范围,因此相当于能看到输入体的 5 ∗ 5 5*5 5∗5范围,同理第三个卷积核可以看到输入体的 7 ∗ 7 7*7 7∗7的范围。相比于直接只用一个接收域为 7 ∗ 7 7*7 7∗7的卷积核,一样都是看到输入体的 7 ∗ 7 7*7 7∗7空间范围,但前者有2个优点:
一是表达能力更强,一个大卷积核只有一次非线性操作,表达能力不如三个小卷积核堆叠的方案,后者多次引入非线性使得表达能力更强more expressive。
二是需要的参数更少,假设所有的volume都有C个channel(?),则一个
7
∗
7
7*7
7∗7卷积核需要的参数的个数是
7
∗
7
∗
C
∗
C
=
49
C
2
7*7*C*C=49C^2
7∗7∗C∗C=49C2,三个堆叠的
3
∗
∗
3
3**3
3∗∗3卷积核总共需要的参数个数是
3
∗
C
∗
(
3
∗
3
∗
C
)
=
27
C
2
3*C*(3*3*C)=27C^2
3∗C∗(3∗3∗C)=27C2(由于没懂channel在这里代表什么,我没搞懂这个怎么算的···),所以需要的参数更少。
(二)每层参数设置(通用经验)
1.输入层
- 图像尺寸能被2整除很多次。如32,64,96,224,384,512。
一个原因是因为池化滤波器尺寸是2*2且步长为2。
2.卷积层
- 用小尺寸的滤波器,如 3 ∗ 3 3*3 3∗3,最多用 5 ∗ 5 5*5 5∗5,当然也有在第一个卷积层用 7 ∗ 7 7*7 7∗7的,那是为了减少参数和对硬件存储量的要求,用的很少。
用 5 ∗ 5 5*5 5∗5和 7 ∗ 7 7*7 7∗7的很少,最多只会在look at the input image 的第一个卷积层用!
- 步长S=1。
- 卷积前要给输入体补0,保证卷积后空间大小不变。
3 ∗ 3 3*3 3∗3则P=1,在边界一周补1个0,可保证卷积后空间大小不变;
5 ∗ 5 5*5 5∗5则P=2,在边界一周补2个0,可保证卷积后空间大小不变;
其他尺寸, F ∗ F F*F F∗F,则 P = ( F − 1 ) / 2 P=(F-1)/2 P=(F−1)/2,可保证卷积后空间大小不变;
3.池化层
最常用的就是 2 ∗ 2 2*2 2∗2的步长为2 的最大池化max-pooling
没有其他,只用这个就行。
其他什么 3 ∗ 3 3*3 3∗3的步长2的花哨的对性能也没什么用