在学习笔记P20-CNN中已经介绍了CNN的一些知识,这篇主要是补充和更深程度的梳理:
上文中提到"从效果上来看,卷积层相比于全连接层减少了参数、实现了参数共享。”即,本质上卷积和全连接的区别是,全连接层从输入特征空间中学习的是全局模式,而卷积层学习到的是局部模式,对于图像来说,学到的就是输入图像的二维小窗口(filter)中发现的模式。
这个重要的特性使卷积神经网络具有如下两个性质:
1)卷积网络学习到的模式具有平移不变性(translation invariant)。即,上文中提到的same patterns appear in different regions.对于全连接网络来说,如果模式出现在新的位置,它只能重新学习这个模式。这使得卷积网络神经网络在处理图像时可以高效利用数据(因为视觉世界从根本上具有平移不变性),它只需要更少的训练样本就可以学到具有泛化能力的数据表示。
2)CNN可以学到模式的空间层次结构(spatial hierarchies of patterns)。如下图,第一个卷积层将学习较小的局部模式(比如边缘),第二个卷积层讲学习由第一层特征组成的更大的模式,以此类推。这使得CNN可以有效地学习越来越复杂、越来越抽象的视觉概念(因为视觉世界从根本上具有空间层次结构)。
卷积由以下两个关键参数所定义:
1)从输入中提取的图块尺寸:这些图块大小通常是3X3或5X5。
2)输出特征图的深度:卷积所计算的过滤器的数量。
卷积的工作原理:
在3D输入特征图上滑动(slide)3X3或5X5的窗口,在每个可能的位置停止并提取周围特征的3D图块【形状为(window_height, window_width, input_depth)】。然后每个3D图块与学到的同一个权重矩阵【卷积核】做张量积,转换形成形状为(output_depth,)的1D向量。然后对所有这些向量进行空间重组,时期转换为形状为(height, width, output_depth)的3D输出特征图。输出特征图中的每个空间位置都对应于输入特征图中相同位置。例子,利用3X3的窗口,向量output[i, j, :]来自3D图块input[i-1:i+1, j-1:j+1, :]。
注意,输出的宽度和高度可能与输入的宽度和高度不同。不同的原因可能有两点:
1)边界效应,可以通过对输入特征图进行填充来抵消。
2)使用了步幅(stride)。
学到这里,大概都会有些疑问:CNN中只保留卷积层不做池化会怎样?为什么要用池化的方式对特征图做下采样?
以手写体识别(28X28X1)为例,只构造3个卷积层,filter大小3X3:
这种架构存在的问题:
1)这种架构不利于学习特征的空间层级结构。
2)最后一层的特征图对每个样本共有22X22X64=30976个元素。如果将其展平并在上面添加一个大小为512层的Dense层,那一层将会有1580万个参数。这对于这样一个小模型来说参数太多了,会导致严重的过拟合。
简而言之,使用下采样的原因,一是减少需要处理的特征图的元素个数,二是通过让连续卷积层的观察窗口越来越大(即窗口覆盖原始输入的比例越来越大),从而引入空间过滤器的层级结构。
小结:
1)CNN是用于计算机视觉任务的最佳机器学习模型。即是在非常小的数据集上也可以从头开始训练一个CNN,而且得到不错的结果。
2)在小型数据集上的主要问题是过拟合。在处理图像数据时,数据增强是一种降低过拟合的强大方法。
3)利用特征提取,可以很容易将现有的CNN复用于新的数据集。对于小型图像数据集,这是一种很有价值的方法。
4)作为特征提取的补充,还可以使用微调,将现有模型之前学到的一些数据表示应用于新问题。这种方法可以进一步提高模型性能。