卷积神经网络CNN究竟是怎样一步一步工作的?

转载:https://www.jianshu.com/p/fe428f0b32c1

[透析] 卷积神经网络CNN究竟是怎样一步一步工作的?

  • 视频地址:https://www.youtube.com/embed/FmpDIaiMIeA
  • 文档参阅:pdf [2MB] & ppt [6MB] & Web View & GitBook
  • 补充知识:深度学习 — 反向传播理论推导

  • 卷积神经网络CNN究竟是怎样一步一步工作的?_第1张图片

    当你听到说深度学习打破了某项新技术障碍,那么十有八九就会涉及到卷积神经网络。它们也被称作CNNs或着ConvNets,是深层神经网络领域的主力。它们已经学会对图像进行分类,在某些情况下甚至超过了人类。如果有一个方法证明了这种假设,那就是CNN。特别酷的一点就是,当你将它们分解为基本模块时,它们很容易被理解。这里有一个视频,很详细地讨论了关于这些图像问题。

    LeNet-5
    Classfication

    先验工作

    • 【icml09 - Convolutional Deep Belief Networks.pdf】
    卷积神经网络CNN究竟是怎样一步一步工作的?_第2张图片
    卷积神经网络CNN究竟是怎样一步一步工作的?_第3张图片
    卷积神经网络CNN究竟是怎样一步一步工作的?_第4张图片
    • 【Playing Atari with Deep Reinforcement Learning】
    卷积神经网络CNN究竟是怎样一步一步工作的?_第5张图片
    卷积神经网络CNN究竟是怎样一步一步工作的?_第6张图片
    • 【Robot Learning Manipulation Action Plans】
    卷积神经网络CNN究竟是怎样一步一步工作的?_第7张图片
    卷积神经网络CNN究竟是怎样一步一步工作的?_第8张图片
    卷积神经网络CNN究竟是怎样一步一步工作的?_第9张图片

    A toy ConvNet:X’s and O’s

    识别一幅图片是包含有字母"X"还是字母"O"?

    为了帮助指导你理解卷积神经网络,我们讲采用一个非常简化的例子:确定一幅图像是包含有"X"还是"O"?

    卷积神经网络CNN究竟是怎样一步一步工作的?_第10张图片

    这个例子足够说明CNN背后的原理,同时它足够简单,能够避免陷入不必要的细节。在CNN中有这样一个问题,就是每次给你一张图,你需要判断它是否含有"X"或者"O"。并且假设必须两者选其一,不是"X"就是"O"。理想的情况就像下面这个样子:

    卷积神经网络CNN究竟是怎样一步一步工作的?_第11张图片
    标准的"X"和"O",字母位于图像的正中央,并且比例合适,无变形

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

    卷积神经网络CNN究竟是怎样一步一步工作的?_第12张图片

    计算机要解决上面这个问题,一个比较天真的做法就是先保存一张"X"和"O"的标准图像(就像前面给出的例子),然后将其他的新给出的图像来和这两张标准图像进行对比,看看到底和哪一张图更匹配,就判断为哪个字母。但是这么做的话,其实是非常不可靠的,因为计算机还是比较死板的。在计算机的“视觉”中,一幅图看起来就像是一个二维的像素数组(可以想象成一个棋盘),每一个位置对应一个数字。在我们这个例子当中,像素值"1"代表白色,像素值"-1"代表黑色。

    卷积神经网络CNN究竟是怎样一步一步工作的?_第13张图片

    当比较两幅图的时候,如果有任何一个像素值不匹配,那么这两幅图就不匹配,至少对于计算机来说是这样的。
    对于这个例子,计算机认为上述两幅图中的白色像素除了中间的3*3的小方格里面是相同的,其他四个角上都不同:

    卷积神经网络CNN究竟是怎样一步一步工作的?_第14张图片

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

    卷积神经网络CNN究竟是怎样一步一步工作的?_第15张图片

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

    卷积神经网络CNN究竟是怎样一步一步工作的?_第16张图片

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

    Features

    卷积神经网络CNN究竟是怎样一步一步工作的?_第17张图片

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

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

    卷积神经网络CNN究竟是怎样一步一步工作的?_第18张图片

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

    卷积神经网络CNN究竟是怎样一步一步工作的?_第19张图片
    卷积神经网络CNN究竟是怎样一步一步工作的?_第20张图片
    卷积神经网络CNN究竟是怎样一步一步工作的?_第21张图片
    卷积神经网络CNN究竟是怎样一步一步工作的?_第22张图片
    卷积神经网络CNN究竟是怎样一步一步工作的?_第23张图片

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

    卷积神经网络CNN究竟是怎样一步一步工作的?_第24张图片

    接下来就跟进介绍里面的数学操作,也就是我们常说的“卷积”操作。

    卷积(Convolution)

    Convolution
    卷积神经网络CNN究竟是怎样一步一步工作的?_第25张图片

    当给你一张新的图时,CNN并不能准确地知道这些features到底要匹配原图的哪些部分,所以它会在原图中每一个可能的位置进行尝试。这样在原始整幅图上每一个位置进行匹配计算,我们相当于把这个feature变成了一个过滤器。这个我们用来匹配的过程就被称为卷积操作,这也就是卷积神经网络名字的由来。

    这个卷积操作背后的数学知识其实非常的简单。要计算一个feature和其在原图上对应的某一小块的结果,只需要简单地将两个小块内对应位置的像素值进行乘法运算,然后将整个小块内乘法运算的结果累加起来,最后再除以小块内像素点总个数即可。如果两个像素点都是白色(也就是值均为1),那么1*1 = 1,如果均为黑色,那么(-1)*(-1) = 1。不管哪种情况,每一对能够匹配上的像素,其相乘结果为1。类似地,任何不匹配的像素相乘结果为-1。如果一个feature(比如n*n)内部所有的像素都和原图中对应一小块(n*n)匹配上了,那么它们对应像素值相乘再累加就等于n2,然后除以像素点总个数n2,结果就是1。同理,如果每一个像素都不匹配,那么结果就是-1。具体过程如下:

    卷积神经网络CNN究竟是怎样一步一步工作的?_第26张图片
    卷积神经网络CNN究竟是怎样一步一步工作的?_第27张图片
    卷积神经网络CNN究竟是怎样一步一步工作的?_第28张图片
    卷积神经网络CNN究竟是怎样一步一步工作的?_第29张图片
    卷积神经网络CNN究竟是怎样一步一步工作的?_第30张图片
    卷积神经网络CNN究竟是怎样一步一步工作的?_第31张图片
    卷积神经网络CNN究竟是怎样一步一步工作的?_第32张图片
    卷积神经网络CNN究竟是怎样一步一步工作的?_第33张图片
    卷积神经网络CNN究竟是怎样一步一步工作的?_第34张图片
    卷积神经网络CNN究竟是怎样一步一步工作的?_第35张图片

    对于中间部分,也是一样的操作:

    卷积神经网络CNN究竟是怎样一步一步工作的?_第36张图片
    卷积神经网络CNN究竟是怎样一步一步工作的?_第37张图片
    卷积神经网络CNN究竟是怎样一步一步工作的?_第38张图片
    卷积神经网络CNN究竟是怎样一步一步工作的?_第39张图片

    最后整张图算完,大概就像下面这个样子:

    卷积神经网络CNN究竟是怎样一步一步工作的?_第40张图片

    然后换用其他feature进行同样的操作,最后得到的结果就是这样了:

    卷积神经网络CNN究竟是怎样一步一步工作的?_第41张图片

    为了完成我们的卷积,我们不断地重复着上述过程,将feature和图中每一块进行卷积操作。最后通过每一个feature的卷积操作,我们会得到一个新的二维数组。这也可以理解为对原始图像进行过滤的结果,我们称之为feature map,它是每一个feature从原始图像中提取出来的“特征”。其中的值,越接近为1表示对应位置和feature的匹配越完整,越是接近-1,表示对应位置和feature的反面匹配越完整,而值接近0的表示对应位置没有任何匹配或者说没有什么关联。

    卷积神经网络CNN究竟是怎样一步一步工作的?_第42张图片

    这样我们的原始图,经过不同feature的卷积操作就变成了一系列的feature map。我们可以很方便,直观地将这整个操作视为一个单独的处理过程。在CNN中,我们称之为卷积层(convolution layer),这样你可能很快就会想到后面肯定还有其他的layer。没错,后面会提到。我们可以将卷积层看成下面这个样子:

    因此可想而知,CNN其实做的操作也没什么复杂的。但是尽管我们能够以这一点篇幅就描述了CNN的工作,其内部的加法,乘法和除法操作的次数其实会增加地很快。从数学的角度来说,它们会随着图像的大小,每一个filter的大小和filter的数目呈线性增长。由于有这么多因素的影响,很容易使得这个问题的计算量变得相当的庞大,这也难怪很多微处理器制造商现在都在生产制造专业的芯片来跟上CNN计算的需求。

    池化(Pooling)

    Pooling

    CNN中使用的另一个有效的工具被称为“池化(Pooling)”。池化可以将一幅大的图像缩小,同时又保留其中的重要信息。池化背后的数学顶多也就是小学二年级水平。它就是将输入图像进行缩小,减少像素信息,只保留重要信息。通常情况下,池化都是2*2大小,比如对于max-pooling来说,就是取输入图像中2*2大小的块中的最大值,作为结果的像素值,相当于将原始图像缩小了4倍。(注:同理,对于average-pooling来说,就是取2*2大小块的平均值作为结果的像素值。)

    对于本文的这个例子,池化操作具体如下:

    卷积神经网络CNN究竟是怎样一步一步工作的?_第43张图片
    卷积神经网络CNN究竟是怎样一步一步工作的?_第44张图片
    卷积神经网络CNN究竟是怎样一步一步工作的?_第45张图片

    不足的外面补"0":

    卷积神经网络CNN究竟是怎样一步一步工作的?_第46张图片

    经过最大池化操作(比如2*2大小)之后,一幅图就缩小为原来的四分之一了:

    然后对所有的feature map执行同样的操作,得到如下结果:

    卷积神经网络CNN究竟是怎样一步一步工作的?_第47张图片

    因为最大池化(max-pooling)保留了每一个小块内的最大值,所以它相当于保留了这一块最佳的匹配结果(因为值越接近1表示匹配越好)。这也就意味着它不会具体关注窗口内到底是哪一个地方匹配了,而只关注是不是有某个地方匹配上了。这也就能够看出,CNN能够发现图像中是否具有某种特征,而不用在意到底在哪里具有这种特征。这也就能够帮助解决之前提到的计算机逐一像素匹配的死板做法。

    当对所有的feature map执行池化操作之后,相当于一系列输入的大图变成了一系列小图。同样地,我们可以将这整个操作看作是一个操作,这也就是CNN中的池化层(pooling layer),如下:

    卷积神经网络CNN究竟是怎样一步一步工作的?_第48张图片

    通过加入池化层,可以很大程度上减少计算量,降低机器负载。

    Normalization

    卷积神经网络CNN究竟是怎样一步一步工作的?_第49张图片

    激活函数Relu (Rectified Linear Units)

    这是一个很小但是很重要的操作,叫做Relu(Rectified Linear Units),或者修正线性单元。它的数学公式也很简单:
    ![][01]
    [01]:http://latex.codecogs.com/png.latex?f(x)%20=%20max(0,%20x)

    对于输入的负值,输出全为0,对于正值,原样输出。关于其功能,更多详见 这里。

    下面我们看一下本文的离例子中relu激活函数具体操作:


    卷积神经网络CNN究竟是怎样一步一步工作的?_第50张图片
    卷积神经网络CNN究竟是怎样一步一步工作的?_第51张图片
    卷积神经网络CNN究竟是怎样一步一步工作的?_第52张图片

    最后,对整幅图操作之后,结果如下:

    卷积神经网络CNN究竟是怎样一步一步工作的?_第53张图片

    同样地,在CNN中,我们这一系列操作视为一个操作,那么就得到Relu Layer,如下:

    卷积神经网络CNN究竟是怎样一步一步工作的?_第54张图片

    Deep Learning

    最后,我们将上面所提到的卷积,池化,激活放在一起,就是下面这个样子:

    卷积神经网络CNN究竟是怎样一步一步工作的?_第55张图片

    然后,我们加大网络的深度,增加更多的层,就得到深度神经网络了:

    卷积神经网络CNN究竟是怎样一步一步工作的?_第56张图片

    然后在不同的层,我们进行可视化,就可以看到本文开头提到的先验知识里面的结果了:

    卷积神经网络CNN究竟是怎样一步一步工作的?_第57张图片

    全连接层(Fully connected layers)

    卷积神经网络CNN究竟是怎样一步一步工作的?_第58张图片
    卷积神经网络CNN究竟是怎样一步一步工作的?_第59张图片
    卷积神经网络CNN究竟是怎样一步一步工作的?_第60张图片
    卷积神经网络CNN究竟是怎样一步一步工作的?_第61张图片
    卷积神经网络CNN究竟是怎样一步一步工作的?_第62张图片
    卷积神经网络CNN究竟是怎样一步一步工作的?_第63张图片
    卷积神经网络CNN究竟是怎样一步一步工作的?_第64张图片
    卷积神经网络CNN究竟是怎样一步一步工作的?_第65张图片

    根据结果判定为"X":


    卷积神经网络CNN究竟是怎样一步一步工作的?_第66张图片

    在这个过程中,我们定义这一系列操作为”全连接层“(Fully connected layers):

    卷积神经网络CNN究竟是怎样一步一步工作的?_第67张图片

    全连接层也能够有很多个,如下:

    卷积神经网络CNN究竟是怎样一步一步工作的?_第68张图片

    【综合上述所有结构】

    卷积神经网络CNN究竟是怎样一步一步工作的?_第69张图片

    这一整个过程,从前到后,被称作”前向传播“,得到一组输出,然后通过反向传播来不断纠正错误,进行学习。

    反向传播 (Backpropagation)

    此处数学原理可以参见:深度学习 —— 反向传播理论推导.

    卷积神经网络CNN究竟是怎样一步一步工作的?_第70张图片
    卷积神经网络CNN究竟是怎样一步一步工作的?_第71张图片
    卷积神经网络CNN究竟是怎样一步一步工作的?_第72张图片
    卷积神经网络CNN究竟是怎样一步一步工作的?_第73张图片
    卷积神经网络CNN究竟是怎样一步一步工作的?_第74张图片
    卷积神经网络CNN究竟是怎样一步一步工作的?_第75张图片

    Gradient Descent Optimizer

    卷积神经网络CNN究竟是怎样一步一步工作的?_第76张图片
    卷积神经网络CNN究竟是怎样一步一步工作的?_第77张图片

    Hyperparameters

    卷积神经网络CNN究竟是怎样一步一步工作的?_第78张图片

    Application

    卷积神经网络CNN究竟是怎样一步一步工作的?_第79张图片
    Images
    卷积神经网络CNN究竟是怎样一步一步工作的?_第80张图片
    Soung
    卷积神经网络CNN究竟是怎样一步一步工作的?_第81张图片
    Text
    卷积神经网络CNN究竟是怎样一步一步工作的?_第82张图片
    卷积神经网络CNN究竟是怎样一步一步工作的?_第83张图片

    Learn more

    卷积神经网络CNN究竟是怎样一步一步工作的?_第84张图片

    If you'd like to dig deeper into deep learning, check out my Demystifying Deep Learning post. I also recommend the notes from the Stanford CS 231 course by Justin Johnson and Andrej Karpathy that provided inspiration for this post, as well as the writings of Christopher Olah, an exceptionally clear writer on the subject of neural networks.

    If you are one who loves to learn by doing, there are a number of popular deep learning tools available. Try them all! And then tell us what you think.
    Caffe
    CNTK
    Deeplearning4j
    TensorFlow
    Theano
    Torch
    Many others

    I hope you've enjoyed our walk through the neighborhood of Convolutional Neural Networks. Feel free to start up a conversation.

    卷积神经网络CNN究竟是怎样一步一步工作的?_第85张图片
    Brandon Rohrer

    本文重点在前面的具体操作部分,所以后面的部分没有细说,只是带过了,如有必要,后期会逐渐完善,谢谢!

    Reference:

    • http://brohrer.github.io/how_convolutional_neural_networks_work.html
    • 深度学习 —— 反向传播理论推导

    (注:感谢您的阅读,希望本文对您有所帮助。如果觉得不错欢迎分享转载,但请先点击 这里 获取授权。本文由 版权印 提供保护,禁止任何形式的未授权违规转载,谢谢!)

          

哎呦,不行了,要睡觉了,赏我 e(=2.72) 元咖啡钱吧,您的支持将鼓励我继续创作!

赞赏支持
等22人



  
    

已关注
zhwhong

写了 266586 字,被 1605 人关注,获得了 1964 个喜欢


Stay Hungry Stay Foolish
常葆求知若饥 常存虚怀若愚

Blog:https://zhwhong.cn
(原地址zhwhong.ml暂时无法访问)





stingwan
42楼 · 2019.04.02 13:36

用动画方式讲卷积核的过滤过程,制作精心。

银河歌者
41楼 · 2018.11.03 10:37

全连接层那里0.92和0.51是怎么得到的呀?不懂-:(。。。。。。

C390
我也这里没弄明白,可以解疑下吗?

2019.02.12 21:32 回复 举报

@C390 后面其实是一个回归分类的过程。对于普通的分类问题,最后就是逻辑回归regression,多分类会用到softmax回归。将全连接得到的列向量比如n维列向量[1,n]乘以权重矩[n,2],最后得到一个[1,2]的结果(这2个数值可以理解为代表属于两类的概率)用于进行二分类。多分类问题类比,softmax会得到属于每一类的概率,取概率最大的一类作为预测结果。

2019.02.16 13:47 回复 举报

@C390 至于权重,那个是学习出来的,这里的0.92和0.51只是随便给出的两个数字打个比方,概率大的我们认为更有可能是那一类。

2019.02.16 13:47 回复 举报
添加新评论 还有1条评论, 展开查看
青空的巡礼者
40楼 · 2018.10.16 17:17

谢谢你的文章,仔细看完了很有收获。

Kevin__8e2c
39楼 · 2018.10.03 10:37

看了你的文章,终于明白了些CNN部分。专门注册简书绑定手机给你点赞??感谢作者,希望再接再厉,多出好文章???

谢谢!

2018.10.19 14:10 回复 举报
放下往事只能回味
38楼 · 2018.09.29 17:06

一直不明白的,现在看懂了部分,好文,得多看几次。

Starrs
37楼 · 2018.09.27 09:23

大感谢!

有收获就好~

2018.10.02 10:50 回复 举报
星星点灯_9a6d
36楼 · 2018.09.03 13:44

特意注册了一个账号过来点赞。不过反向传播那里没理解,希望继续更新。:+1: :+1:

可以参考Stanford的CS231n课程的反向传播笔记: http://cs231n.github.io/optimization-2/ ,中文翻译在这里: https://zhuanlan.zhihu.com/p/21407711?refer=intelligentunit

2018.10.02 11:14 回复 举报
向日葵小班班长
34楼 · 2018.07.13 11:22

真的写的太好了,一直搞不懂CNN的过程,很详细,真的很好,感谢作者。。。

谢谢!相互学习~

2018.07.13 12:37 回复 举报
采香行处蹙连钱
33楼 · 2018.07.12 16:34

Nice job! 后面全连接层处理可以参考:https://blog.csdn.net/shine19930820/article/details/78359249

杰西大魔王
32楼 · 2018.07.04 10:04

哇谢谢楼主,收获满满。 彩色图片是怎么判断匹配的呢,一个像素点有RGB三个颜色,每个颜色取值255呢

Hello密斯托李
30楼 · 2018.06.12 14:13

厉害了我的哥

cuieney
29楼 · 2018.05.24 20:55

楼主牛逼

allenmitnick
28楼 · 2018.04.12 19:57

谢谢楼主

:wink: 有收获就好,不谢

2018.04.15 11:33 回复 举报
朱利安_AI产品经理
27楼 · 2018.02.16 17:18

很详细,手动点赞

daaee3886531
26楼 · 2018.02.10 09:21

谢谢楼主, 你写的太好了, 看完感觉豁然开朗,看别人写的都看不懂

谢谢,有帮助就好:wink:

2018.02.11 11:00 回复 举报
被以下专题收入,发现更多相似内容
深度学习·计算...
神经网络与深度学习
机器学习与计算机视觉
@IT·互联网
深度学习·神经...
首页投稿(暂停...
收藏夹
展开更多
推荐阅读 更多精彩内容
  
  

        
许开聪俊

许开聪俊 许府宾朋满,开年紫气来。 聪慧赋书文,俊武定军山。

48
常路明作家

        

【DAY 3】 H4 李喜宏 浅析 咪蒙《致贱人:我凭什么要帮你?!》

每个人都说内容创业已经过了最佳时机,写公众号已经晚了。然而,江湖中就有这么一位奇女子,用5个月的时间写出了200万+的读者。两篇爆款文章就狂吸40万粉。就算是软文,评论也是清一色的叫好。这位神奇人物就是咪蒙,而我们今天就是来浅析一下她的一篇爆文《致贱人:我凭什么要帮你?!》…




瀟宇風
        
自己做还有什么你不会的

之前在网上看过一段话,大概意思是:能从百度上查找到解决方法的就别打扰别人。 确实,别人对你第一次的帮助是施舍,第二次帮你是人情面子,第三次甚至你老是麻烦别人就属于道德绑架, 是谁都跟你似的这么闲,不是谁都心甘情愿的帮你,哪怕最好的朋友人家也有点烦吧。 我从小就属于那种独来独...

48
罗小扇

        
如果勇敢一次,人生会不会是另外一种样子。

好像生活一直是在选择中度过:早饭是牛奶面包还是豆浆油条、这件裙子是买红色还是黑色、周末是宅在家里还是三两人自驾远行。每一天,每一个小时,你都在做选择,就像我写下这句话的时候,我也在想,我到底要用哪一个成语?当然,后来我一个成语都没用。 生活中琐碎的小事只关乎喜好,是不用深思...

48
汤圆儿儿儿








                    
                    

你可能感兴趣的:(算法,CNN)