学习目标
- 学习CNN基础和原理
- 使用Pytorch框架构建CNN模型,并完成训练
下面内容把CNN和经典模型相关的学习笔记进行整合。
卷积神经网络(简称CNN)是一类特殊的人工神经网络,是深度学习中重要的一个分支。CNN在很多领域都表现优异,精度和速度比传统计算学习算法高很多。特别是在计算机视觉领域,CNN是解决图像分类、图像检索、物体检测和语义分割的主流模型。CNN是一种层次模型,输入的是原始的像素数据。CNN通过卷积(convolution)、池化(pooling)、非线性激活函数(non-linear activation function)和全连接层(fully connected layer)构成。
卷积层主要用来提取特征,低层提取边缘、角点等简单特征,高层的卷积核则可以提取更高级的特征。对于图像的卷积计算,示例如下:
池化(Pooling)是卷积神经网络中另一个重要的概念,它实际上是一种形式的降采样。有多种不同形式的非线性池化函数,而其中“最大池化(Max pooling)最为常见。它是将输入的图像划分为若干个矩形区域,对每个子区域输出最大值。最常用形式的池化层是每隔2个元素从图像划分出2*2的区块,然后对每个区块中的4个数取最大值。这将会减少75%的数据量。
直觉上,这种机制能够有效地原因在于,在发现一个特征之后,它的精确位置远不及它和其他特征的相对位置的关系重要。池化层会不断地减小数据的空间大小,因此参数的数量和计算量也会下降,这在一定程度上也控制了过拟合。通常来说,CNN的卷积层之间都会周期性地插入池化层。
全连接层则和普通神经网络一样,用于最后的分类输出,通常最后一层是softmax层。
通过多次卷积和池化,CNN的最后一层将输入的图像像素映射为具体的输出。如在分类任务中会转换为不同类别的概率输出,然后计算真实标签与CNN模型的预测结果的差异,并通过反向传播更新每层的参数,并在更新完成后再次前向传播,如此反复直到训练完成 。
CNN和普通全连接网络比,最大的特点是:局部连接,权值共享。
在计算机视觉中,图像中的某一块区域中,像素之间的相关性与像素之间的距离同样相关,距离较近的像素间相关性强,距离较远则相关性就比较弱,由此可见局部相关性理论也适用于计算机视觉的图像处理领域。因此,局部感知采用部分神经元接受图像信息,再通过综合全部的图像信息达到增强图像信息的目的。对于一个1000 × 1000的输入图像而言,如果下一个隐藏层的神经元数目为10^6个,采用全连接则有1000 × 1000 × 10^6 = 10^12个权值参数,如此数目巨大的参数几乎难以训练;而采用局部连接,隐藏层的每个神经元仅与图像中10 × 10的局部图像相连接,那么此时的权值参数数量为10 × 10 × 10^6 = 10^8,将直接减少4个数量级。
每个神经元仅与输入神经元的一块区域连接,这块局部区域称作感受野(receptive field)。
权值共享即,卷积核的权重系数进行卷积时,在同一张图片上权重值系数是一样的,这就是权值共享。但是,一个卷积核仅提取了图像的一种特征,如果要多提取出一些特征,可以增加多个卷积核,不同的卷积核能够得到图像的不同映射下的特征,称之Feature Map
。另外,偏置参数也是共享的,同一种滤波器共享一个。
随着网络结构的发展,研究人员最初发现网络模型结构越深、网络参数越多模型的精度更优。比较典型的是AlexNet、VGG、InceptionV3和ResNet的发展脉络。
AlexNet 该模型一共分为八层,5个卷积层,以及3个全连接层,在每一个卷积层中包含了激励函数Relu以及局部响应归一化(LRN)处理,然后在经过降采样(pool处理)。
VGG是比AlexNet更深的分类网络,最大的特点是引入小卷积核,具体如下笔记图:
ResNet最大的特点是引入残差项,直接学习输入输出之间的残差,比VGG等学习输入输出映射更容易,可以有效解决深层网络梯度消失、梯度爆炸等问题。且论文原作者假设,深层网络未必表现更好是优化问题导致,越深的模型越难优化,其次更深的模型表现不会比浅层更差。若某层输出结果已经较好地拟合期望结果,那么多加一层不会使模型变差,因为引入残差连接以后,此时学习的是恒等映射,残差值为0。
inception结构的主要思路是:如何使用一个密集成分来近似或者代替最优的局部稀疏结构。inception V1的结构如下图所示。
对于上图的几点解释:
1、采用不同大小的卷积核意味着不同大小的感受野,最后拼接意味着不同尺度特征的融合;
2、卷积核大小采用1、3和5,主要是为了方便对齐;
3、文章说很多地方都表明pooling挺有效,所以Inception里面也嵌入了;
4、网络越到后面,特征越抽象,而且每个特征所涉及的感受野也更大了,因此随着层数的增加,3x3和5x5卷积的比例也要增加。
但是,使用5x5的卷积核仍然会带来巨大的计算量。 为此采用1x1卷积核来进行降维。
例如:上一层的输出为100x100x128,经过具有256个输出的5x5卷积层之后(stride=1,pad=2),输出数据的大小为100x100x256。其中,卷积层的参数为5x5x128x256。假如上一层输出先经过具有32个输出的1x1卷积层,再经过具有256个输出的5x5卷积层,那么最终的输出数据的大小仍为100x100x256,但卷积参数量已经减少为1x1x128x32 + 5x5x32x256,大约减少了4倍。
在inception结构中,大量采用了1x1的矩阵,主要是两点作用:对数据进行降维以及引入更多的非线性,提高泛化能力,因为卷积后要经过ReLU激活函数。