CNN的基本结构

图中是一个图形识别的CNN模型。可以看出最左边的船的图像就是我们的输入层,计算机理解为输入若干个矩阵,这点和DNN基本相同。

接着是卷积层(Convolution Layer),这个是CNN特有的。卷积层的激活函数使用的是ReLU。我们在DNN中介绍过ReLU的激活函数,它其实很简单,就是ReLU(x)=max(0,x)。在卷积层后面是池化层(Pooling layer),这个也是CNN特有的,我们后面也会专门来讲。需要注意的是,池化层没有激活函数。

卷积层+池化层的组合可以在隐藏层出现很多次,上图中出现两次。而实际上这个次数是根据模型的需要而来的。当然我们也可以灵活使用使用卷积层+卷积层,或者卷积层+卷积层+池化层的组合,这些在构建模型的时候没有限制。但是最常见的CNN都是若干卷积层+池化层的组合,如上图中的CNN结构。

在若干卷积层+池化层后面是全连接层(Fully Connected Layer, 简称FC),全连接层其实就是我们前面讲的DNN结构,只是输出层使用了Softmax激活函数来做图像识别的分类,这点我们在DNN中也有讲述。

从上面CNN的模型描述可以看出,CNN相对于DNN,比较特殊的是卷积层和池化层,如果我们熟悉DNN,只要把卷积层和池化层的原理搞清楚了,那么搞清楚CNN就容易很多了。

CNN中的卷积层

对图像卷积其实就是对输入的图像的不同局部的矩阵和卷积核矩阵各个位置的元素相乘,然后相加得到。

举个例子如下,图中的输入是一个二维的3x4的矩阵,而卷积核是一个2x2的矩阵。这里我们假设卷积是一次移动一个像素来卷积的,那么首先我们对输入的左上角2x2局部和卷积核卷积,即各个位置的元素相乘再相加,得到的输出矩阵S的S00的元素,值为aw+bx+ey+fz。接着我们将输入的局部向右平移一个像素,现在是(b,c,f,g)四个元素构成的矩阵和卷积核来卷积,这样我们得到了输出矩阵S的S01的元素,同样的方法,我们可以得到输出矩阵S的S02,S10,S11,S12的元素。

最终我们得到卷积输出的矩阵为一个2x3的矩阵S。

上面举的例子是二维的输入,卷积的过程比较简单,那么如果输入是多维的呢?比如在前面一组卷积层+池化层的输出是3个矩阵,这3个矩阵作为输入呢,那么我们怎么去卷积呢?又比如输入的是对应RGB的彩色图像,即是三个分布对应R,G和B的矩阵呢?动态理解多维卷积:https://cs231n.github.io/assets/conv-demo/index.html

大家打开这个例子可以看到,这里面输入是3个7x7的矩阵。实际上原输入是3个5x5的矩阵。只是在原来的输入周围加上了1的padding,即将周围都填充一圈的0,变成了3个7x7的矩阵。

例子里面使用了两个卷积核,我们先关注于卷积核W0。和上面的例子相比,由于输入是3个7x7的矩阵,或者说是7x7x3的张量,则我们对应的卷积核W0也必须最后一维是3的张量,这里卷积核W0的单个子矩阵维度为3x3。那么卷积核W0实际上是一个3x3x3的张量。同时和上面的例子比,这里的步幅为2,也就是每次卷积后会移动2个像素的位置。

最终的卷积过程和上面的2维矩阵类似,上面是矩阵的卷积,即两个矩阵对应位置的元素相乘后相加。这里是张量的卷积,即两个张量的3个子矩阵卷积后,再把卷积的结果相加后再加上偏倚b。

7x7x3的张量和3x3x3的卷积核张量W0卷积的结果是一个3x3的矩阵。由于我们有两个卷积核W0和W1,因此最后卷积的结果是两个3x3的矩阵。或者说卷积的结果是一个3x3x2的张量。

仔细回味下卷积的过程,输入是7x7x3的张量,卷积核是两个3x3x3的张量。卷积步幅为2,最后得到了输出是3x3x2的张量。如果把上面的卷积过程用数学公式表达出来就是:

其中,n_in为输入矩阵的个数,或者是张量的最后一维的维数。Xk代表第k个输入矩阵。Wk代表卷积核的第k个子卷积核矩阵。s(i,j)即卷积核W对应的输出矩阵的对应位置元素的值。

对于卷积后的输出,一般会通过ReLU激活函数,将输出的张量中的小于0的位置对应的元素值都变为0。

CNN中的池化层

相比卷积层的复杂,池化层则要简单的多,所谓的池化,个人理解就是对输入张量的各个子矩阵进行压缩。假如是2x2的池化,那么就将子矩阵的每2x2个元素变成一个元素,如果是3x3的池化,那么就将子矩阵的每3x3个元素变成一个元素,这样输入矩阵的维度就变小了。要想将输入子矩阵的每nxn个元素变成一个元素,那么需要一个池化标准。常见的池化标准有2个,MAX或者是Average。即取对应区域的最大值或者平均值作为池化后的元素值。

下面这个例子采用取最大值的池化方法。同时采用的是2x2的池化,步幅为2,首先对红色2x2区域进行池化,由于此2x2区域的最大值为6.那么对应的池化输出位置的值为6,由于步幅为2,此时移动到绿色的位置去进行池化,输出的最大值为8.同样的方法,可以得到黄色区域和蓝色区域的输出值。最终,我们的输入4x4的矩阵在池化后变成了2x2的矩阵。进行了压缩。

CNN输入层前向传播到卷积层

这里我们用一个彩色的汽车样本的图像识别再从感官上回顾下CNN的结构。图中的CONV即为卷积层,POOL即为池化层,而FC即为DNN全连接层,包括了我们上面最后的用Softmax激活函数的输出层。

从上图可以看出,要理顺CNN的前向传播算法,重点是输入层的前向传播,卷积层的前向传播以及池化层的前向传播。而DNN全连接层和用Softmax激活函数的输出层的前向传播算法我们在讲DNN时已经讲到了。

CNN输入层前向传播到卷积层

输入层的前向传播是CNN前向传播算法的第一步。一般输入层对应的都是卷积层,因此我们标题是输入层前向传播到卷积层。

我们这里还是以图像识别为例。先考虑最简单的,样本都是二维的黑白图片。这样输入层X就是一个矩阵,矩阵的值等于图片的各个像素位置的值。这时和卷积层相连的卷积核W就也是矩阵。如果样本都是有RGB的彩色图片,这样输入X就是3个矩阵,即分别对应R,G和B的矩阵,或者说是一个张量。这时和卷积层相连的卷积核W就也是张量,对应的最后一维的维度为3.即每个卷积核都是3个子矩阵组成。同样的方法,对于3D的彩色图片之类的样本,我们的输入X可以是4维,5维的张量,那么对应的卷积核W也是个高维的张量。

不管维度多高,对于我们的输入,前向传播的过程可以表示为:

其中,上标代表层数,星号代表卷积,而b代表我们的偏倚, σ为激活函数,这里一般都是ReLU。

和DNN的前向传播比较一下,其实形式非常的像,只是我们这儿是张量的卷积,而不是矩阵的乘法。同时由于W是张量,那么同样的位置,W参数的个数就比DNN多很多了。

注:为了简化我们的描述,本文后面如果没有特殊说明,我们都默认输入是3维的张量,即用RBG可以表示的彩色图片。

这里需要我们自己定义的CNN模型参数是:

1) 一般我们的卷积核不止一个,比如有K个,那么我们输入层的输出,或者说第二层卷积层的对应的输入就K个。

2) 卷积核中每个子矩阵的的大小,一般我们都用子矩阵为方阵的卷积核,比如FxF的子矩阵。

3) 填充padding(以下简称P),我们卷积的时候,为了可以更好的识别边缘,一般都会在输入矩阵在周围加上若干圈的0再进行卷积,加多少圈则P为多少。

4) 步幅stride(以下简称S),即在卷积过程中每次移动的像素距离大小。

CNN隐藏层前向传播到卷积层

现在我们再来看普通隐藏层前向传播到卷积层时的前向传播算法。

假设隐藏层的输出是M个矩阵对应的三维张量,则输出到卷积层的卷积核也是M个子矩阵对应的三维张量。这时表达式和输入层的很像,也是

其中,上标代表层数,星号代表卷积,而b代表我们的偏倚, σ为激活函数,这里一般都是ReLU。

也可以写成M个子矩阵卷积后对应位置相加的形式,即:

和上一节唯一的区别仅仅在于,这里的输入是隐藏层来的,而不是我们输入的原始图片样本形成的矩阵。

需要我们定义的CNN模型参数也和上一节一样,这里我们需要定义卷积核的个数K,卷积核子矩阵的维度F,填充大小P以及步幅S。

CNN隐藏层前向传播到池化层

池化层的处理逻辑是比较简单的,我们的目的就是对输入的矩阵进行缩小概括。比如输入的若干矩阵是NxN维的,而我们的池化大小是kxk的区域,则输出的矩阵都是N/k×N/k维的。

这里需要需要我们定义的CNN模型参数是:

1)池化区域的大小k

2)池化的标准,一般是MAX或者Average。

CNN隐藏层前向传播到全连接层

由于全连接层就是普通的DNN模型结构,因此我们可以直接使用DNN的前向传播算法逻辑,即:

这里的激活函数一般是sigmoid或者tanh。

经过了若干全连接层之后,最后的一层为Softmax输出层。此时输出层和普通的全连接层唯一的区别是,激活函数是softmax函数。

这里需要需要我们定义的CNN模型参数是:

1)全连接层的激活函数

2)全连接层各层神经元的个数

CNN前向传播算法小结

输入:1个图片样本,CNN模型的层数L和所有隐藏层的类型,对于卷积层,要定义卷积核的大小K,卷积核子矩阵的维度F,填充大小P,步幅S。对于池化层,要定义池化区域大小k和池化标准(MAX或Average),对于全连接层,要定义全连接层的激活函数(输出层除外)和各层的神经元个数。

输出:CNN模型的输出aL

  1. 根据输入层的填充大小P,填充原始图片的边缘,得到输入张量a1。

2)初始化所有隐藏层的参数W,b

3)for l=2 to L−1:

​ a) 如果第l层是卷积层,则输出为:

​ b) 如果第ll层是池化层,则输出为:
,这里的pool指按照池化区域大小k和池化标准将输入张量缩小的过程。

​ c) 如果第ll层是全连接层,则输出为:

4)对于输出层第L层:

回顾DNN的反向传播算法

在DNN中,我们是首先计算出输出层的δL:

利用数学归纳法,用δL+1的值一步步的向前求出第l层的δL,表达式为:

有了δL的表达式,从而求出W,b的梯度表达式:

有了W,b梯度表达式,就可以用梯度下降法来优化W,b求出最终的所有W,b的值。

CNN的反向传播算法思想

要套用DNN的反向传播算法到CNN,有几个问题需要解决:

1)池化层没有激活函数,这个问题倒比较好解决,我们可以令池化层的激活函数为σ(z)=z,即激活后就是自己本身。这样池化层激活函数的导数为1.

2)池化层在前向传播的时候,对输入进行了压缩,那么我们现在需要向前反向推导δl−1,这个推导方法和DNN完全不同。

  1. 卷积层是通过张量卷积,或者说若干个矩阵卷积求和而得的当前层的输出,这和DNN很不相同,DNN的全连接层是直接进行矩阵乘法得到当前层的输出。这样在卷积层反向传播的时候,上一层的δl−1递推计算方法肯定有所不同。

4)对于卷积层,由于W使用的运算是卷积,那么从δl推导出该层的所有卷积核的W,b的方式也不同。

从上面可以看出,问题1比较好解决,但是问题2,3,4就需要好好的动一番脑筋了,而问题2,3,4也是解决CNN反向传播算法的关键所在。另外大家要注意到的是,DNN中的al,zl都只是一个向量,而我们CNN中的al,zl都是一个张量,这个张量是三维的,即由若干个输入的子矩阵组成。

CNN(Convolutional Neural Network)相关推荐

  1. 卷积神经网络CNN(Convolutional Neural Network)

    卷积神经网络CNN(Convolutional Neural Network) 一.CNN与NN的区别 卷积神经网络与传统神经网络的区别: 二.CNN的整体架构 1.输入层:2.卷积层:3.池化层:4 ...

  2. 动图+独家思维导图!让你秒懂李宏毅2020深度学习(四)—— CNN(Convolutional Neural network)

    动图+独家思维导图!让你秒懂李宏毅2020深度学习(四)-- CNN(Convolutional Neural network) 系列文章传送门: 文章目录 动图+独家思维导图!让你秒懂李宏毅2020 ...

  3. 卷积神经网络CNN(Convolutional Neural Network)原理与代码实现 Le-Net5

    图像识别经典数据集: 图像识别是人工智能的一个重要的领域.其他常用的图像识别数据集: CIFAR:  http://www.cs.toronto.edu/~kriz/cifar.html CIFAR数 ...

  4. 卷积神经网络(CNN:Convolutional Neural Network)

    1.感知器(perceptron) 感知器是卷积神经网络的基本单元,下图展示了其工作原理,为了方便理解,图中只显示了3个输入. 向量w为输入向量x的权重,b为偏差,最后对x的线性组合()的值进行判断, ...

  5. 从CNN视角看在自然语言处理上的应用 原创 2017年10月24日 00:00:00 1339 作者 | 卞书青 卷积神经网络(Convolutional Neural Network)最早是应用在

    从CNN视角看在自然语言处理上的应用 原创 2017年10月24日 00:00:00 标签: 1339

  6. 卷积神经网络(Convolutional Neural Network,CNN)

    卷积神经网络(Convolutional Neural Network,CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现. 它包括卷积层(con ...

  7. 【机器学习】竞争神经网络(Competitive Neural Network)的python实现

    [机器学习]竞争神经网络(Competitive Neural Network)的python实现 一.竞争神经网络原理 1.1.生物学原理 1.2.网络结构与模型训练 二.竞争神经网络的python ...

  8. 第四门课 卷积神经网络(Convolutional Neural Networks)

    第四门课 卷积神经网络(Convolutional Neural Networks) 第一周 卷积神经网络(Foundations of Convolutional Neural Networks) ...

  9. 吴恩达深度学习笔记——卷积神经网络(Convolutional Neural Networks)

    深度学习笔记导航 前言 传送门 卷积神经网络(Convolutional Neural Networks) 卷积神经网络基础(Foundations of Convolutional Neural N ...

最新文章

  1. mysql的最佳索引攻略
  2. es6中新增对象的特性和方法
  3. 从零开始来看一下Java泛型的设计
  4. 软件测试技术——系统测试
  5. 专业英语笔记:Install and Use Python
  6. idea打开linux命令行,在IDEA中使用Linux命令的操作方法
  7. scala集合基本介绍
  8. 工科生快速翻译英文文献的两个软件
  9. PTA程序设计类实验辅助教学平台-基础编程题--JAVA--7.4 BCD解密
  10. 12306中前端验证身份证件(及其他证件号)的方法
  11. WS小世界网络模型构造算法
  12. H3C 路由器设置基本配置
  13. python中np是什么意思_了解python中np是做什么的
  14. 194.Vue.js智能扫码点餐系统(二十八)【支付宝支付流程、Nodejs支付源码解析、 实现支付功能(支付宝支付)】2019.04.01
  15. 关于Chandrashekhar阿扎德概述
  16. qq农场 源码java_HappyFarm 仿QQ农场游戏源代码 - 下载 - 搜珍网
  17. 深度学习入门笔记(十七):深度学习的极限在哪?
  18. 新新新~Revit插件【建模助手】7大模块介绍
  19. 微信小程序糟心开发过程
  20. Url被多次转义 URLDecoder.decode(url,“UTF-8“)

热门文章

  1. 【Delphi学习】Form的borderstyle属性
  2. 机器学习笔记(3)——使用聚类分析算法对文本分类(分类数k未知)
  3. Nginx基于IP的访问控制
  4. 四、软件体系结构描述
  5. 支持向量机识别数字集(数据采集+模型训练+预测输出)
  6. AWD平台搭建与使用入门
  7. Mysql的下载、安装
  8. 从零开始Android游戏编程(第二版) 目录
  9. 【正点原子FPGA连载】第六章Petalinux设计流程实战摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南
  10. LattePanda 外壳 HOTe-LPA 铝合金外壳