Deep Learning (10) - Convolutional Neural Network
终于到CNN了,卷积神经网络。顾名思义,加入了卷积层的神经网络就是一个CNN。
卷积的定义
卷积的数学定义在wiki page上可以找到。大致如下:
注:实际上机器学习里的convolution是cross-correlation
卷积参数
卷积核
上面做卷积的3x3的矩阵就是卷积核,又可以称作filter,滤波器,过滤器等等。指的都是同一个东西。
在图像处理中,卷积通常被用来做边缘检测。例如上图的3x3 filter可以检测竖边缘。也可以变成下面这样来检测横边缘:
- : channel number
- : 下一个layer输入的channel number,本层等于filter number
- f是卷积核的大小,s是步长,后面会讲到
Padding
Padding要解决的问题就是,如果没有padding,则输出矩阵会越来越小,因为当时,总小于n。如果有了padding,则这个数字修正成。此时可以修订padding的大小来调整输出矩阵的大小。
Stride
Stride指步长,上面图中的例子步长采用的是1,步长也可以是任意其他值。当步长为s,padding为p时,输出矩阵的尺寸为:
卷积神经网络
一个完整的卷积神经网络通常包括3个部分:
- Convolution (CONV)
- Pooling (POOL)
- Fully connected (FC)
其中的Fully connected就是经典的全连接神经网络。
卷积网络
下图就是一层卷积网络的大致形态
- 输入是6x6x3的矩阵
- 经过两路卷积核和non-linear activation得到4x4x2的输出
- 其中b是bias,activation采用ReLU
这样一层网络的参数有:
- : filter size
- : padding size
- : stride
- : number of filters in layer
- Input:
- Output:
- Each filter has shape:
- After activations: , with mini-batch:
- Weights:
- Bias:
如果一个64x64的数据输入,采用10个3x3的卷积核,需要多少个模型参数?
答案是:(3x3+1)*10 = 280个,与输入图像的尺寸无关。即用小尺寸样本数据训练出来的卷积模型,同样可以适用于大尺寸的图像。
Pooling
翻译做池化层。一般有两种池化策略:
- Max pooling
- Average pooling
前者使用的更多一些。
具体做法用两张图表示:
Max pooling
Average pooling
这里f=2表示,基于2x2的矩阵做池化,s=2表示每次偏移2获得下一个池化矩阵。f, s都是超参数。所以池化层没有learnable parameter,只有hyper parameter。
为什么要有池化层?网上有很多讨论,摘一段:
本质上,是在精简feature map数据量的同时,最大化保留空间信息和特征信息,的处理技巧;目的是,通过feature map进行压缩浓缩,给到后面hidden layer的input就小了,计算效率能提高;CNN的invariance的能力,本质是由convolution创造的;
我的理解,有几个原因(可能不一定对,请斧正):
- 卷积滑动累加时,区域有重叠,所以数据是有冗余的,需要精简
- 池化可以减少位移带来的影响,如max pooling只取一小块区域的最大值,这样虽然有小小位移,输出数据对此并不敏感
- 可以降维,减少后续数据计算量,也可以减少过拟合的风险,但是增加了欠拟合的风险。
完整的卷积神经网络
一个完整的卷积神经网络大概长这样:
CONV-POOL-CONV-POOL-FC-FC-Softmax
- 每个卷积网络后跟一个池化层,共两个卷积网络两个池化层
- 卷积层后,输出串行化到一个列向量里,作为后续神经网络的输入
- FC3和FC4是两个全连接的标准神经网络
- 最后是Softmax的输出层
这样一个网络所有的参数如下表: