卷积神经网络详解

1 前言

    在dl中,有一个很重要的概念,就是卷积神经网络CNN,基本是入门dl必须搞懂的东西。本文基本根据斯坦福的机器学习公开课、cs231n、与七月在线寒老师讲的5月dl班第4次课CNN与经常使用框架视频所写,是一篇课程笔记。本只是想把重点放在其卷积计算具体是怎么计算怎么操做的,但后面不断补充,故写成了关于卷积神经网络的通俗导论性的文章。有何问题,欢迎不吝指正。html

 

 

2 人工神经网络

2.1 神经元

    神经网络由大量的节点(或称“神经元”、“单元”)和相互链接而成。每一个神经元接受输入的线性组合,进行非线性变换(亦称激活函数activation function)后输出。每两个节点之间的链接表明加权值,称之为权重(weight)。不一样的权重和激活函数,则会致使神经网络不一样的输出。git

    举个手写识别的例子,给定一个未知数字,让神经网络识别是什么数字。此时的神经网络的输入由一组被输入图像的像素所激活的输入神经元所定义。在经过激活函数进行非线性变换后,神经元被激活而后被传递到其余神经元。重复这一过程,直到最后一个输出神经元被激活。从而识别当前数字是什么字。github

    神经网络的每一个神经元/单元以下web

    相似wx + b的形式,其中网络

  • a1~an为输入向量,固然,也经常使用x1~xn表示输入
  • w1~wn为权重
  • b为偏置bias
  • f 为激活函数
  • t 为输出

    若是只是上面这样一说,估计之前没接触过的十有八九又一定迷糊了。事实上,在20世纪50/60年代,上述简单神经元被称之为感知机,能够把感知机理解为一个根据不一样因素、以及各个因素的重要性程度而作决策的模型。框架

    举个例子,这周末北京有一草莓音乐节,那去不去呢?决定你是否去有3个因素,这三个因素能够对应三个输入,分别用x一、x二、x3表示,此外,这三个因素对作决策的影响程度不同,各自的影响程度用权重w一、w二、w3表示。通常来讲,音乐节的演唱嘉宾会很是影响你去不去,唱得好的前提下 即使天气很差、没人陪同均可忍受,但若是唱得很差还不如你上台唱呢。因此,咱们能够以下表示:机器学习

  • x1:是否有喜欢的演唱嘉宾。x1 = 1 你喜欢这些嘉宾,x1 = 0 你不喜欢这些嘉宾。嘉宾因素的权重w1 = 5
  • x2:天气好坏。x2 = 1 天气好,x2 = 0 天气很差。天气权重w2 = 2。
  • x3:是否有人陪你同去。x3 = 1 有人陪你同去,x2 = 0 没人陪你同去。是否有陪同的权重w3 = 3。
    这样,我们的决策模型函数便创建起来了:f(x) = g( w1*x1 + w2*x2 + w3*x3 + b ),g表示激活函数。不一样的输入会获得不同的决策结果。

 

2.2 激活函数

    经常使用的激活函数有sigmoid、tanhrelu等等,前二者sigmoid/tanh比较常见于全连接层,后者relu常见于卷积层。这里先简要介绍下最基础的sigmoid函数(btw,在本博客中SVM那篇文章开头有提过)。函数

    sigmoid的函数表达式以下学习

 

    其中z是一个线性组合,好比z能够等于:w0 + w1*x1 + w2*x2。经过代入很大的正数或很小的负数到函数中可知,g(z)结果趋近于0或1spa

    所以,sigmoid函数的图形表示以下:

    也就是说,sigmoid函数的功能是至关于把一个实数压缩至0到1之间。输入很是大的正数时,输出结果会接近1,而输入很是大的负数时,则会获得接近0的结果。压缩至0到1有何用处呢?用处是这样一来变能够把激活函数看做一种“分类的几率”,好比激活函数的输出为0.9的话即可以解释为90%的几率为正样本。

2.3 神经网络

    将下图的这种单个神经元

    组织在一块儿,便造成了神经网络。下图即是一个三层神经网络结构

    上图中最左边的原始输入信息称之为输入层,最右边的神经元称之为输出层(上图中输出层只有一个神经元),中间的叫隐藏层。

    啥叫输入层、输出层、隐藏层呢?

  • 输入层(Input layer),众多神经元(Neuron)接受大量非线形输入讯息。输入的讯息称为输入向量。
  • 输出层(Output layer),讯息在神经元连接中传输、分析、权衡,造成输出结果。输出的讯息称为输出向量。
  • 隐藏层(Hidden layer),简称“隐层”,是输入层和输出层之间众多神经元和连接组成的各个层面。若是有多个隐藏层,则意味着多个激活函数。

    同时,每一层均可能由单个或多个神经元组成,每一层的输出将会做为下一层的输入数据。好比下图中间隐藏层来讲,隐藏层的3个神经元a一、a二、a3皆各自接受来自多个不一样权重的输入,接着,a一、a二、a3又在自身各自不一样权重的影响下 成为的输出层的输入,最终由输出层输出最终结果。

    上图(注:图引自斯坦福机器学习公开课)中

  • 表示第j层第i个单元的激活函数
  • 表示从第j层映射到第j+1层的控制函数的权重矩阵
 

    此外,输入层和隐藏层都存在一个偏置(bias unit),因此上图中也增长了偏置项:x0、a0。针对上图,有以下公式

    此外,上文中讲的都是一层隐藏层,但实际中也有多层隐藏层的,即输入层和输出层中间夹着数层隐藏层,层和层之间是全链接的结构,同一层的神经元之间没有链接。

 

 

3 卷积神经网络之层级结构

   cs231n课程里给出了卷积神经网络各个层级结构,以下图

    上图中CNN要作的事情是:给定一张图片,是车仍是马未知,是什么车也未知,如今须要模型判断这张图片里具体是一个什么东西,总之输出一个结果:若是是车 那是什么车

    因此

  • 最左边是数据输入层,对数据作一些处理,好比去均值(把输入数据各个维度都中心化为0,避免数据过多误差,影响训练效果)、归一化(把全部的数据都归一到一样的范围)、PCA/白化等等。CNN只对训练集作“去均值”这一步。

    中间是

  • CONV:卷积计算层,线性乘积 求和。
  • RELU:激励层,上文2.2节中有提到:ReLU是激活函数的一种。
  • POOL:池化层,简言之,即取区域平均或最大。

    最右边是

  • FC:全链接层
    这几个部分中,卷积计算层是CNN的核心,下文将重点阐述。


4 CNN之卷积计算层

4.1 什么是卷积

    首先,咱们来了解下什么是卷积操做。
    对图像(不一样的数据窗口数据)和滤波矩阵(一组固定的权重:由于每一个神经元的权重固定,因此又能够看作一个恒定的滤波器filter)作 内积(逐个元素相乘再求和)的操做就是所谓的『卷积』操做,也是卷积神经网络的名字来源。
    好比下图中,图中左边部分是原始输入数据,图中中间部分是滤波器filter,图中右边是输出的新的二维数据。
 
    分解下上图
对应位置上是数字先乘后相加 =
    中间滤波器filter与数据窗口作内积,其具体计算过程则是:4*0 + 0*0 + 0*0 + 0*0 + 0*1 + 0*1 + 0*0 + 0*1 + -4*2 = -8
 

4.2 图像上的卷积

    在计算过程当中,输入是必定区域大小(width*height)的数据,和滤波器filter(一组固定的权重)作内积后等到新的二维数据。
    对于下图中,左边是图像输入,中间部分就是滤波器filter(一组固定的权重),不一样的滤波器filter会获得不一样的输出数据,好比轮廓、颜色深浅。至关于若是想提取图像的不一样特征,则用不一样的滤波器filter,提取想要的关于图像的特定信息:轮廓或颜色深浅。

    以下图所示

 

 

 

 
 

4.3 cs231d的动态卷积图   

    cs231n课程中,给了一张动图,网址是: 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 w一、不一样的偏置Bias b1,再跟图中最左边的数据窗口作卷积,可获得另一个不一样的输出。

 

 

5 CNN之激励层与池化层

5.1 ReLU激励

    2.2节介绍了激活函数sigmoid,但实际梯度降低中,容易饱和和终止梯度传递,且没有0中心化。咋办呢,能够尝试另一个激活函数:ReLU,其图形表示以下

    ReLU的优势是收敛快,求梯度简单。

5.2 池化pool层

    前头说了,池化,简言之,即取区域平均或最大,以下图所示

    上图所展现的是取区域最大,即上图左边部分中 左上角2x2的矩阵中6最大,右上角2x2的矩阵中8最大,左下角2x2的矩阵中3最大,右下角2x2的矩阵中4最大,因此获得上图右边部分的结果:6 8 3 4。很简单不是?

 

 

6 后记

    本文基本上边看5月dl班寒讲的CNN视频边作笔记,以前断断续续看过很多CNN相关的资料(包括cs231n),但今晚看过视频以后,才系统了解CNN究竟是个什么东西,做为听众 寒讲的真心赞、清晰。而后在写CNN相关的东西时,发现一些前置知识(好比神经元、多层神经网络等也须要介绍下),包括CNN的其它层次机构(好比激励层),因此本文本只想简要介绍下卷积操做的,但考虑到知识之间的先后关联,因此越写越长,便成本文了。

    此外,在写做本文的过程当中,请教了咱们讲师团队里的寒、冯两位,感谢他们。

    July、二零一六年七月三日晚更新。


7 参考文献

  1. 人工神经网络wikipedia
  2. 斯坦福机器学习公开课
  3. http://neuralnetworksanddeeplearning.com/
  4. 雨石 卷积神经网络:http://blog.csdn.net/stdcoutzyx/article/details/41596663
  5. cs231n 神经网络结构与神经元激励函数:http://cs231n.github.io/neural-networks-1/
  6. cs231n 卷积神经网络:http://cs231n.github.io/convolutional-networks/#overview
  7. cs231n 动态卷积图:http://cs231n.github.io/assets/conv-demo/index.html
  8. 七月在线寒老师讲的5月dl班第4次课CNN与经常使用框架视频,过两天会剪切部分放七月在线官网:julyedu.com
  9. 七月在线5月深度学习班:https://www.julyedu.com/course/getDetail/37
  10. 深度学习与计算机视觉系列(6)_神经网络结构与神经元激励函数:http://blog.csdn.net/han_xiaoyang/article/details/50447834
  11. 深度学习与计算机视觉系列(10)_细说卷积神经网络:http://blog.csdn.net/han_xiaoyang/article/details/50542880
  12. 图像卷积与滤波的一些知识点:http://blog.csdn.net/zouxy09/article/details/49080029
相关文章
相关标签/搜索