CNN——卷即神经网络(Convolutional Neural Network),主要应用来图像处理领域。它的网络结构中有两个不同于FNN的核心的地方:卷积层和池化层。并且它的正则化技术相对于FNN也有一定的修改。
CNN architecture
CNN中,主要由卷积操作和池化操作构成,紧接其后的可能有一层或者多层的全连接层,用来将feature map转化成一个向量。
Feature map
简单的理解,在CNN中,每一层的输入输出不再是一个通过一维索引得到的向量,而是通过二维索引得到的一个矩阵(如果是图像,每个矩阵元素代表一个像素点)。在一层中,这两个索引唯一定义了该feature map的一个像素。
Input layer
以RGB图像为例,有三个通道,大小为
N0×T0
,则每个样本可以用
X(t)fjk
表示,其中
t∈[0,Tmb−1],j∈[0,N0−1],t∈[0,T0−1]
,一般地,我们会对输入做中心化处理,这里的中心化有两种选择,第一种:求得训练集所有像素的平均值,然后用样本减去该平均值;第二种:以每个feature map为单位,求得平均值,即对应位置的元素减去所有样本中对应位置元素的平均值,然后用样本减去该均值。二者选其一即可。
PS:在解决回归问题时,不要用中心化。
Padding
在后面的卷积操作中我们可以看到,卷积会缩小feature map的尺寸,为了保持尺寸不变,我们采用padding 的方式,即在卷积操作之前,在原feature map周围填充一定量的0像素,从而保证卷积之后的feature map和原feature map大小一致。
Convolution
卷积是CNN中最基础的操作,也是卷即神经网络名字的由来,它通过一个权重矩阵,将一个特征图(输入)映射为另一个特征图(输出),这个权重是一个四维张量:第一维
F
为输入的特征图的个数,第二维
PS:一般认为人对外界的认知是从局部到全局的,而图像的空间联系也是局部的像素联系较为紧密,而距离较远的像素相关性则较弱。因而,每个神经元其实没有必要对全局图像进行感知,只需要对局部进行感知,然后在更高层将局部的信息综合起来就得到了全局的信息,因此我们的卷积的操作只用在很小的范围内进行,[局部感知]是降低CNN中参数的神器之一,另外一个就是[权值共享],即认为图像的一部分的统计特性与其他部分是一样的,这样我们使用一组参数,在输入特征图上滑动卷积,得到新的特征图。
输出的特征视图的大小,还与滑动的步长有关,即我在一个位置进行卷积操作之后,向右滑动几个像素进行下一步操作。
如上图,
F
即输入特征图的个数,在图像中我们可以理解成经过预处理的三个通道的图像,
PS:传统的堆叠性网络,同一卷积层中,卷积核的大小是一定的,但是在诸如GoogleNet的网络中,有一个叫Inception的结构,它在同一层使用了多个尺寸的卷积核
输出特征图的大小与输入特征图的大小和局部感知域的大小有如下关系:
Pooling
Pooling操作是最基本的维度约简的操作,虽然现在在CNN里面用的已经越来越少了。它的操作方式有点类似卷积,Pooling操作中,我们也有一个池化域,在这个范围内,提取特征图的某一个特征,常用的有平均池化(求池化域内像素的平均值作为特征),最大池化(求池化域内像素的最大值作为特征),池化操作时,不考虑padding的元素。
Towards fully connected layers
前向全连接层一般以池化层的输出作为输入,可以理解为一种像素的加权平均(类似FNN),即对每个特征图所有像素,加权平均得到一个值,对于具有
F
个特征图的输入,得到一个
fully connected layers
在上述操作完成之后,剩下的就与FNN完全相同了,输入向量的加权平均,然后经过激活函数得到输出。
Output connected layer
最终的输出同FNN,如果是分类问题,一般输出的结果为一个向量,维度同类别数,将加权平均的结果通过softmax函数得到最终结果。
BN to CNN
同样的,我们可以在CNN中使用BN操作,不同的是,并不是所有的隐藏层都需要执行BN,pooling层的输出不执行的BN。进行标准化的均值,是在所有像素上进行计算,方差亦是如此,为了还原原数据分布,这里我们同样有两个额外的参数,具体推导,参见原文
Realistic architectures
介绍完了CNN的几种基本层的结构和功能,接下来我们就要用这些基本结构,拼凑出一个完整的网络:
CNN中,一般是一个卷积层加上一个激活层(有BN加上BN)构成一个基本单元,经过几次操作之后会有一个池化操作,然后如此反复,最后到达全连接层(一般一层,也可能有多层),然后输出,激活函数Relu可以用其他的激活函数代替,全连接层的激活和BN操作的顺序可以互换,一般的输出映射用sigmoid函数。
Some CNN example
自从CNN提出后,有许多应用比较成功的网络,其中包括LeNet,AlexNet,VGG,GoogleNet,ResNet。有兴趣的小伙伴可以自行百度。