卷积神经网络(Convolutional Neural Network, CNN)是一种深度学习模型或类似于人工神经网络的多层感知器,常用来分析视觉图像。
- CNN的每一层都由大量节点组织,每一个节点是一个神经元
- CNN的输入层就是图像的原始像素,而输出层中的每一个节点代表了不同类别的可信度
CNN结构
与传统的神经网络DNN相比,CNN可以节省大量的参数,节约内存,加快模型的训练速度。下图是具体的CNN结构图:
CNN网络一般有5个层级结构:
- 输入层
- 卷积层
- 激活层
- 池化层
- 全连接层
输入层
输入层是整个神经网络的输入,在处理图像的CNN中,它一般代表了一张图片的像素矩阵。在上图的最左侧就可以代表一张图片,即三维矩阵。三维矩阵的长和宽代表了图像的大小,而三维矩阵的深度代表了图像的色彩通道。比如黑白图片的深度为1,而在RGB色彩模式下,图像的深度为3。
与传统神经网络/机器学习一样,模型的输入的需要进行预处理操作,常见的3种预处理操作有:
- 去均值
- 归一化
- PCA/SVD降维
卷积层
卷积层是CNN最重要的部分。和传统全连接层不同,卷积层中每一个节点的输入只是上一层神经网络的一小块。下图为一个3*3的过滤器(filter)或者内核(kernel)对5*5的输入进行卷积操作:
卷积核可以将当前层神经网络上的一个子节点矩阵转化为下一层神经网络上的一个节点矩阵(长宽均为3,但深度不限)。卷积核的尺寸指的是卷积核输入节点矩阵的大小。卷积核处理的矩阵深度和当前层神经网络节点矩阵(输入节点矩阵)的深度是一致的,而卷积核的深度指的是输出节点的深度。
卷积层结构的前向传播就是通过将一个卷积核从神经网络当前层的左上角移动到右下角(即滑过整个图像),并在移动过程中重复上述运算:
调整输出矩阵大小
为了避免卷积层前向传播过程中节点矩阵的尺寸的变化,可以在当前矩阵的边界上加入全0填充。这样可以使得卷积层前向传播结果矩阵的大小和当前层矩阵保持一致:
步长(Stride)
下图显示了卷积核步长为2且使用全0填充时,卷积层前向传播的过程:
输出矩阵的大小
宽度:
,其中表示对向下取整
高度:
,其中表示对向下取整
深度由人工指定。
- :输入图像的宽度
- :输入图像的高度
- :卷积核的宽度
- :卷积核的高度
- :全0填充的宽度
- :移动步长
参数共享(权值共享)
在介绍参数共享前我们应该知道卷积核的权重是经过学习得到的,并且在卷积过程中卷积核的权重是不会改变的,这就是参数共享的思想。
卷积层中所有卷积核的参数是共享的,这样就可以巨幅减少神经网络上的参数。假设输入层矩阵的的维度为32*32*3,第一层卷积层卷积核尺寸为5*5,深度为16,那么这个卷积层的参数个数为5*5*3*16 + 16 = 1216个,+16表示偏置项参数的个数。如果使用全连接层,那么全连接层的参数个数为32*32*3*500=1536000个。相比之下,卷积层的参数个数要远远小于全连接层。卷积层的参数个数与图片的大小无关,它只和卷积核的尺寸、深度以及当前输入层的深度有关。这使得CNN可以很好地扩展到更大的图像数据上。
为什么需要权值共享呢?同一层下的神经元的连接参数只与特征提取的有关,而与具体的位置无关,因此可以保证同一层中所有位置的连接是权值共享的。例如:第一层隐层是一般用边缘检测,第二层是对第一层学到的边缘曲线组合得到一些特征,比如:角度、线形等;第三层会学到更加复杂的特征,比如:眼睛、眉毛等。对于同一层来说,他们提取特征的方式是一样的,第三层的神经元都是用来提取“眼睛”的特征,因此,需要计算的参数是一样的。
多核卷积
如权值共享的部分所说我们用一个卷积核操作只能得到一部分特征可能获取不到全部特征,这么一来我们就引入了多核卷积。用每个卷积核来学习不同的特征(每个卷积核学习到不同的权重)来提取原图特征。
上图的图片经过三个卷积核的卷积操作得到三个特征图。需要注意的是,在多核卷积的过程中每个卷积核的大小应该是相同的。
激活层
所谓激活,实际上是对卷积层的输出结果做一次非线性映射。
如果不用激活函数(其实就相当于激活函数是f(x)=x),这种情况下,每一层的输出都是上一层输入的线性函数。容易得出,无论有多少神经网络层,输出都是输入的线性组合,与没有隐层的效果是一样的,这就是最原始的感知机了。
常用的激活函数有:
- Sigmoid函数
- Tanh函数
- ReLU
- Leaky ReLU
- ELU
- Maxout
激活层建议:首先ReLU,因为迭代速度快,但是有可能效果不佳。如果ReLU失效的情况下,考虑使用Leaky ReLU或者Maxout,此时一般情况都可以解决。Tanh函数在文本和音频处理有比较好的效果。
池化层
池化(Pooling):也称为欠采样或下采样。主要用于特征降维,压缩数据和参数的数量,减小过拟合,同时提高模型的容错性。主要有:
- Max Pooling:最大池化(对局部的值取最大)
- Average Pooling:平均池化(对局部的值取平均)
- Stochastic Pooling:随机池化(根据概率对局部的值进行采样,采样结果便是池化结果)
池化层不会改变三维矩阵的深度,但是它可以缩小矩阵的大小。通过池化层,可以进一步缩小最后全连接层中节点的个数,从而达到减少整个神经网络参数的目的。使用池化层既可以加快计算速度也可以防止过拟合。
池化层前向传播的过程也是通过移动一个类似filter(卷积核)的结构完成的。与卷积层的filter类似,池化层的filter也需要人工设定filter的尺寸、全0填充以及filter的步长。卷积层和池化层的filter移动方式也是相似的,唯一的区别在卷积层使用的filter是横跨整个深度的,而池化层使用的filter只影响一个深度上的节点。所以池化层的filter除了在长和宽两个维度移动外,它还需要在深度这个维度移动。
全连接层
在经过多轮卷积层和池化层的处理之后,在CNN的最后一般会由1到2个全连接层来给出最后的分类结果。在全连接层之前,如果神经元数目过大,学习能力强,有可能出现过拟合。因此,可以引入dropout操作,来随机删除神经网络中的部分神经元,来解决此问题。经过几轮卷积层和池化层的处理之后,可以认为图像中的信息已经被抽象成了信息含量更高的特征。可以将卷积层和池化层看成自动图像特征提取的过程。在提取完成之后,仍然需要使用全连接层来完成分类任务。
Softmax层
最后,通过Softmax层可以得到当前样例属于不同种类的概率。下图展示了一个含有多个卷积层+激励层+池化层的过程: