目录

Convolution Netural Network

摘要

本节内容综述

CNN V.s. DNN

CNN架构提出的基础

1.Some patterns are much smaller than the whole image

2.The same patterns appear in different regions

3.Subsampling the pixels will not change the object

CNN的步骤

Convolution(卷积)

Max Pooling

Flatten(展开)

CNN in Keras

CNN的其他应用

Conclusion(总结)


Convolution Netural Network

摘要

CNN常常被用在影像处理上,它的theory base就是三个property和两个架构

convolution 架构:针对property 1和property 2

max pooling架构:针对property 3

本节内容综述

1.引出 CNN ,为什么不用正常的全连接网络?因为如果输入图片后,紧跟全连接层,那么参数过多。引出,一开始要做一些“简化”,这就是CNN的引出。

2.为什么CNN常常被用在影像处理上。

3.接着介绍了CNN的架构:Convolution, Max Pooling, Convolution, Max Pooling,…, Flatten, 全连接层

4.开始介绍Convolution

5.开始介绍Max Pooling和Flatten

6.CNN in Keras,讲解如何用Keras声明一个CNN,涉及到参数的意义,以及前后卷积层的对接

7.CNN 的其他应用如围棋等

CNN V.s. DNN

我们当然可以用一般的neural network来做影像处理,不一定要用CNN,比如说,你想要做图像的分类,那你就去train一个neural network,

它的input是一张图片,你就用里面的pixel来表示这张图片,也就是一个很长很长的vector,而output则是由图像类别组成的vector,

假设你有1000个类别,那output就有1000个dimension。

那现在的问题是这样子:当我们直接用一般的fully connected的feedforward network来做图像处理的时候,往往会需要太多的参数。

所以,CNN做的事情其实是,来简化这个neural network的架构,我们根据自己的知识和对图像处理的理解,一开始就把某些实际上用不到的参数给过滤掉

我们一开始就想一些办法,不要用fully connected network,而是用比较少的参数,来做图像处理这件事情,所以CNN其实是比一般的DNN还要更简单的。

虽然CNN看起来,它的运作比较复杂,但事实上,它的模型比DNN还要更简单,我们就是用prior knowledge,

去把原来fully connected的layer里面的一些参数拿掉,就变成CNN。

CNN架构提出的基础

为什么我们有可能把一些参数拿掉?

1.Some patterns are much smaller than the whole image

在影像处理里面,如果在network的第一层hidden layer里,那些neuron要做的事情是侦测有没有一种东西、一种pattern(图案样式)出现,

那大部分的pattern其实是比整张image要小的,所以对一个neuron来说,想要侦测有没有某一个pattern出现,它其实并不需要看整张image,

只需要看这张image的一小部分,就可以决定这件事情了。

举例来说,假设现在我们有一张鸟的图片,那第一层hidden layer的某一个neuron的工作是,检测有没有鸟嘴的存在,那它其实并不需要看整张图,

因为,其实我们只要给neuron看这个小的红色杠杠里面的区域,它其实就可以知道说,这是不是一个鸟嘴,对人来说也是一样,只要看这个小的区域你就会知道说这是鸟嘴,

所以,每一个neuron其实只要连接到一个小块的区域就好,它不需要连接到整张完整的图,因此也对应着更少的参数。

2.The same patterns appear in different regions

同样的pattern,可能会出现在image的不同部分,但是它们有同样的形状、代表的是同样的含义,

因此它们也可以用同样的neuron、同样的参数,被同一个detector检测出来。

举例来说,上图中分别有一个处于左上角的鸟嘴和一个处于中央的鸟嘴,但你并不需要训练两个不同的detector去专门侦测左上角有没有鸟嘴和中央有没有鸟嘴这两件事情,

这样做太冗余了,我们要cost down(降低成本),我们并不需要有两个neuron、两组不同的参数来做duplicate(重复一样)的事情,

所以我们可以要求这些功能几乎一致的neuron共用一组参数,它们share同一组参数就可以帮助减少总参数的量。

3.Subsampling the pixels will not change the object

我们可以对一张image做subsampling(二次抽样),假如你把它奇数行、偶数列的pixel拿掉,image就可以变成原来的十分之一大小,

而且并不会影响人对这张image的理解,对你来说,下面两张大小不一的image看起来不会有什么太大的区别,你都可以识别里面有什么物件,

因此subsampling对图像辨识来说,可能是没有太大的影响的。

所以,我们可以利用subsampling这个概念把image变小,从而减少需要用到的参数量。

CNN的步骤

  • 对图像做 Convolution(卷积)
  • (可选)对图像做 Max Pooling(池化)
  • 以上两个步骤重复 N 次。(N 要提前决定好)
  • 将处理完的图像 一维展开(Flatten)
  • 丢进一个全连接神经网络进行学习

我们基于之前提到的三个对影像处理的观察,设计了CNN这样的架构,第一个是要侦测一个pattern,你不需要看整张image,

只要看image的一个小部分;第二个是同样的pattern会出现在一张图片的不同区域;第三个是我们可以对整张image做subsampling。

前面这两个property,是用convolution的layer来处理的;最后这个property,是用max pooling来处理的。

Convolution(卷积)

假设现在我们network的input是一张6*6的image,图像是黑白的,因此每个pixel只需要用一个value来表示,而在convolution layer里面,

有一堆Filter,这边的每一个Filter,其实就等同于是Fully connected layer里的一个neuron。

Property 1

每一个Filter其实就是一个matrix,这个matrix里面每一个element的值,就跟那些neuron的weight和bias一样,是network的parameter,

它们具体的值都是通过Training data学出来的,而不是人去设计的。

所以,每个Filter里面的值是什么,要做什么事情,都是自动学习出来的,上图中每一个filter是3*3的size,意味着它就是在侦测一个3*3的pattern,

当它侦测的时候,并不会去看整张image,它只看一个3*3范围内的pixel,就可以判断某一个pattern有没有出现,这就考虑了property 1。

Property 2

这个filter是从image的左上角开始,做一个slide window,每次向右挪动一定的距离,这个距离就叫做stride,由你自己设定,

每次filter停下的时候就跟image中对应的3*3的matrix做一个内积(相同位置的值相乘并累计求和),这里假设stride=1,那么我们的filter每次移动一格,

当它碰到image最右边的时候,就从下一行的最左边开始重复进行上述操作,经过一整个convolution的process,最终得到下图所示的红色的4*4 matrix。

观察上图中的Filter1,它斜对角的地方是1,1,1,所以它的工作就是detect有没有连续的从左上角到右下角的1,1,1出现在这个image里面,

检测到的结果已在上图中用蓝线标识出来,此时filter得到的卷积结果的左上和左下得到了最大的值,这就代表说,该filter所要侦测的pattern出现在image的左上角和左下角。

同一个pattern出现在image左上角的位置和左下角的位置,并不需要用到不同的filter,我们用filter1就可以侦测出来,这就考虑了property 2。

Feature Map

在一个convolution的layer里面,它会有一打filter,不一样的filter会有不一样的参数,但是这些filter做卷积的过程都是一模一样的,

你把filter2跟image做完convolution以后,你就会得到另外一个蓝色的4*4 matrix,那这个蓝色的4*4 matrix跟之前红色的4*4matrix合起来,

就叫做Feature Map(特征映射),有多少个filter,对应就有多少个映射后的image。

Colorful image(彩色图片)

刚才举的例子是黑白的image,所以你input的是一个matrix,如果今天是彩色的image会怎么样呢?我们知道彩色的image就是由RGB组成的,

所以一个彩色的image,它就是好几个matrix叠在一起,是一个立方体,如果我今天要处理彩色的image,要怎么做呢?

这个时候你的filter就不再是一个matrix了,它也会是一个立方体,如果你今天是RGB这三个颜色来表示一个pixel的话,那你的input就是3*6*6,你的filter就是3*3*3,

你的filter的高就是3,你在做convolution的时候,就是把这个filter的9个值跟这个image里面的9个值做内积,可以想象成filter的每一层都分别跟image的三层做内积,

得到的也是一个三层的output,每一个filter同时就考虑了不同颜色所代表的channel。

Convolution V.s. Fully connected(卷积与神经网络比较)

convolution这件事情,其实就是fully connected的layer把一些weight拿掉而已,上图中绿色方框标识出的feature map的output,其实就是hidden layer的neuron的output。

接下来我们来解释这件事情:

如上图所示,我们在做convolution的时候,把filter放在image的左上角,然后再去做inner product,得到一个值3;这件事情等同于,

我们现在把这个image的6*6的matrix拉直变成右边这个用于input的vector,然后,你有一个红色的neuron,这些input经过这个neuron之后,得到的output是3。

作为对比,Fully connected的neuron是必须连接到所有36个input上的,但是,我们现在只用连接9个input,因为我们知道要detect一个pattern,

不需要看整张image,看9个input pixel就够了,所以当我们这么做的时候,就用了比较少的参数。

当我们把filter做stride = 1的移动的时候,会发生什么事呢?此时我们通过filter和image matrix的内积得到另外一个output值-1,

我们假设这个-1是另外一个neuron的output,那这个neuron会连接到哪些input呢?下图中这个框起来的地方正好就对应到pixel 2,3,4,pixel 8,9,10跟pixel 14,15,16。

你会发现output为3和-1的这两个neuron,它们分别去检测在image的两个不同位置上是否存在某个pattern,因此在Fully connected layer里它们做的是两件不同的事情,

每一个neuron应该有自己独立的weight。

但是,当我们做这个convolution的时候,首先我们把每一个neuron前面连接的weight减少了,

然后我们强迫某些neuron(比如上图中output为3和-1的两个neuron),它们一定要共享一组weight,虽然这两个neuron连接到的pixel对象各不相同,

但它们用的weight都必须是一样的,等于filter里面的元素值,这件事情就叫做weight share,当我们做这件事情的时候,用的参数,又会比原来更少。

这样的network该怎么搭建,又该怎么去train呢?

1.有一些weight就永远是0,你就不去train它,它就永远是0

2.要share weight的那些算出gradient,然后让那些共享同一个weight的输入的gradient加起来,然后算平均就好了。让他们update同样值就ok了。

Max Pooling

max pooling是比较简单的,它就是做subsampling,根据filter 1,我们得到一个4*4的matrix,根据filter 2,你得到另外一个4*4的matrix,接下来,我们要做什么事呢?

我们把output四个分为一组,每一组里面通过选取平均值或最大值的方式,把原来4个value合成一个 value,

这件事情相当于在image每相邻的四块区域内都挑出一块来检测,这种subsampling的方式就可以让你的image缩小!

做完一次convolution加一次max pooling,我们就把原来6*6的image,变成了一个2*2的image;至于这个2*2的image,

它每一个pixel的深度,也就是每一个pixel用几个value来表示,就取决于你有几个filter,如果你有50个filter,就是50维,像下图中是两个filter,对应的深度就是两维。

所以,这是一个新的比较小的image,它表示的是不同区域上提取到的特征,实际上不同的filter检测的是该image同一区域上的不同特征属性,

所以每一层channel(通道)代表的是一种属性,一块区域有几种不同的属性,就有几层不同的channel,对应的就会有几个不同的filter对其进行convolution操作。

这件事情可以repeat很多次,你可以把得到的这个比较小的image,再次进行convolution和max pooling的操作,得到一个更小的image,依次类推.....

Flatten(展开)

做完convolution和max pooling之后,就是FLatten和Fully connected Feedforward network的部分。

Flatten的意思是,把左边的feature map拉直,然后把它丢进一个Fully connected Feedforward network,然后就结束了,也就是说,

我们之前通过CNN提取出了image的feature,它相较于原先一整个image的vetor,少了很大一部分内容,因此需要的参数也大幅度地减少了,

但最终,也还是要丢到一个Fully connected的network中去做最后的分类工作。

CNN in Keras

接下来就讲一下,如何用Keras来implement CNN:

如果是CNN的话,它是会考虑input image的几何空间的,所以不能直接input一个vector,而是要input一个tensor给它(tensor就是高维的vector),

这里你要给它一个三维的vector,一个image的长宽各是一维,如果它是彩色的话,RGB就是第三维,所以你要assign一个三维的matrix,这个高维的matrix就叫做tensor。

那怎么implement一个convolution的layer呢?

model2.add( Convolution2D(25,3,3, input_shape=(28,28,1)) )

参数25代表你有25个filter,参数3,3代表你的filter都是3*3的matrix,此外你还需要告诉model,你input的image的shape是什么样子的,

假设我现在要做手写数字识别,input就是28*28的image,又因为它的每一个pixel都只有单一颜色。

然后增加一层Max Pooling的layer呢?

model2.add( MaxPooling2D(2,2) )

这里参数(2,2)指的是,我们把通过convolution得到的feature map,按照2*2的方式分割成一个个区域,

每次选取最大的那个值,并将这些值组成一个新的比较小的image,作为subsampling的结果。

过程描述:

  • 假设我们input是一个1*28*28的image
  • 通过25个filter的convolution layer以后你得到的output,会有25个channel,又因为filter的size是3*3,因此如果不考虑image边缘处的处理的话,得到的channel会是26*26的,因此通过第一个convolution得到25*26*26的cubic image(这里把这张image想象成长宽为26,高为25的cubic立方体)
  • 接下来就是做Max pooling,把2*2的pixel分为一组,然后从里面选一个最大的组成新的image,大小为25*13*13(cubic长宽各被砍掉一半)
  • 再做一次convolution,假设这次选择50个filter,每个filter size是3*3的话,output的channel就变成有50个,那13*13的image,通过3*3的filter,就会变成11*11,因此通过第二个convolution得到50*11*11的image(得到一个新的长宽为11,高为50的cubic)
  • 再做一次Max Pooling,变成50*50*5

在第一个convolution里面,每一个filter都有9个参数,它就是一个3*3的matrix;但是在第二个convolution layer里面,虽然每一个filter都是3*3,

但它其实不是3*3个参数,因为它的input是一个25*13*13的cubic,这个cubic的channel有25个,所以要用同样高度的cubic filter对它进行卷积,

于是我们的filter实际上是一个25*3*3的cubic,所以这边每个filter共有225个参数。

通过两次convolution和max pooling的组合,最终的image变成了50*5*5的size,然后使用Flatten将这个image拉直(Flatten),

变成一个1250维的vector,再把它丢到一个Fully Connected Feedforward network里面,network structure就搭建完成了。

CNN的其他应用

Deep Drean的应用

给定一个图片,丢到CNN里面去,得到的output,让他正的更正,负的更负

Deep style的应用

给一张图片,CNN,得到output左面,再给一张呐喊也得到呐喊的output右面。再找一个图片,content像左面,style像右面,就会得到上图。

还有其它应用包括:语音识别,文字识别等等

Conclusion(总结)

1.CNN的架构为:Convolution,Max Pooling,Convolution,Max Pooling....Flatten,全连接层架构

2.CNN实际上就是减少参数的过程

2020李宏毅机器学习笔记-Convolution Netural Network相关推荐

  1. 2020李宏毅机器学习笔记-Generative Adversarial Network - Conditional GAN

    目录 摘要 1. Text-to-Image 1.1 Traditional supervised approach 1.2 Conditional GAN 1.3 Conditional GAN - ...

  2. 2020李宏毅机器学习笔记-Anomaly Detection

    目录 摘要 1. Problem Formulation 2. What is Anomaly? 3. Applications 4. 如何做Anomaly Detection 4.1 Binary ...

  3. 2020李宏毅机器学习笔记-More about Auto-encoder

    目录 摘要 1. More about Auto-Encoder 1.1 What is good embedding 1.2 Beyond Reconstruction:Discriminator ...

  4. 2021李宏毅机器学习笔记--22 Generative Adversarial Network 01

    @[TOC](2021李宏毅机器学习笔记–22 Generative Adversarial Network 01(GAN,生成式对抗网络)) 摘要 GAN是建立于神经网络的基础上的,其核心思想是&q ...

  5. 【李宏毅机器学习笔记】 23、循环神经网络(Recurrent Neural Network,RNN)

    [李宏毅机器学习笔记]1.回归问题(Regression) [李宏毅机器学习笔记]2.error产生自哪里? [李宏毅机器学习笔记]3.gradient descent [李宏毅机器学习笔记]4.Cl ...

  6. 2021李宏毅机器学习笔记--21 Anomaly Detection

    2021李宏毅机器学习笔记--21 Anomaly Detection(异常侦测) 摘要 一.问题描述 二.Anomaly异常 三.Anomaly Detection(异常侦测)做法 3.1 Bina ...

  7. 李宏毅svm_【李宏毅机器学习笔记】 18、支持向量机(Support Vector Machine,SVM)...

    [李宏毅机器学习笔记]1.回归问题(Regression) [李宏毅机器学习笔记]2.error产生自哪里? [李宏毅机器学习笔记]3.gradient descent [李宏毅机器学习笔记]4.Cl ...

  8. 【李宏毅机器学习笔记】 17、迁移学习(Transfer Learning)

    [李宏毅机器学习笔记]1.回归问题(Regression) [李宏毅机器学习笔记]2.error产生自哪里? [李宏毅机器学习笔记]3.gradient descent [李宏毅机器学习笔记]4.Cl ...

  9. 2021李宏毅机器学习笔记--12 attack ML models

    2021李宏毅机器学习笔记--12 attack ML models 摘要 一.图像模型的攻击 1.1原理 1.2Constraint 1.3参数训练 1.4一个例子 1.5攻击方法 1.5.1FGS ...

最新文章

  1. Vue API(directives) 自定义指令
  2. python微信集成_Python微信公众号后台开发005:集成智能聊天机器人​
  3. vue底部选择器_vue实现动态显示与隐藏底部导航的方法分析
  4. laravel 中request
  5. HMS Core 携优势亮相华为发布会,与苹果谷歌三足鼎立
  6. java布类型的常量,java数据类型;常量与变量;
  7. 实习成长之路:设计模式一:为什么你明明使用面向对象设计语言总写面向过程的程序?
  8. SVN安装语言包后无中文
  9. 将 .json 格式 转换成 .xml格式
  10. 基于计算机显卡的研究
  11. 新编计算机组装与维护标准教程,计算机组装与维护标准教程(2018-2020版)
  12. Qt2D游戏开发引擎QtGameEngine使用入门之类功能说明
  13. mysql级联是什么意思_MySql级联操作
  14. 初中英语和计算机融合的教学案例,初中英语与信息技术整合教学案例
  15. 2021-C++程序设计-实验3-继承和虚函数
  16. 推荐系统实践读书笔记-04利用用户标签数据
  17. 笔记:MySQL中的DDL、DML、DQL、约束等知识以及Navicat的安装教程
  18. Ubuntu下搜狗输入法突然无法输入中文解决方案
  19. 小王要购买一台式计算机的内存储器,计算机硬件练习及答案
  20. Google搜索中国定制版已黄了,百度再次PK的希望或落空

热门文章

  1. 【CTF WriteUp】网鼎杯 青龙组 Misc题解复现(整理,WP非原创)
  2. 编写网易邮箱登陆界面
  3. AI走向“战争技术”,是减少损伤还是推向灾难
  4. 应用计算机测定电阻伏安特性,实验计算机测定电阻伏安特性
  5. 如何1秒内快速判断一个函数的凹凸性?还看不懂我给你赔钱
  6. 全球与中国生物质颗粒市场深度研究分析报告
  7. su必备插件_建模必备逆天Sketchup插件I
  8. 杨森翔书法:立马越王台
  9. 100天精通Andriod逆向——第2天:Android基础知识和jadx的使用
  10. python3.0安卓版-python安卓版