精华内容
下载资源
问答
  • CNN笔记:通俗理解卷积神经网络

    万次阅读 多人点赞 2016-07-02 22:14:50
    通俗理解卷积神经网络(cs231n与5月dl班课程笔记) 1 前言 2012年我在北京组织过8期machine learning读书会,那时“机器学习”非常火,很多人都对其抱有巨大的热情。当我2013年再次来到北京时,有...

                   通俗理解卷积神经网络(cs231n与5月dl班课程笔记)

    1 前言

        2012年我在北京组织过8期machine learning读书会,那时“机器学习”非常火,很多人都对其抱有巨大的热情。当我2013年再次来到北京时,有一个词似乎比“机器学习”更火,那就是“深度学习”。

        本博客内写过一些机器学习相关的文章,但上一篇技术文章“LDA主题模型”还是写于2014年11月份,毕竟自2015年开始创业做在线教育后,太多的杂事、琐碎事,让我一直想再写点技术性文章但每每恨时间抽不开。然由于公司在不断开机器学习、深度学习等相关的在线课程,耳濡目染中,总会顺带着学习学习。

        我虽不参与讲任何课程(我所在公司“七月在线”的所有在线课程都是由目前讲师团队的100多位讲师讲),但依然可以用最最小白的方式 把一些初看复杂的东西抽丝剥茧的通俗写出来。这算重写技术博客的价值所在。

        在dl中,有一个很重要的概念,就是卷积神经网络CNN,基本是入门dl必须搞懂的东西。本文基本根据斯坦福的机器学习公开课、cs231n、与七月在线寒小阳讲的5月dl班所写,是一篇课程笔记。

        一开始本文只是想重点讲下CNN中的卷积操作具体是怎么计算怎么操作的,但后面不断补充,包括增加不少自己的理解,故写成了关于卷积神经网络的通俗导论性的文章。有何问题,欢迎不吝指正。

    2 人工神经网络

    2.1 神经元

        神经网络由大量的神经元相互连接而成。每个神经元接受线性组合的输入后,最开始只是简单的线性加权,后来给每个神经元加上了非线性的激活函数,从而进行非线性变换后输出。每两个神经元之间的连接代表加权值,称之为权重(weight)。不同的权重和激活函数,则会导致神经网络不同的输出。

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

        神经网络的每个神经元如下

        基本wx + b的形式,其中

    • 表示输入向量
    • 为权重,几个输入则意味着有几个权重,即每个输入都被赋予一个权重
    • b为偏置bias
    • g(z) 为激活函数
    • a 为输出

        如果只是上面这样一说,估计以前没接触过的十有八九又必定迷糊了。事实上,上述简单模型可以追溯到20世纪50/60年代的感知器,可以把感知器理解为一个根据不同因素、以及各个因素的重要性程度而做决策的模型。

        举个例子,这周末北京有一草莓音乐节,那去不去呢?决定你是否去有二个因素,这二个因素可以对应二个输入,分别用x1、x2表示。此外,这二个因素对做决策的影响程度不一样,各自的影响程度用权重w1、w2表示。一般来说,音乐节的演唱嘉宾会非常影响你去不去,唱得好的前提下 即便没人陪同都可忍受,但如果唱得不好还不如你上台唱呢。所以,我们可以如下表示:

    • :是否有喜欢的演唱嘉宾。 = 1 你喜欢这些嘉宾, = 0 你不喜欢这些嘉宾。嘉宾因素的权重 = 7
    • :是否有人陪你同去。 = 1 有人陪你同去, = 0 没人陪你同去。是否有人陪同的权重 = 3。

        这样,咱们的决策模型便建立起来了:g(z) = g( * + * + b ),g表示激活函数,这里的b可以理解成 为更好达到目标而做调整的偏置项。

        一开始为了简单,人们把激活函数定义成一个线性函数,即对于结果做一个线性变化,比如一个简单的线性激活函数是g(z) = z,输出都是输入的线性变换。后来实际应用中发现,线性激活函数太过局限,于是人们引入了非线性激活函数。

    2.2 激活函数

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

        sigmoid的函数表达式如下

        其中z是一个线性组合,比如z可以等于:b + * + *通过代入很大的正数或很小的负数到g(z)函数中可知,其结果趋近于0或1

        因此,sigmoid函数g(z)的图形表示如下( 横轴表示定义域z,纵轴表示值域g(z) ):

        也就是说,sigmoid函数的功能是相当于把一个实数压缩至0到1之间。当z是非常大的正数时,g(z)会趋近于1,而z是非常小的负数时,则g(z)会趋近于0

        压缩至0到1有何用处呢?用处是这样一来便可以把激活函数看作一种“分类的概率”,比如激活函数的输出为0.9的话便可以解释为90%的概率为正样本。

        举个例子,如下图(图引自Stanford机器学习公开课

        z = b + * + *,其中b为偏置项 假定取-30,都取为20

    • 如果 = 0  = 0,则z = -30,g(z) = 1/( 1 + e^-z )趋近于0。此外,从上图sigmoid函数的图形上也可以看出,当z=-30的时候,g(z)的值趋近于0
    • 如果 = 0 = 1,或 =1 = 0,则z = b + * + * = -30 + 20 = -10,同样,g(z)的值趋近于0
    • 如果 = 1 = 1,则z = b + * + * = -30 + 20*1 + 20*1 = 10,此时,g(z)趋近于1。

        换言之,只有都取1的时候,g(z)→1,判定为正样本;取0的时候,g(z)→0,判定为负样本如此达到分类的目的。

    2.3 神经网络

        将下图的这种单个神经元

        组织在一起,便形成了神经网络。下图便是一个三层神经网络结构

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

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

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

        同时,每一层都可能由单个或多个神经元组成,每一层的输出将会作为下一层的输入数据。比如下图中间隐藏层来说,隐藏层的3个神经元a1、a2、a3皆各自接受来自多个不同权重的输入(因为有x1、x2、x3这三个输入,所以a1 a2 a3都会接受x1 x2 x3各自分别赋予的权重,即几个输入则几个权重),接着,a1、a2、a3又在自身各自不同权重的影响下 成为的输出层的输入,最终由输出层输出最终结果。

        上图(图引自Stanford机器学习公开课)中

    • 表示第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 CNN怎么进行识别
       简言之,当我们给定一个"X"的图案,计算机怎么识别这个图案就是“X”呢?一个可能的办法就是计算机存储一张标准的“X”图案,然后把需要识别的未知图案跟标准"X"图案进行比对,如果二者一致,则判定未知图案即是一个"X"图案。

       而且即便未知图案可能有一些平移或稍稍变形,依然能辨别出它是一个X图案。如此,CNN是把未知图案和标准X图案一个局部一个局部的对比,如下图所示 [图来自参考文案25]


    而未知图案的局部和标准X图案的局部一个一个比对时的计算过程,便是卷积操作。卷积计算结果为1表示匹配,否则不匹配。

    具体而言,为了确定一幅图像是包含有"X"还是"O",相当于我们需要判断它是否含有"X"或者"O",并且假设必须两者选其一,不是"X"就是"O"。



    理想的情况就像下面这个样子:

    标准的"X"和"O",字母位于图像的正中央,并且比例合适,无变形

    对于计算机来说,只要图像稍稍有一点变化,不是标准的,那么要解决这个问题还是不是那么容易的:


    计算机要解决上面这个问题,一个比较天真的做法就是先保存一张"X"和"O"的标准图像(就像前面给出的例子),然后将其他的新给出的图像来和这两张标准图像进行对比,看看到底和哪一张图更匹配,就判断为哪个字母。

    但是这么做的话,其实是非常不可靠的,因为计算机还是比较死板的。在计算机的“视觉”中,一幅图看起来就像是一个二维的像素数组(可以想象成一个棋盘),每一个位置对应一个数字。在我们这个例子当中,像素值"1"代表白色,像素值"-1"代表黑色。


    当比较两幅图的时候,如果有任何一个像素值不匹配,那么这两幅图就不匹配,至少对于计算机来说是这样的。

    对于这个例子,计算机认为上述两幅图中的白色像素除了中间的3*3的小方格里面是相同的,其他四个角上都不同:


    因此,从表面上看,计算机判别右边那幅图不是"X",两幅图不同,得出结论:


    但是这么做,显得太不合理了。理想的情况下,我们希望,对于那些仅仅只是做了一些像平移,缩放,旋转,微变形等简单变换的图像,计算机仍然能够识别出图中的"X"和"O"。就像下面这些情况,我们希望计算机依然能够很快并且很准的识别出来:


    这也就是CNN出现所要解决的问题。

    Features


    对于CNN来说,它是一块一块地来进行比对。它拿来比对的这个“小块”我们称之为Features(特征)。在两幅图中大致相同的位置找到一些粗糙的特征进行匹配,CNN能够更好的看到两幅图的相似性,相比起传统的整幅图逐一比对的方法。

    每一个feature就像是一个小图(就是一个比较小的有值的二维数组)。不同的Feature匹配图像中不同的特征。在字母"X"的例子中,那些由对角线和交叉线组成的features基本上能够识别出大多数"X"所具有的重要特征。


    这些features很有可能就是匹配任何含有字母"X"的图中字母X的四个角和它的中心。那么具体到底是怎么匹配的呢?如下:






    看到这里是不是有了一点头目呢。但其实这只是第一步,你知道了这些Features是怎么在原图上面进行匹配的。但是你还不知道在这里面究竟进行的是怎样的数学计算,比如这个下面3*3的小块到底干了什么?


    这里面的数学操作,就是我们常说的“卷积”操作。接下来,我们来了解下什么是卷积操作。

    4.2 什么是卷积

        对图像(不同的数据窗口数据)和滤波矩阵(一组固定的权重:因为每个神经元的多个权重固定,所以又可以看做一个恒定的滤波器filter)做内积(逐个元素相乘再求和)的操作就是所谓的『卷积』操作,也是卷积神经网络的名字来源。

        非严格意义上来讲,下图中红框框起来的部分便可以理解为一个滤波器,即带着一组固定权重的神经元。多个滤波器叠加便成了卷积层。

        OK,举个具体的例子。比如下图中,图中左边部分是原始输入数据,图中中间部分是滤波器filter,图中右边是输出的新的二维数据。

        分解下上图

    对应位置上是数字先相乘后相加 =

        中间滤波器filter与数据窗口做内积,其具体计算过程则是:4*0 + 0*0 + 0*0 + 0*0 + 0*1 + 0*1 + 0*0 + 0*1 + -4*2 = -8

    4.3 图像上的卷积

        在下图对应的计算过程中,输入是一定区域大小(width*height)的数据,和滤波器filter(带着一组固定权重的神经元)做内积后等到新的二维数据。

        具体来说,左边是图像输入,中间部分就是滤波器filter(带着一组固定权重的神经元),不同的滤波器filter会得到不同的输出数据,比如颜色深浅、轮廓。相当于如果想提取图像的不同特征,则用不同的滤波器filter,提取想要的关于图像的特定信息:颜色深浅或轮廓。

        如下图所示

      

    4.4 GIF动态卷积图

        在CNN中,滤波器filter(带着一组固定权重的神经元)对局部输入数据进行卷积计算。每计算完一个数据窗口内的局部数据后,数据窗口不断平移滑动,直到计算完所有数据。这个过程中,有这么几个参数: 
      a. 深度depth:神经元个数,决定输出的depth厚度。同时代表滤波器个数。
      b. 步长stride:决定滑动多少步可以到边缘。

      c. 填充值zero-padding:在外围边缘补充若干圈0,方便从初始位置以步长为单位可以刚好滑倒末尾位置,通俗地讲就是为了总长能被步长整除。 

      这里写图片描述 

        cs231n课程中有一张卷积动图,貌似是用d3js 和一个util 画的,我根据cs231n的卷积动图依次截取了18张图,然后用一gif 制图工具制作了一gif 动态卷积图。如下gif 图所示

        可以看到:

    • 两个神经元,即depth=2,意味着有两个滤波器。
    • 数据窗口每次移动两个步长取3*3的局部数据,即stride=2。
    • zero-padding=1。

        然后分别以两个滤波器filter为轴滑动数组进行卷积计算,得到两组不同的结果。

        如果初看上图,可能不一定能立马理解啥意思,但结合上文的内容后,理解这个动图已经不是很困难的事情:

    • 左边是输入(7*7*3中,7*7代表图像的像素/长宽,3代表R、G、B 三个颜色通道)
    • 中间部分是两个不同的滤波器Filter w0、Filter w1
    • 最右边则是两个不同的输出

        随着左边数据窗口的平移滑动,滤波器Filter w0 / Filter w1对不同的局部数据进行卷积计算。

        值得一提的是:左边数据在变化,每次滤波器都是针对某一局部的数据窗口进行卷积,这就是所谓的CNN中的局部感知机制。

    • 打个比方,滤波器就像一双眼睛,人类视角有限,一眼望去,只能看到这世界的局部。如果一眼就看到全世界,你会累死,而且一下子接受全世界所有信息,你大脑接收不过来。当然,即便是看局部,针对局部里的信息人类双眼也是有偏重、偏好的。比如看美女,对脸、胸、腿是重点关注,所以这3个输入的权重相对较大。

    与此同时,数据窗口滑动,导致输入在变化,但中间滤波器Filter w0的权重(即每个神经元连接数据窗口的权重)是固定不变的,这个权重不变即所谓的CNN中的参数(权重)共享机制。

    • 再打个比方,某人环游全世界,所看到的信息在变,但采集信息的双眼不变。btw,不同人的双眼 看同一个局部信息 所感受到的不同,即一千个读者有一千个哈姆雷特,所以不同的滤波器 就像不同的双眼,不同的人有着不同的反馈结果。

        我第一次看到上面这个动态图的时候,只觉得很炫,另外就是据说计算过程是“相乘后相加”,但到底具体是个怎么相乘后相加的计算过程 则无法一眼看出,网上也没有一目了然的计算过程。本文来细究下。

        首先,我们来分解下上述动图,如下图

        接着,我们细究下上图的具体计算过程。即上图中的输出结果1具体是怎么计算得到的呢?其实,类似wx + b,w对应滤波器Filter w0,x对应不同的数据窗口,b对应Bias b0,相当于滤波器Filter w0与一个个数据窗口相乘再求和后,最后加上Bias b0得到输出结果1,如下过程所示:

    1* 0 + 1*0 + -1*

    +

    -1*0 + 0*0 + 1*1

    +

    -1*0 + -1*0 + 0*1

    +

    -1*0 + 0*0 + -1*0

    +

    0*0 + 0*1 + -1*1

    +

    1*0 + -1*0 + 0*2

    +

    0*0 + 1*0 + 0*0

    +

    1*0 + 0*2 + 1*0

    +

    0*0 + -1*0 + 1*0

    +

    1

    =

    1

        然后滤波器Filter w0固定不变,数据窗口向右移动2步,继续做内积计算,得到0的输出结果

        最后,换做另外一个不同的滤波器Filter w1、不同的偏置Bias b1,再跟图中最左边的数据窗口做卷积,可得到另外一个不同的输出。

    5 CNN之激励层与池化层

    5.1 ReLU激励层

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

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

    5.2 池化pool层

        前头说了,池化,简言之,即取区域平均或最大,如下图所示(图引自cs231n)

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

    6 后记

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

        此外,在写作本文的过程中,请教了我们讲师团队里的寒、冯两位,感谢他两。同时,感谢爱可可老师的微博转发,感谢七月在线所有同事。

    以下是修改日志:

    • 2016年7月5日,修正了一些笔误、错误,以让全文更通俗、更精准。有任何问题或槽点,欢迎随时指出。
    • 2016年7月7日,第二轮修改完毕。且根据cs231n的卷积动图依次截取了18张图,然后用制图工具制作了一gif 动态卷积图,放在文中4.3节。
    • 2016年7月16日,完成第三轮修改。本轮修改主要体现在sigmoid函数的说明上,通过举例和统一相关符号让其含义更一目了然、更清晰。
    • 2016年8月15日,完成第四轮修改,增补相关细节。比如补充4.3节GIF动态卷积图中输入部分的解释,即7*7*3的含义(其中7*7代表图像的像素/长宽,3代表R、G、B 三个颜色通道)。不断更易懂。
    • 2016年8月22日,完成第五轮修改。本轮修改主要加强滤波器的解释,及引入CNN中滤波器的通俗比喻。

        July、最后修改于二零一六年八月二十二日中午于七月在线办公室。


    7 参考文献及推荐阅读

    1. 人工神经网络wikipedia
    2. 斯坦福机器学习公开课
    3. Neural networks and deep learning
    4. 雨石 卷积神经网络:卷积神经网络_雨石-CSDN博客_卷积神经网络
    5. cs231n 神经网络结构与神经元激励函数:CS231n Convolutional Neural Networks for Visual Recognition中译版
    6. cs231n 卷积神经网络:CS231n Convolutional Neural Networks for Visual Recognition
    7. 七月在线寒老师讲的5月dl班第4次课CNN与常用框架视频,已经剪切部分放在七月在线官网:julyedu.com
    8. 七月在线5月深度学习班第5课CNN训练注意事项部分视频:视频播放
    9. 七月在线5月深度学习班:5 月深度学习班 [国内第1个DL商业课程] - 七月在线
    10. 七月在线5月深度学习班课程笔记——No.4《CNN与常用框架》:CNN与常用框架_会思考的蜗牛-CSDN博客_cnn框架
    11. 七月在线6月数据数据挖掘班第7课视频:数据分类与排序
    12. 手把手入门神经网络系列(1)_从初等数学的角度初探神经网络:手把手入门神经网络系列(1)_从初等数学的角度初探神经网络_寒小阳-CSDN博客
    13. 深度学习与计算机视觉系列(6)_神经网络结构与神经元激励函数:深度学习与计算机视觉系列(6)_神经网络结构与神经元激励函数_寒小阳-CSDN博客
    14. 深度学习与计算机视觉系列(10)_细说卷积神经网络:深度学习与计算机视觉系列(10)_细说卷积神经网络_寒小阳-CSDN博客
    15. zxy 图像卷积与滤波的一些知识点:图像卷积与滤波的一些知识点_zouxy09的专栏-CSDN博客_图像卷积
    16. zxy 深度学习CNN笔记:Deep Learning(深度学习)学习笔记整理系列之(七)_zouxy09的专栏-CSDN博客_深度学习 笔记
    17. Understanding Convolutional Neural Networks for NLP – WildML中译版
    18. 《神经网络与深度学习》中文讲义:Sina Visitor System
    19. ReLU与sigmoid/tanh的区别:请问人工神经网络中的activation function的作用具体是什么?为什么ReLu要好过于tanh和sigmoid function? - 知乎
    20. CNN、RNN、DNN内部网络结构区别:CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)的内部网络结构有什么区别? - 知乎
    21. 理解卷积:如何通俗易懂地解释卷积? - 知乎
    22. 神经网络与深度学习简史:1 感知机和BP算法4 深度学习的伟大复兴
    23. 在线制作gif 动图:在线Photoshop 在线ps
    24. 支持向量机通俗导论(理解SVM的三层境界)
    25. CNN究竟是怎样一步一步工作的? 本博客把卷积操作具体怎么个计算过程写清楚了,但这篇把为何要卷积操作也写清楚了,而且配偶图非常形象,甚赞。
    展开全文
  • 卷积神经网络是当下AI人工智能深度学习的基础,CNN可以应用在场景分类,图像分类,现在还可以应用到自然语言处理(NLP)方面的很多问题,比如句子分类等。下面进行讲解。 计算机视觉和 CNN 发展十一座里程碑 2.神经元 ...

    1.前言

    卷积神经网络是当下AI人工智能深度学习的基础,CNN可以应用在场景分类,图像分类,现在还可以应用到自然语言处理(NLP)方面的很多问题,比如句子分类等。下面进行讲解。

    计算机视觉和 CNN 发展十一座里程碑

    2.神经元

    神经网络是由大量的神经元相互连接而成的,每个神经元接受线性组合输入之后,刚开始只是简单地线性加权,后给每个神经元加上了非线性的激活函数,从而进行非线性变换后输出,每两个神经元之间的链接称之为权重。
    在这里插入图片描述
    上述为一个简单地神经元结构,x1,x2为输入,w1,w2为权重,b为偏置项,可以理解为使得我们的输出更加的偏向于真实值的调整项,z为线性组合之后的输出,其中z=w1x1+w2x2+b,g(z)为激活函数将上面的线性变换通过激活函数进行非线性变换,a是非线性变换之后的输出,则a=g(z)=g(w1x1+w2x2+b)

    3.激活函数

    常用的激活函数有sigmoid,tanh,relu等。。。,下面介绍sigmoid函数,如下所示:
    在这里插入图片描述
    可以看到sigmoid函数可以将输出值压缩到0-1之间,而输入值可以为任意值,跟逻辑回归一样,我们可以将激活函数看作是一种“分类概率”,线性加权之后的输入通过非线性激活函数sigmoid之后将输入值压缩到0-1之间,我们可以将这些值看做概率,如果输出为0.9,那么可以理解为90%的概率为正样本。

    3.神经网络

    在这里插入图片描述
    跟上面一样,上面是一个单个神经元 ,将多个单个神经元组合在一起就形成了神经网络
    在这里插入图片描述
    上述是一个三层的神经网络结构,最左边的叫做输入层,中间的叫做隐藏层,最右边的叫做输出层,其中隐藏层可以为多层隐藏层,每一层的输出都会作为下一层的输入,层和层之间为全连接结构,同一层的神经元之间没有连接。
    输入层:主要指对众多神经元(Neuron)接受大量非线形输入讯息。输入的讯息称为输入向量。输入的数据做一些预处理工作,包括归一化,去均值,pca等等操作

    4.CNN之卷积层

    4.1 CNN怎么进行识别

    计算机如何识别一张图片,一个可能的方法就是计算机存储一张标准的图像,将需要识别的图像和标准的计算机存储的图像进行比对,如果两者一致,那么可以判断计算机存储图像和未知图像一致,识别成功。
    且即使未知图像有一些偏移或者稍微变形模糊的情况,也依旧可以识别成功,CNN是将未知图像和标准图像一个局部一个局部的进行比对,对比的过程就是卷积操作。
    在这里插入图片描述
    如上述所示,我们要预测X和O,即使图像做了一些稍微的改变计算机也可以识别成功。
    在计算机的“视觉”中,一幅图看起来就像是一个二维的像素数组(可以想象成一个棋盘),每一个位置对应一个数字。在我们这个例子当中,像素值"1"代表白色,像素值"-1"代表黑色。
    在这里插入图片描述
    当比较两幅图的时候,如果有任何一个像素值不匹配,那么这两幅图就不匹配,至少对于计算机来说是这样的。
    在这里插入图片描述
    也就会导致识别不成功。但是这么做,显得太不合理了。理想的情况下,我们希望,对于那些仅仅只是做了一些像平移,缩放,旋转,微变形等简单变换的图像,计算机仍然能够识别出图中的"X"和"O"。就像下面这些情况,我们希望计算机依然能够很快并且很准的识别出来:这就是CNN出现的要解决的问题。
    对于CNN来讲,他是一个局部一个局部的进行比对,这些局部我们可以称之为“feature”特征,在两幅图中大致相同的位置找到一些粗糙的特征进行匹配,CNN能够更好的看到两幅图的相似性,相比起传统的整幅图逐一比对的方法。

    4.2 什么是卷积

    对图像(不同的数据窗口数据)和滤波矩阵(一组固定的权重:因为每个神经元的多个权重固定,所以又可以看做一个恒定的滤波器filter)做内积(逐个元素相乘再求和)的操作就是所谓的『卷积』操作,也是卷积神经网络的名字来源。
    举个具体的例子。比如下图中,图中左边部分是原始输入数据,图中中间部分是滤波器filter,图中右边是输出的新的二维数据。
    在这里插入图片描述
    对于上述图像,卷积操作就是简单地相乘再相加,中间滤波器filter与数据窗口做内积,具体为:04+00+00+10+10+00+2*-4+10+00=-8

    4.3 图像上的卷积

    在下图对应的计算过程中,输入是一定区域大小(widthheight)的数据,和滤波器filter(带着一组固定权重的神经元)做内积后等到新的二维数据。具体来说,左边是图像输入,中间部分就是滤波器filter(带着一组固定权重的神经元),不同的滤波器filter会得到不同的输出数据,比如颜色深浅、轮廓。相当于如果想提取图像的不同特征,则用不同的滤波器filter,提取想要的关于图像的特定信息:颜色深浅或轮廓。
    在这里插入图片描述
    因为是提取局部特征,滤波器filter不同,经过滑动之后进行卷积的数值就不同,所以得到的结果就不同,得到的结果不同,那么就可以提取到不用的图片特征。
    在CNN中,滤波器filter(带着一组固定权重的神经元)对局部输入数据进行卷积计算。每计算完一个数据窗口内的局部数据后,数据窗口不断平移滑动,直到计算完所有数据。这个过程中,有这么几个参数:
      a. 深度depth:神经元个数,决定输出的depth厚度。同时代表滤波器个数。
      b. 步长stride:决定滑动多少步可以到边缘。
    c. 填充值zero-padding:在外围边缘补充若干圈0,方便从初始位置以步长为单位可以刚好滑倒末尾位置,通俗地讲就是为了总长能被步长整除。
    在这里插入图片描述
    上述就是卷积操作,可以看到:
    两个神经元,即depth=2,意味着有两个滤波器。
    数据窗口每次移动两个步长取3
    3的局部数据,即stride=2。
    zero-padding=1。扩充0的数据为一个
    然后分别以两个滤波器filter为轴滑动数组进行卷积计算,得到两组不同的结果。
    输出为7x7x3的数据,7x7表示图像数据的像素/长宽,3表示为3个通道,分别为R,G,B
    中间部分为两个滤波器,filterw0和filterw1
    最右边则是两个不同的输出,随着左边数据窗口的平移滑动,滤波器Filter w0 / Filter w1对不同的局部数据进行卷积计算。

    下面根据上面的卷积操作给出几个概念:
    1.上述左边的数据因为CNN卷积的对象是图像的局部,每次滤波器都是针对某一局部的数据窗口进行卷积,这就是CNN的***局部感知***机制
    2. 上述的左边的数据因为是对局部的数据窗口进行卷积,数据一直在变化,但是我们的滤波器一直没有发生变化,滤波器也可以认为是一种权重,这就是CNN中的***权值共享***机制

    下面我们对上述过程进行讲解:
    即上图中的输出结果1具体是怎么计算得到的呢?其实,类似wx + b,w对应滤波器Filter w0,x对应不同的数据窗口,b对应Bias b0,相当于滤波器Filter w0与一个个数据窗口相乘再求和后,最后加上Bias b0得到输出结果1,如下过程所示:
    在这里插入图片描述
    10+10±10±10+00+11±10±10+01=1
    在这里插入图片描述
    -1
    0+00±10+00+01±11+10±10+02=-1
    在这里插入图片描述
    00+10+00+10+02+10+00±10+1*0=0
    上述三个过程相加起来再加上一个偏置项1就是1±1+0+1=1,也就是下面的红线所示的位置
    在这里插入图片描述
    然后滤波器Filter w0固定不变,数据窗口向右移动2步,继续做内积计算,得到0的输出结果,绿线所画位置。
    在这里插入图片描述
    最后,换做另外一个不同的滤波器Filter w1、不同的偏置Bias b1,再跟图中最左边的数据窗口做卷积,可得到另外一个不同的输出。
    在这里插入图片描述

    5.CNN的激励层

    上面介绍了激活函数sigmoid,但实际梯度下降中,sigmoid容易饱和、造成终止梯度传递,且没有0中心化。咋办呢,可以尝试另外一个激活函数:ReLU,其图形表示如下
    在这里插入图片描述
    ReLU的优点是收敛快,求梯度简单。

    6.池化层

    池化,简言之,即取区域平均或最大,如下图所示
    在这里插入图片描述
    上图所展示的是取区域最大,即上图左边部分中 左上角2x2的矩阵中6最大,右上角2x2的矩阵中8最大,左下角2x2的矩阵中3最大,右下角2x2的矩阵中4最大,所以得到上图右边部分的结果:6 8 3 4。
    池化的作用:减小输出大小和降低过拟合。降低过拟合是减小输出大小的结果,它同样也减少了后续层中的参数的数量。

    近期,池化层并不是很受青睐。部分原因是:

    现在的数据集又大又复杂,我们更关心欠拟合问题。
    Dropout 是一个更好的正则化方法。
    池化导致信息损失。想想最大池化的例子,n 个数字中我们只保留最大的,把余下的 n-1 完全舍弃了。

    参考:这里

    展开全文
  •  2、基于dl4j定型一个卷积神经网络来进行手写数字识别 三、卷积神经网络原理  下面左边有个9*9的网格,红色填充的部分构成了数字7,把红色部分填上1,空白部分填上0,就构成了一个二维矩阵,传统做法可以用求...

    转载自:https://blog.csdn.net/dong_lxkm/article/details/80575207

    一、前言

        最近一直在研究深度学习,联想起之前所学,感叹数学是一门朴素而神奇的科学。F=G*m1*m2/r²万有引力描述了宇宙星河运转的规律,E=mc²描述了恒星发光的奥秘,V=H*d哈勃定律描述了宇宙膨胀的奥秘,自然界的大部分现象和规律都可以用数学函数来描述,也就是可以求得一个函数。

        神经网络(《简单又复杂的人工神经网络》)可以逼近任何连续的函数,那么神经网络就有无限的泛化能力。对于大部分分类问题而言,本质就是求得一个函数y=f(x),例如:对于图像识别而言就是求得一个以像素张量为自变量的函数y=F(像素张量),其中y=猫、狗、花、汽车等等;对于文本情感分析而言,就是为了求得一个以词向量或者段落向量为自变量的函数y=F(词向量),其中y=正面、负面等等……

    二、导读

        本篇博客包括以下内容:

        1、卷积神经网络的原理

        2、基于dl4j定型一个卷积神经网络来进行手写数字识别

    三、卷积神经网络原理

        下面左边有个9*9的网格,红色填充的部分构成了数字7,把红色部分填上1,空白部分填上0,就构成了一个二维矩阵,传统做法可以用求向量距离,如果数字全部都标准的写在网格中相同的位置,那么肯定是准确的,但是,实际上数字7在书写的过程中,可能偏左一点、偏右一点,变形扭曲一点,这时候就难以识别。另外,一幅图片的像素点的数量是巨大的,例如一幅50*50的图片将有2500个像素点,每个像素点有R、G、B三个维度的颜色,那么输入参数的个数有7500个,这个运算量是巨大的。

        215936_Pa7H_1778239.png              220327_n8Z6_1778239.png

        那么就需要有一个抽象特征、降低数据维度的方法,这就说到了卷积运算,用一个小于图片的卷积核扫过整幅图片求点积。卷积的过程看下图。图片来源于https://my.oschina.net/u/876354/blog/1620906

        002928_hnHI_876354.gif

        卷积运算的过程在于寻找图片中的显著特征,并达到降维的目的,整个过程相当于一个函数扫过另一个函数,扫过时两个函数的积分重叠部分并没改变图片的特征形状,并可以降低维度,另外还可以分区块来提取特征,并且拼接特征。

    convgaus

        为了进一步降低维度,引入了池化,池化的方式有很多,如最大值,平均值。下图展示了一个步长为2的2*2最大池化过程,用一个2*2的方块扫描过,求Max,总共扫描4次,4次扫描的最大值分别是6、8、3、4。

    maxpool

        最后,经过多层卷积和池化之后,会得到一个矩阵,该矩阵作为一个全连接网络的输入,在逼近一个函数,就识别出数字了,以上图得到的6、8、3、4为例,全连接网络求一个函数。

    231633_dBzj_1778239.png

    四、deeplearning4j手写体识别

        1、先下载mnist数据集,地址如下:

           http://github.com/myleott/mnist_png/raw/master/mnist_png.tar.gz

        2、解压(我解压在E盘)

        3、训练网络,评估(一些比较难的部分都做了注释)

    1.  
      public class MnistClassifier {
    2.  
       
    3.  
      private static final Logger log = LoggerFactory.getLogger(MnistClassifier.class);
    4.  
      private static final String basePath = "E:";
    5.  
       
    6.  
      public static void main(String[] args) throws Exception {
    7.  
      int height = 28;
    8.  
      int width = 28;
    9.  
      int channels = 1; // 这里有没有复杂的识别,没有分成红绿蓝三个通道
    10.  
      int outputNum = 10; // 有十个数字,所以输出为10
    11.  
      int batchSize = 54;//每次迭代取54张小批量来训练,可以查阅神经网络的mini batch相关优化,也就是小批量求平均梯度
    12.  
      int nEpochs = 1;//整个样本集只训练一次
    13.  
      int iterations = 1;
    14.  
       
    15.  
      int seed = 1234;
    16.  
      Random randNumGen = new Random(seed);
    17.  
       
    18.  
      File trainData = new File(basePath + "/mnist_png/training");
    19.  
      FileSplit trainSplit = new FileSplit(trainData, NativeImageLoader.ALLOWED_FORMATS, randNumGen);
    20.  
      ParentPathLabelGenerator labelMaker = new ParentPathLabelGenerator(); //以父级目录名作为分类的标签名
    21.  
      ImageRecordReader trainRR = new ImageRecordReader(height, width, channels, labelMaker);//构造图片读取类
    22.  
      trainRR.initialize(trainSplit);
    23.  
      DataSetIterator trainIter = new RecordReaderDataSetIterator(trainRR, batchSize, 1, outputNum);
    24.  
       
    25.  
      // 把像素值区间 0-255 压缩到0-1 区间
    26.  
      DataNormalization scaler = new ImagePreProcessingScaler(0, 1);
    27.  
      scaler.fit(trainIter);
    28.  
      trainIter.setPreProcessor(scaler);
    29.  
       
    30.  
       
    31.  
      // 向量化测试集
    32.  
      File testData = new File(basePath + "/mnist_png/testing");
    33.  
      FileSplit testSplit = new FileSplit(testData, NativeImageLoader.ALLOWED_FORMATS, randNumGen);
    34.  
      ImageRecordReader testRR = new ImageRecordReader(height, width, channels, labelMaker);
    35.  
      testRR.initialize(testSplit);
    36.  
      DataSetIterator testIter = new RecordReaderDataSetIterator(testRR, batchSize, 1, outputNum);
    37.  
      testIter.setPreProcessor(scaler); // same normalization for better results
    38.  
       
    39.  
      log.info("Network configuration and training...");
    40.  
      Map<Integer, Double> lrSchedule = new HashMap<>();//设定动态改变学习速率的策略,key表示小批量迭代到几次
    41.  
      lrSchedule.put( 0, 0.06);
    42.  
      lrSchedule.put( 200, 0.05);
    43.  
      lrSchedule.put( 600, 0.028);
    44.  
      lrSchedule.put( 800, 0.0060);
    45.  
      lrSchedule.put( 1000, 0.001);
    46.  
       
    47.  
      MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder()
    48.  
      .seed(seed)
    49.  
      .iterations(iterations)
    50.  
      .regularization( true).l2(0.0005)
    51.  
      .learningRate( .01)
    52.  
      .learningRateDecayPolicy(LearningRatePolicy.Schedule)
    53.  
      .learningRateSchedule(lrSchedule)
    54.  
      .weightInit(WeightInit.XAVIER)
    55.  
      .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT)
    56.  
      .updater(Updater.NESTEROVS)
    57.  
      . list()
    58.  
      .layer( 0, new ConvolutionLayer.Builder(5, 5)
    59.  
      .nIn(channels)
    60.  
      .stride( 1, 1)
    61.  
      .nOut( 20)
    62.  
      .activation(Activation.IDENTITY)
    63.  
      .build())
    64.  
      .layer( 1, new SubsamplingLayer.Builder(SubsamplingLayer.PoolingType.MAX)
    65.  
      .kernelSize( 2, 2)
    66.  
      .stride( 2, 2)
    67.  
      .build())
    68.  
      .layer( 2, new ConvolutionLayer.Builder(5, 5)
    69.  
      .stride( 1, 1)
    70.  
      .nOut( 50)
    71.  
      .activation(Activation.IDENTITY)
    72.  
      .build())
    73.  
      .layer( 3, new SubsamplingLayer.Builder(SubsamplingLayer.PoolingType.MAX)
    74.  
      .kernelSize( 2, 2)
    75.  
      .stride( 2, 2)
    76.  
      .build())
    77.  
      .layer( 4, new DenseLayer.Builder().activation(Activation.RELU)
    78.  
      .nOut( 500).build())
    79.  
      .layer( 5, new OutputLayer.Builder(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD)
    80.  
      .nOut(outputNum)
    81.  
      .activation(Activation.SOFTMAX)
    82.  
      .build())
    83.  
      .setInputType(InputType.convolutionalFlat( 28, 28, 1))
    84.  
      .backprop( true).pretrain(false).build();
    85.  
       
    86.  
      MultiLayerNetwork net = new MultiLayerNetwork(conf);
    87.  
      net.init();
    88.  
      net.setListeners( new ScoreIterationListener(10));
    89.  
      log.debug("Total num of params: {}", net.numParams());
    90.  
       
    91.  
      // 评估测试集
    92.  
      for (int i = 0; i < nEpochs; i++) {
    93.  
      net.fit(trainIter);
    94.  
      Evaluation eval = net.evaluate(testIter);
    95.  
      log.info(eval.stats());
    96.  
      trainIter.reset();
    97.  
      testIter.reset();
    98.  
      }
    99.  
      ModelSerializer.writeModel(net, new File(basePath + "/minist-model.zip"), true);//保存训练好的网络
    100.  
      }
    101.  
      }
    1. 运行main方法,得到如下评估结果:

     # of classes:    10
     Accuracy:        0.9897
     Precision:       0.9897
     Recall:          0.9897
     F1 Score:        0.9896

        整个效果还比较好,保存好训练的网络,便可以用于手写体数据的识别了,下一篇博客将介绍怎么加载定型的网络,配合springMVC来开发一个手写体识别的应用。

    转载于:https://www.cnblogs.com/jfdwd/p/11174567.html

    展开全文
  • 在图像处理领域,由于图像的数据量非常大,伴随着产生的问题是网络参数量非常大,而卷积神经网络引入卷积核巧妙地优化了这个问题。卷积核对图像进行局部扫描,提取其中的特征。对于小卷积核无法获取全局特征的问题,...

    神经网络是在传统多项式回归的基础上,受到了生物神经网络”激活“现象的启发,引入了激活函数而构建起来的机器学习模型。
    在图像处理领域,由于图像的数据量非常大,伴随着产生的问题是网络参数量非常大,而卷积神经网络引入卷积核巧妙地优化了这个问题。卷积核对图像进行局部扫描,提取其中的特征。对于小卷积核无法获取全局特征的问题,通过增加网络层数,前面多层小卷积核的感受野逐渐叠加后,后面小卷积核的感受野也会逐渐扩大。而且随着网络层数的增加,每次完成卷积后都会引入ReLU激活函数,对模型引入了更多的非线性,增强了网络的拟合能力。

    卷积

    关于卷积的含义,有很多种解释。知乎上最经典的解释:

    降维打击

    卷积就是把二元函数 U(x,y) = f(x)g(y) 卷成一元函数 V(t) 嘛,俗称降维打击。


    image.png

    1)怎么卷?

    考虑到函数 f 和 g 应该地位平等,或者说变量 x 和 y 应该地位平等,一种可取的办法就是沿直线 x+y = t 卷起来:

    2)卷了有什么用?

    可以用来做多位数乘法呀,比如:


    image.png

    注意第二个等号右边每个括号里的系数构成的序列 (14,34,14,4),实际上就是序列 (2,4) 和 (7,3,1) 的卷积。
    这里的“乘法转加法”的运算还可以有更加直观的一个解释:


    image.png

    左图序列保持不动,右图序列顺序反转然后开始旋转,每旋转一次两序列重合位置相乘求和,得到循环卷积序列。拿刚才的卷积为例,


    image.png

    (不知道为什么此处想到了机械计算器,不知道会不会是类似的原理。)

    信号卷积的通俗理解

    有了刚才的认识,就可以从非时变系统的角度去理解卷积,以离散信号为例,连续信号同理。
    已知x[0]=a, x[1]=b, x[2]=c


    image.png

    已知y[0]=i, y[1]=j, y[2]=k


    image.png

    下面通过演示求x[n]*y[n]的过程,揭示卷积的物理意义。
    第一步,x[n]乘以y[0]并平移到位置0:


    image.png

    第二步,x[n]乘以y[1]并平移到位置1:


    image.png

    第三步,x[n]乘以y[2]并平移到位置2:


    image.png

    最后,把上面三个图叠加,就得到了:


    image.png

    从这里可以看到卷积的重要的物理意义是:一个函数(如:单位响应)在另一个函数(如:输入信号)上的加权叠加。
    对于线性时不变系统,如果知道该系统的单位响应,那么将单位响应和输入信号求卷积,就相当于把输入信号的各个时间点的单位响应$$加权叠加$$,就直接得到了输出信号。通俗的说:
    在输入信号的每个位置,叠加一个单位响应,就得到了输出信号。
    这也正是单位响应是如此重要的原因。

    卷积神经网络

    用在图像识别领域,卷积神经网络中的卷积核(滤镜)要实现的就是,将图像中的特征提取出来。
    具体怎么提取?以猫为例,显著特征是圆眼睛三角耳朵尖下巴,但是总体来说狐狸也长这个样子,只是耳朵更大,下巴更尖而已。这些细小的区别很难描述。

    卷积核的引入

    图像识别首先要解决的问题是:特征是什么?第二要解决的问题是:参数规模可控。
    由于图像可以看住是数据矩阵,输入传统的神经网络后,将网络的输出和标签求交叉熵,代入sigmoid函数,或者求对数放入softmax函数,就可以得到图像属于某个类别的概率。然后用梯度下降方法训练网络参数即可。
    但是根据图像矩阵的数据分布特点,对于一张1000*1000的图片而言,如果用传统的神经网络,以隐层节点为10^6为例,参数的数据量为10^3×10^3×10^6=10^12。如下图中左图。


    image.png

    但是,如果用卷积核来提取特征,以10×10的卷积核为例,如右图,参数量瞬间降到了10×10×10^6=10^8!参数降维的效果还是很明显的。

    参数共享

    另外还有一个参数降维的好办法就是参数共享。
    怎么理解权值共享呢?卷积核的这100个参数(也就是卷积操作)看成是提取特征的方式,该方式与位置无关。这其中隐含的原理则是:图像的一部分的统计特性与其他部分是一样的。这也意味着我们在这一部分学习的特征也能用在另一部分上,所以对于这个图像上的所有位置,我们都能使用同样的学习特征。一个形象化的展示如下图。相同的卷积核在整个图片上扫描,得到的结果取值越大,说明该区域的数据特征与卷积核越一致,通过这种方式,就提取出了图像的局部特征。


    image.png

    从图上可以看到,一个有着固定取值的卷积核对图像矩阵进行扫描,具体的运算过程见下图。就是卷积核和被扫描区域的数据相乘后直接相加,最后相加的结果作为卷积后该位置的取值。这也是为何卷积网络的特征提取可以保留其位置特征的原因。


    image.png

    很显然,图像矩阵的数据分布与卷积核越接近,取值就会越大。这样,卷积核的取值会逐渐接近图像中数据的分布,而类似的图像(被打成同样标签)中的相同特征被逐渐提取出来。

    多个卷积核

    在有多个卷积核时,如下图所示:


    image.png

    上图右,不同颜色表明不同的卷积核。每个卷积核都会将图像生成为另一幅图像。比如两个卷积核就可以将生成两幅图像,这两幅图像可以看做是一张图像的不同的通道。

    池化

    在通过卷积获得了特征 (features) 之后,下一步我们希望利用这些特征去做分类。理论上讲,人们可以用所有提取得到的特征去训练分类器,例如 softmax 分类器,但这样做面临计算量的挑战。例如:对于一个 96X96 像素的图像,假设我们已经学习得到了400个定义在8X8输入上的特征,每一个特征和图像卷积都会得到一个 (96 − 8 + 1) × (96 − 8 + 1) = 7921 维的卷积特征,由于有 400 个特征,所以每个样例 (example) 都会得到一个7921× 400 = 3,168,400 维的卷积特征向量。学习一个拥有超过 3 百万特征输入的分类器十分不便,并且容易出现过拟合 (over-fitting)。
    为了解决这个问题,首先回忆一下,我们之所以决定使用卷积后的特征是因为图像具有一种“静态性”的属性,这也就意味着在一个图像区域有用的特征极有可能在另一个区域同样适用。因此,为了描述大的图像,一个很自然的想法就是对不同位置的特征进行聚合统计,例如,人们可以计算图像一个区域上的某个特定特征的平均值 (或最大值)。这些概要统计特征不仅具有低得多的维度 (相比使用所有提取得到的特征),同时还会改善结果(不容易过拟合)。这种聚合的操作就叫做池化 (pooling),有时也称为平均池化或者最大池化 (取决于计算池化的方法)。


    image.png

    全连接层

    全连接就是个矩阵乘法,相当于一个特征空间变换,可以把有用的信息提取整合。全连接层一般在卷积网络的最后,前面的卷积层、池化层和激活函数将原始数据映射到隐层特征空间,全连接层则起到将学到的“分布式特征表示”映射到样本标记空间。或者说,全连接层的主要目的就是维度变换,把高维的数据(分布式特征表示)变成低维(样本标记)。在这个过程中,有用的信息保留下来,但会损失特征的位置信息。另外,全连接层可以用(h×w)个1×1的卷积核来代替,h和w分别为前层卷积结果的高和宽。
    由于全连接层的引入带来了大量参数,近来人们逐渐发现全连接层的存在与否对结果的影响并不明显,另一方面,全局平均池化(global averaging pooling,AGP)取代FC来融合学到的深度特征,最后仍用softmax等损失函数作为网络目标函数来指导学习过程的方式在ResNet和GoogleNet上都取得了非常好的预测结果。
    另一方面,魏秀参等(见参考)近期的研究发现,FC可在模型表示能力迁移过程中充当“防火墙”的作用。

    经典卷积网络模型

    卷积神经网络的发展过程中,先后出现了很多里程碑意义的网络模型,例如AlexNet,VGG和GoogleNet。

    AlexNet

    AlexNet由7层隐层构成。其中1~5是卷积层,6-7是全连接层。
    下图即为Alex的CNN结构图。需要注意的是,该模型采用了2-GPU并行结构,即第1、2、4、5卷积层都是将模型参数分为2部分进行训练的。在这里,更进一步,并行结构分为数据并行与模型并行。数据并行是指在不同的GPU上,模型结构相同,但将训练数据进行切分,分别训练得到不同的模型,然后再将模型进行融合。而模型并行则是,将若干层的模型参数进行切分,不同的GPU上使用相同的数据进行训练,得到的结果直接连接作为下一层的输入。


    image.png

    上图模型的基本参数为:
    输入:224×224大小的图片,3通道
    第一层卷积:5×5大小的卷积核96个,每个GPU上48个。
    第一层max-pooling:2×2的核。
    第二层卷积:3×3卷积核256个,每个GPU上128个。
    第二层max-pooling:2×2的核。
    第三层卷积:与上一层是全连接,3×3的卷积核384个。分到两个GPU上个192个。
    第四层卷积:3×3的卷积核384个,两个GPU各192个。该层与上一层连接没有经过pooling层。
    第五层卷积:3×3的卷积核256个,两个GPU上个128个。
    第五层max-pooling:2×2的核。
    第一层全连接:4096维,将第五层max-pooling的输出连接成为一个一维向量,作为该层的输入。
    第二层全连接:4096维
    Softmax层:输出为1000,输出的每一维都是图片属于该类别的概率。

    VGG

    VGG最大的贡献是成功证明了小卷积核+小池化层+深度网络的潜力。通过反复堆叠33的小型卷积核和22的池化层,VGG将卷积神经网络的深度拓展到了19层。更重要的是,VGG的拓展性能非常好,迁移到其他图片数据上的泛化性非常好。
    下图中展示了VGGNet的网络结构。作者从A方案11层卷积神经网络开始,逐渐增加卷积的层数到E方案的19层。


    image.png

    从图上可以看出,VGGNet有5段卷积,每段中都有1~3个3×3的小卷积核,每段卷积核的数量一样,段数越大,卷积核数量增加:64-128-256-512-512。后期层数增加后,会有两个小卷积核堆叠在一起的情况,也就是多个小感受野堆叠后实际感受野扩大。例如2层3×3的小卷积核叠在一起,相当于1个5×5的卷积核,但是卷积核的参数比较小。


    image.png

    此外,每次做完卷积,都要带入到ReLU激活函数中去,也增加了模型的非线性表达能力。
    未完待续。。。

    最后,感谢知乎各位大神对卷积的精彩解释!水平有限,在内容上表述上的疏忽,还有一些理解不到位不正确的地方,欢迎留言指出~谢谢!
    参考:
    [卷积解释]
    https://www.zhihu.com/question/54677157/answer/141316355
    https://www.zhihu.com/question/22298352/answer/34267457
    卷积神经网络模型:http://www.36dsj.com/archives/24006
    全连接层:https://www.zhihu.com/question/41037974/answer/150522307
    深度学习Deep Learning:https://github.com/exacity/deeplearningbook-chinese

    展开全文
  • 附件是VISIO版本的CNN的通俗解释。包含了卷积的运算过程的图片化过程展示。卷积神经网络的的运行步骤。
  • 卷积神经网络-解释1

    2018-07-14 20:52:00
    这篇文章原地址为An Intuitive Explanation of Convolutional Neural Networks,卷积神经网络的讲解非常通俗易懂。 什么是卷积神经网络?为什么它们很重要? 卷积神经网络(ConvNets 或者 CNNs)属于神经网络的...
  • 卷积神经网络直观解释

    千次阅读 2016-08-30 11:26:41
    卷积神经网络直观解释 ================== ---------- 什么是卷积神经网络? ------------- 在模式识别的传统模型中,利用手工设计的特征提取器从输入中提取相关信息,消除无关变量。一个...
  • 二维离散卷积2.1 二维卷积的简单案例2.2 卷积神经网络中的卷积3. 卷积神经网路3.1 卷积层(特征提取)3.2 池化层(特征压缩)3.3 激活函数3.4 归一化3.5 全连接层3.6 卷积神经网络的前向传播3.7 目标函数与反向传播...
  • 通俗易懂的解释卷积神经网络

    千次阅读 2019-01-17 18:51:45
    什么是卷积神经网络?为什么它们很重要? 卷积神经网络(ConvNets 或者 CNNs)属于神经网络的范畴,已经在诸如图像识别和分类的领域证明了其高效的能力。卷积神经网络可以成功识别人脸、物体和交通信号,从而为...
  • 上一期,我们一起学习了深度学习中如何避免过拟合,深度学习三人行(第7期)----深度学习之避免过拟合(正则化)接下来我们一起学习下网红网络之卷积神经网络(CNN),我们多多交流,共同进步...
  • 在前面的章节中,介绍了全连接神经网络的相关知识,本章将介绍一种全新的神经网络结构——卷积神经网络(Convolutional Neural Network,CNN)。在很多场合,都能看到卷积神经网络的身影,如图像识别、自然语言处理、...
  • 卷积神经网络是目前很...这也可以解释为什么卷积神经网络适合处理图像识别问题。 第二个重要的内容是池化。池化一般是选出一个方形区域里面的最大值。这就是一种滤波方式或者说平滑方式。当然也可以取平均值或者中位值
  • 通俗理解卷积神经网络
  • 卷积神经网络

    2021-04-19 14:25:56
    参考至图卷积神经网络-沈华伟: 图卷积神经网络-沈华伟. 目录一、卷积神经网络1.1 CNN的定义1.2 From CNN to graph CNN二、卷积2.1 卷积的定义 一、卷积神经网络 1.1 CNN的定义 卷积神经网络(Convolutional Neural ...
  • 其实卷积池化完全可以是看作网络自动帮你提取特征的过程,那么如何理解这个特征提取呢? CONV卷积的计算,其实很简单: 有几个元素: 1.filter,可以理解为对一张图像提取特征的助手,这里为(2*2)大小,500...
  • 卷积神经网络

    千次阅读 2017-05-16 11:07:40
    看过很多资料一直对卷积神经网络半知半解,后来看到了这篇文章豁然开朗,所以转载希望可以帮助更多人理解卷积神经网络
  • CNN笔记 通俗理解卷积神经网络
  • CNN卷积神经网络原理详解(上)

    万次阅读 多人点赞 2019-10-18 23:59:17
    CNN卷积神经网络原理详解(上)前言卷积神经网络的生物背景我们要让计算机做什么?卷积网络第一层全连接层训练 前言 卷积网络(convolutional network),也叫作卷积神经网络(convolutional neural network,CNN),是...
  •                【转载】通俗理解卷积神经网络(cs231n与5月dl班课程笔记) &nbs...
  • 卷积神经网络中感受野的详细介绍

    万次阅读 多人点赞 2018-07-08 13:38:22
    1. 感受野的概念在卷积神经网络中,感受野(Receptive Field)的定义是卷积神经网络每一层输出的特征图(feature map)上的像素点在输入图片上映射的区域大小。再通俗点的解释是,特征图上的一个点对应输入图上的...
  • CNN-卷积神经网络

    2021-03-03 20:43:50
    卷积神经网络 笔记整理

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,322
精华内容 2,128
关键字:

卷积神经网络通俗解释