- 卷积神经网络是什么,为什么用它
- 卷积层
- 权值共享
- 池化层
- max-pooling
- mean-pooling
- 总结
最近在学习卷积神经网络,今天花了一天终于大致搞懂了它的基本原理,在这里作一个总结,并推荐几篇我觉得讲得很好的文章。
卷积神经网络是什么,为什么用它
众所周知卷积神经网络(CNN)在处理图像问题上有很好的表现,传统的神经网络在输入时将图像(二维像素矩阵)展成一维向量,这样无疑会丢失图像中蕴涵的空间信息 。而CNN独特的结构很好地解决了这个问题。CNN有两个关键的东西,一个是卷积层一个是池化层。
卷积层
卷积层是CNN关键中的关键,它给予了CNN学习空间特征的能力。
首先我们把像素矩阵作为输入,如下图可以当成是一个28x28的灰度图片。
CNN中第一个隐藏层的神经元只与局部区域输入层的神经元相连。
所以我们需要一个filter,也叫卷积核,是一个像窗口一样的东西,它架在输入层上面。(filter一般是一个n * n的矩阵,对应 n * n个权值参数。n一般是奇数,原因是能使对称填充方便,并且奇数 filter有中心点,方便定位)
如下图使用了5x5的filter,隐藏层中的第一个神经元与相对应的25个输入层神经元对应。
接着我们移动这个窗口,下图中窗口向右移动了一个单位,即stride(步长)为1。我们可以设置不同的步长,步长越大,隐藏层的神经元数量就越少。
就这样不断的移动,直到窗口扫过整个输入层,我们就得到了一个隐藏层。这里的图片是28*28的,filter是5 * 5,stride是1,可以得到一个24 * 24(24=28-5+1)个神经元的隐藏层
权值共享
接下来介绍一个概念:权值共享
如下图是一个3*3大小的filter在进行特征提取,可以看到在每个位置进行特征提取的时候都是共享同一个filter。
再比如我们上面讨论的例子,虽然隐藏层有24 * 24个神经元,但是由于共享一个filter和偏移值,参数个数只有26(5 * 5+1)个。
每个神经元的值的计算公式如下
σ代表的是激活函数,如sigmoid,relu函数等,b就是偏移值,w就是5 * 5个共享权值矩阵,我们用矩阵a表示输入层的神经元,ax,y表示第x+1行第y+1列那个神经元(注意,这里的下标默认都是从0开始计的,a0,0表示第一行第一列那个神经元)所以通过矩阵w线性mapping后再加上偏移值就得到公式中括号里的式子,表示的是隐藏层中第j+1行k+1列那个神经元的输入。
公式可以化简成下面的形式,其中 * 是卷积操作,这就是卷积神经网络名字的由来。但是这个卷积操作和通常的卷积操作不太一样,主要是顺序不同,我们按照上面未化简公式的顺序来就行了。
由于权值共享,每一个filter只能学习到一个特征。显然,1个特征是远远不够的,于是我们要使用更多的filter。下图我们使用了3个filter。
不同filter之间的权值参数是不共享的,于是我们使用的filter个数决定了我们学习到的特征数量。filter的个数也叫深度,是我们在训练模型的时候要指定的一个参数,它没有固定的取值,一般按照经验选择合适的filter数量。
下图是用20个filter在MNIST数据集上学习特征,将20个filter的w矩阵画成灰度图的样子。
白色区域表示权值比较小,说明窗口的这部分对输入层的神经元不敏感,相反黑色部分表示权值比较大,说明窗口的这部分对输入层的神经元敏感。每张图片都有明显的黑白区域,这也能够说明CNN确实学到一些和空间结构相关的特征,而且不同filter学习到的特征是不相同的。这是因为每个filter的初始值并不相同,通过BP算法得到了不同的解。
池化层
池化层也是CNN的重要环节,它一般跟在卷积层的后面。作用主要是为了简化卷积层的输出,同时保持某种重要的性质。池化层只有两个参数,尺寸和步长,甚至可以只用一个,即让步长等于尺寸。
主要常用的有max-pooling和mean-pooling
max-pooling对应的是更显著的特征;mean-pooling对应的是更加平滑的特征
max-pooling
上图是尺寸为2x2,步长2的最大池化层,可以看出每个filter内只是简单的取4个数字的中最大值,使之进入下一层。经过池化层,神经元数量变成了原来的1/4
mean-pooling
平均池化层就是把上面的取最大值换成了求平均值,也很好理解
总结
以上就是CNN的主要原理,下图是一个最简单的CNN,有一个从左到右依次是输入层、卷积层、池化层、输入层,从池化层到输出层是全连接。我们可以构造更复杂的CNN,在输入层与输出层中间添加更多的卷积层和池化层。
本文主要讲了CNN前向传播的过程,作为自己学习的总结。如果有错请大家评论指出。下面的文章是我觉得讲的最详细的,也是最后帮我理解CNN的文章。