卷积神经网络详解
1 前言
在dl中,有一个很重要的概念,就是卷积神经网络CNN,基本是入门dl必须搞懂的东西。本文基本根据斯坦福的机器学习公开课、cs231n、与七月在线寒老师讲的5月dl班第4次课CNN与常用框架视频所写,是一篇课程笔记。本只是想把重点放在其卷积计算具体是怎么计算怎么操作的,但后面不断补充,故写成了关于卷积神经网络的通俗导论性的文章。有何问题,欢迎不吝指正。
cs231n课程里给出了卷积神经网络各个层级结构,如下图
上图中CNN要做的事情是:给定一张图片,是车还是马未知,是什么车也未知,现在需要模型判断这张图片里具体是一个什么东西,总之输出一个结果:如果是车 那是什么车
所以
- 最左边是数据输入层,对数据做一些处理,比如去均值(把输入数据各个维度都中心化为0,避免数据过多偏差,影响训练效果)、归一化(把所有的数据都归一到同样的范围)、PCA/白化等等。CNN只对训练集做“去均值”这一步。
中间是
- CONV:卷积计算层,线性乘积 求和。
- RELU:激励层,上文2.2节中有提到:ReLU是激活函数的一种。
- POOL:池化层,简言之,即取区域平均或最大。
最右边是
- FC:全连接层
http://cs231n.github.io/assets/conv-demo/index.html
如果初看此图,可能不一定能立马理解啥意思,但结合上文的内容后,理解这个动图已经不是很困难的事情。
下述动图中,左边是输入,中间部分是两个不同的滤波器Filter w0、Filter w1,最右边则是两个不同的输出。
随着左边数据窗口的平移滑动,滤波器Filter w0对不同的局部数据进行卷积计算。
值得一提的是:
- 左边数据在变化,每次滤波器都是针对某一局部的数据窗口进行卷积,这就是所谓的CNN中的局部感知机制。
- 与此同时,数据窗口滑动,但中间滤波器Filter w0的权重(即每个神经元连接数据窗口的的权重)是固定不变的,这个权重不变即所谓的CNN中的参数共享机制。
我第一次看到上面这个动态图的时候,只觉得很炫,另外就是据说“相乘后想加”,但到底具体是个怎么相乘后想加的过程 则无法一眼看出,网上也没有一目了然的计算过程。本文来细究下。
首先,我们来分解下上述动图,如下图
接着,我们细究下上图的具体计算过程。即上图中的输出结果-1具体是怎么计算得到的呢?其实,类似wx + b,w对应滤波器Filter w0,x对应不同的数据窗口,b对应Bias b0,相当于滤波器Filter w0与一个个数据窗口相乘再求和后,最后加上Bias b0得到输出结果-1,如下过程所示:
-1* 0 + 0*0 + 1*0
+
0*0 + 1*0 + 0*1
+
0*0 + -1*2 + -1*0
+
0*0 + -1*0 + -1*0
+
-1*0 + 1*0 + -1*0
+
0*0 + -1*0 + 1*1
+
0*0 + -1*0 + 1*0
+
0*0 + 0*1 + -1*0
+
0*0 + 1*0 + -1*1
+
1
=
-1
然后滤波器Filter w0固定不变,数据窗口向右移动2步,继续做内积计算,得到4的输出结果
最后,换做另外一个不同的滤波器Filter w1、不同的偏置Bias b1,再跟图中最左边的数据窗口做卷积,可得到另外一个不同的输出。