在此总结一下个人对cnn的认识。
1 核心思想
1 感受野与神经元
19世纪60年代,科学家提出了感受野(Receptive Field)。当时科学家针对猫的视觉皮层细胞研究发现,每一个视觉神经元只会处理一小块区域的视觉图像。80年代日本科学家提出神经认知机(Neocoginitron)的概念,可以算作cnn的最初的实现原型。 神经认知机包括抽取特征的S-cells(对应cnn的卷积核滤波操作)和对抗形变的C-cell(对应cnn的激活函数和池化)。
注意要点:每个神经元处理一小块区域。 其中的神经元就是cnn中的一个神经节点;一小块区域就是一个卷积核覆盖的区域。 所以在卷积层需要多少神经元呢? 答案就是需要多少个卷积核覆盖输入数据。每一个卷积层可以有多个卷积核,这些卷积核按照统一的步长移动,卷积层神经元节点的个数只跟卷积的步长有关。后面细说
2 局部连接(locally connected)
有了感知野的概念,就可以理解局部连接了。 人工神经网络中,每个神经元和前一层的输出是全连接的,造成中间参数(w,b)数量极多; 人工神经网络使用多神经元,每个神经元有自己的感受野,即每个神经元与前一层的输出的部分连接。
3 卷积核(kernel)
- 每个神经元都会看一部分数据,看到以后怎么抽取特征呢? 卷积核就是神经元加工数据的依据。卷积核通常是n*m二维的矩阵,n和m也是神经元的感受野。n*m 矩阵中存的是对感受野中数据处理的系数。
- 通常的说法是卷积核滑动来处理整个数据(例如一张图片),其实也就是每次滑动相当于跳到下个神经元进行特征抽取。滑动过程相当于目光移动,直到扫视完一个完整数据。
- 卷积计算过程又成为滤波(filter), 一个卷积核的滤波可以用来提取特定的特征,例如可以提取物体轮廓、颜色深浅等。通过卷积层从原始数据中提取出新的特征的过程又成为feature map(特征映射)。
- 一个卷积核一共m*n个参数,滑动经过整个样本数据(例如一张图片)就得到特定特征; 多个卷积核分别做以上feature map就可以分别提取出不同的特征;一个卷积层针对一个数据的处理就是由多个卷积核分别扫视一次这个数据,抽取出多种特征。 filter_size是指filter的大小,例如3*3; filter_num是指每种filter_size的filter个数,通常是通道个数。
- 一个卷积核使用一套权值以便”扫视’数据每一处时以同样的方式抽取特征,最终得到的是一种特征。 在tensorflow定义conv2d时需要指定卷积核的尺寸,本人现在的理解是一个卷积层的多个卷积核使用相同的m*n, 只是权重不同。 则一个卷积层的参数总共m*n*filter_num个,比全连接少了很多。
- 通道(chennel)的概念稍微有点抽象。通道可以理解为视角、角度。例如同样是提取边界特征的卷积核,可以按照R、G、B三种元素的角度提取边界,RGB在边界这个角度上有不同的表达;再比如需要检查一个人的机器学习能力,可以从特征工程、模型选择、参数调优等多个方面检测。
- 计算过程举例:
图中input是同一个数据的三个通道数据,可以看到周边有填充0; 有两个卷积核(filter, kernel),每个filter对应每个通道有一组w权重;一个filter滑动到一个位置后计算三个通道的卷积,求和,加bias,得到这个filter在该位置的最终结果;每个filter的输出是各个通道的汇总;输出的个数与filter个数相同。下面是第二个filter映射某个位置的演示图:
- 卷积核是二维的,输入数据通常需要变成二维数据;
- 总结一句,卷积核做到了权值共享。图片如下:
其中右侧同颜色的神经元是同一个filter,使用一套权值。
4 激活函数
激活函数是为了做非线性映射。 多种激活函数的比较及选择问题再做一篇了解吧,本文不讲。
5 池化层
池化层是为了降采样(subsampling, down-sampling).
其中最大池化用的比较多。上图就是使用2×2池化窗口、2为步长的最大池化。
池化可以减少输出维数,同时一定程度上保持了最突出的信息。
池化可以提供基本的平移、旋转不变性。最大化操作会提取出相同的值而不管你是否有一定程度内的平移或旋转。
6 要点总结
卷积神经网络的要点就是局部连接(Local Connection)、权值共享(Weight Sharing)和池化层(pooling)中的降采样(Down-Sampling)。 其中局部连接和权值共享降低了参数量,使训练复杂度大大下降,并减轻了过拟合。 同时权值共享还赋予了卷积网络对平移的容忍性,而池化层降采样则进一步降低了输出参数量,同时赋予模型对轻度变形的容忍性,提高了模型的泛化能力。 cnn相对传统机器学习无需做特征工程。
7 cnn通常流程
cnn可以有各种形式的设计。
下面看一个简单的例子:
如图所示,一个卷积神经网络由若干卷积层、Pooling层、全连接层组成。你可以构建各种不同的卷积神经网络,它的常用架构模式为:
INPUT -> [[CONV]*N -> POOL?]*M -> [FC]*K
也就是N个卷积层叠加,然后(可选)叠加一个Pooling层,重复这个结构M次,最后叠加K个全连接层。
从图1我们可以发现卷积神经网络的层结构和全连接神经网络的层结构有很大不同。全连接神经网络每层的神经元是按照一维排列的,也就是排成一条线的样子;而卷积神经网络每层的神经元是按照三维排列的,也就是排成一个长方体的样子,有宽度、高度和深度。
对于图1展示的神经网络,我们看到输入层的宽度和高度对应于输入图像的宽度和高度,而它的深度为1。接着,第一个卷积层对这幅图像进行了卷积操作(后面我们会讲如何计算卷积),得到了三个Feature Map。这里的”3”可能是让很多初学者迷惑的地方,实际上,就是这个卷积层包含三个Filter,也就是三套参数,每个Filter都可以把原始输入图像卷积得到一个Feature Map,三个Filter就可以得到三个Feature Map。至于一个卷积层可以有多少个Filter,那是可以自由设定的。也就是说,卷积层的Filter个数也是一个超参数。我们可以把Feature Map可以看做是通过卷积变换提取到的图像特征,三个Filter就对原始图像提取出三组不同的特征,也就是得到了三个Feature Map,也称做三个通道(channel)。
继续观察图1,在第一个卷积层之后,Pooling层对三个Feature Map做了下采样(后面我们会讲如何计算下采样),得到了三个更小的Feature Map。接着,是第二个卷积层,它有5个Filter。每个Fitler都把前面下采样之后的3个Feature Map卷积在一起,得到一个新的Feature Map。这样,5个Filter就得到了5个Feature Map。接着,是第二个Pooling,继续对5个Feature Map进行下采样,得到了5个更小的Feature Map。
图1所示网络的最后两层是全连接层。第一个全连接层的每个神经元,和上一层5个Feature Map中的每个神经元相连,第二个全连接层(也就是输出层)的每个神经元,则和第一个全连接层的每个神经元相连,这样得到了整个网络的输出。
8 补充
- 使用dropout做正则化。 可以选择在部分层结尾添加。
- 从一个平面到下一个平面的映射可以看作是作卷积运算,池化层可看作是模糊滤波器,起到二次特征提取的作用。
- 隐层与隐层之间空间分辨率递减,而每层所含的平面数递增(filter增加),这样可用于检测更多的特征信息
参考:
https://www.zybuluo.com/hanbingtao/note/485480
http://www.jeyzhang.com/cnn-learning-notes-1.html
http://blog.csdn.net/zouxy09/article/details/8781543
http://www.jianshu.com/p/606a33ba04ff
《TensorFlow实战》—黄文坚 唐源
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/bigdata/9327.html