10.5 一个完整的卷积神经网络
之前我们学过了全连接层、卷积层、池化层,这一节我们就把这些模块组合起来实现一个完整的卷积神经网络( Convolutional Neural Network,CNN)。
10.5.1 如何进行图像分类
之前我们讲了卷积层和池化层,它们的输出都是带有空间位置信息的特征图,但是这些特征信息如何用来进行图像分类呢?
在进行了足够的卷积层后,得到的特征图都是具有概括性的高级特征了。我们只需要把多通道的高级特征图展开,连成一个一维向量,后边再接全连接层进行分类就可以了。
想想我们之前用全连接神经网络进行手写数字识别。因为每个图片只有一个数字,并且数字居中。没有利用到局部性和平移不变性,所以全连接网络就可以很好的识别。现在有了卷积层提取高级特征,后边用全连接层在高级特征(而不是像素值)上进行分类任务,在更通用的图像分类任务上会取得更好的效果。
10.5.2 各个模块的作用
卷积层
一个卷积层由多个Filter构成,每个Filter利用图像问题的局部性和平移不变性,用滑动窗口对局部多通道特征进行融合计算,输出一个新的特征。每个Filter输出的新特征构成一个通道。多个Filter构成多个通道。
激活函数
卷积层输出的特征需要经过激活函数来进行激活,带来非线性。最常使用的激活函数就是ReLU。
池化层
一个或者多个卷积层后,一般会通过一个最大池化层来提取最强特征,抑制其他特征。并且缩小特征图尺寸,缩写特征图的操作也被叫做下采样(Subsampling)。
Flatten
将特征图展平为一维向量
全连接层
卷积操作完成后,最后用全连接进行汇总,完成分类/回归任务。
Dropout
防止过拟合,一般应用在全连接层,如果你要应用在卷积层输出的特征图,注意需要将多个通道的同一位置一起丢弃(Spatial Dropout)。
10.5.3 组合多个模块
假设我们输入的还是之前手写数字识别的28x28的灰度图像。
- 输入:28x28x1
- C1,卷积层:8个3x3的卷积核,Padding=1,Stride=1,输出28x28x8的特征图。ReLU激活。
- P2,最大池化层:池化核2x2,步长为2,输出为14x14x8的特征图。
- C3,卷积层:16个3x3的卷积核,Padding=1,Stride=1,输出14x14x16的特征图。ReLU激活。
- P4,最大池化层,池化核2x2,步长为2,输出为7x7x16的特征图。
- C5,卷积层:32个3x3的卷积核,Padding=0,Stride=1,输出5x5x32的特征图。ReLU激活。Flatten展开为1x800的特征。
- F6,全连接层:800x64,ReLU激活。
- 输出层,64x10,Softmax。
接下来我们计算一下每层的参数: 对于C1层,每个Filter的参数等于卷积核的3x3x1,其中1是输入通道数。加上bias的一个参数,一共10个参数,8个Filter,一共80个参数。
池化层没有参数。
C3层,每个Filter的参数等于卷积核的3x3x8,其中8是输入通道数。加上bias的一个参数,一共73个参数,16个Filter,一共1168个参数。
C5层,每个Filter的参数为(3x3x16+1)x32=4640个参数。
F6层,800x64+64=51264个参数。
输出层,64x10+10=650个参数。
层 | 参数量 |
---|---|
C1 | 80 |
C3 | 1168 |
C5 | 4640 |
F6 | 51264 |
输出层 | 650 |
可以看到参数量最大的就是全连接层,它占了所有参数的88%。
10.5.4 网络结构图
通过观察上边的网络结构图,可以发现随着网络深度的增加,特征图的尺寸在逐渐缩小,通道数在逐步增加。以人脸识别为例,浅层每个特征的感受野小,每个通道需要更多的特征去编码一些低级的局部特征(边缘,纹理)。深层随着每个特征感受野的增加,一个通道只需要少量的特征就可以编码更高级的全局语义(五官,表情)。通道数的增加使得网络可以学到更多的潜在高级特征。比如:微笑的眼睛,生气的嘴巴等。
换句话说,低级特征数量少,对位置敏感,所以需要更大的特征图来精确定位位置,但是通道数少。高级全局特征数量多,对位置不那么敏感,所以通道数多,特征图尺寸小。