本文参考了 这篇教程
(一)网络架构
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:
多个[CONV-RELU]层堆叠起来再POOL有利于大型的深度网络。
因为多个卷积和RELU非线性可以在灾难性池化之前尽量更多的提取输入中的信息,发现更复杂的特征。之所以用destructive 形容pooling是因为,常用的
2
∗
2
2*2
2∗2步长为2的池化会直接删掉75%的数据实现降维和减参,虽然有利于实际需要,但太暴力,直接失去卷积层提取出来的有关输入的大量信息。
Prefer a stack of small filter CONV to one large receptive field CONV layer.堆叠几个小卷积核胜过一个大卷积核。
假设堆叠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的花哨的对性能也没什么用