1. 前言
卷积神经网络是一种特殊的深层的神经网络模型,它的特殊性体现在两个方面,
- 它的神经元间的连接是非全连接的,
- 同一层中某些神经元之间的连接的权重是共享的(即相同的)。
它的非全连接和权值共享的网络结构使之更类似于生物 神经网络,降低了网络模型的复杂度(对于很难学习的深层结构来说,这是非常重要的),减少了权值的数量。
2. CNN卷积网络结构
我们先重整体的角度观察一下CNN卷积网络的结构:
上图的结构从左到右是,输入层、卷积层(Convolution Layer)、池化层(Pooling layer)、卷积层、池化层、全连接层(Fully Connected Layer)、全链接层、输出层。
卷积层+池化层的组合可以在隐藏层出现很多次,上图中出现两次。而实际上这个次数是根据模型的需要而来的。当然我们也可以灵活使用使用卷积层+卷积层,或者卷积层+卷积层+池化层的组合,这些在构建模型的时候没有限制。但是最常见的CNN都是若干卷积层+池化层的组合,如上图中的CNN结构。
在若干卷积层+池化层后面是全连接层(Fully Connected Layer, 简称FC),全连接层其实就是我们前面讲的DNN结构,只是输出层使用了Softmax激活函数来做图像识别的分类,这点我们在DNN中也有讲述。
从上面CNN的模型描述可以看出,CNN相对于DNN,比较特殊的是卷积层和池化层,如果我们熟悉DNN,只要把卷积层和池化层的原理搞清楚了,那么搞清楚CNN就容易很多了。
3. 卷积层(Convolution Layer)
卷积层的实现是通过一个卷积核的方式实现的。一个卷积层对应一个卷积核,通过卷积核实现权值共享。
通过一张图我们就能了解卷积层的工作原理。
我们卷积层的输入是[3*4]的矩阵,卷积核是[2*2]的矩阵,输出是[2*3]的矩阵。每一个输出的值都是通过输入层的[2*2]的值和卷积核相乘的和。
再举一个动态的卷积过程的例子如下:
我们有下面这个绿色的5x5输入矩阵,卷积核是一个下面这个黄色的3x3的矩阵。卷积的步幅是一个像素。则卷积的过程如下面的动图。卷积的结果是一个3x3的矩阵。
通过这几个卷积层的例子想必大家对卷积核的计算方式有了一定的了解。
卷积层的公式如下:
\[
s(i,j)=(X*W)(i,j) + b = \sum\limits_{k=1}^{n\_in}(X_k*W_k)(i,j) +b
\]
其中,\(n\_in\)为输入矩阵的个数,或者是张量的最后一维的维数。\(X_k\)代表第\(k\)个输入矩阵。Wk代表卷积核的第k个子卷积核矩阵。\(s(i,j)\)即卷积核W对应的输出矩阵的对应位置元素的值。
卷积层的输出经常加一个激活函数,似的整个网络具有非线性的结构。
4. 池化层(Pooling Layer)
如果说卷积层已经理解了,那池化层久更好理解了。池化层的任务是选出最具代表性的特征,同时缩小数据的维度,使得后面的的网络处理起来更快,效率更高。池化层主要是通过一个过滤器去扫描输入的数据,从每次扫描的过程中生成输出数据。现在池化层主要生成数据的方式有2种
- 最大池化层(max pooling layer):max pooling是选择过滤器中最大的那个值。
- 平均池化层(average pooling layer):选择过滤器中所有值的平均值作为输出。
介绍了这么多,还不如来张图简明扼要。
5. 总结
在上面提到的卷积层和池化层还有两个概念没有提到。
- 步长(stride):stride的意思是过滤器的每次移动的步长,它直接影响最后输出的数据的维度。
- padding:padding的意思是给数据周围补0,使得周围的数据和中间的数据权重相同。
了解了stride和padding,我们就能计算出输出的维度:
输入:数据维度为\([W,W]\),Filter大小\([F,F]\),步长\(S\),padding的像素数\(P\),可以得出\([N,N]\)。
\[
N = \frac{W - F + 2P }{S+1}
\]
(欢迎转载,转载请注明出处。欢迎沟通交流: [email protected])
原文地址:https://www.cnblogs.com/huangyc/p/10009778.html