第五节 Convolutional Neural Network (CNN)

1. image classification 图像分类

首先假设输入模型的所有图片的大小都是固定的。如果图像不一样就线rescale成一样的再放进去。

因为是分类,所以每一个目标label y^\bm{\hat y}y^​ 都以one-hot向量的形式表示。这个向量的长度就表示了总共有多少个类。

对于一个RGB图像,是一个三维的tensor,一个维度代表长,一个维度代表宽,一个维度代表channel(通道),channel就是RGB三个颜色。

先把这个三维的tensor拉直成一个向量。然后放进network中。(课程到目前为止所讲的network的输入都是一个向量,所以只要把图片看作一个向量,就可以把他当作是network的输入。)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L6IwLdSf-1648377128963)(./imgs/CNN1.png)]

假如每个图片的尺寸是100100,那么输入的向量就有100100*3维的长度。在采用fully connected network(全连接神经网络)的情况下:如果第一层layer中有1000个神经元的话,那总共会有3∗1073*10^73∗107个weight。随着参数的增加,虽然模型弹性增加,但是也增加了over fitting的风险。

Simplifiction 1 - receptive field RF

所以,为了避免参数过多,要减少每个neural所观察的范围,就是让他们少和输入向量相连接一点。

如下图,具体的做法是,设一个receptive field(感受野),每个neural只关注自己的receptive field即可。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PbhDzBBH-1648377128965)(./imgs/receptive%20field.png)]

receptive fiel彼此之间,可以重叠可以交叉,甚至可以两个不同的neural有同一个receptive field,不同的receptive field也可以大小不同,receptive field也不必观察所有的channel,可以只观察一个,也可以观察全部(虽然不常见),receptive field也可以不必非得是正方形。对于一个neural来说receptive field内部也不一定相连。

最经典的receptive field安排方式是:看所有的channel,所以在此基础上描述这个receptive field就只用说他的高和宽即可eg:kernel size:3∗33*33∗3。一般kernel size不会设太大(一般3*3都够用)。一般同一个receptive field会有一组neural来守备这个范围。下一个receptive field则是在上一个的基础上移动一个stride(比如两个像素点stride=2)得到一个新的receptive field。这个stride也是一个hyper parameter,人为决定大小。(一般设stride 1或2就足够,因为希望receptive field之间有overlap重叠,因为不重叠的话有的pattern有可能正好出现在两个receptive field的交界处,不重叠的话则没有neural可以识别他们。)

当在同一行内不断向右移的时候,有可能右移后超出图片范围,但是不能因为超出了范围就舍弃这个receptive field,因为它还包括了没有识别的部分,所以对待超出了范围的位置就做padding补零、或者补全图的平均值或者边上是什么就补一个一样的都可以。

向下stride同理。使图片中的每一个位置都被receptive field覆盖。

此外,对于不同的图片,同样的pattern可能出现在不同的位置。但是这并不会构成问题,当这个pattern出现在不同的位置后,该receptive field所守备的神经元会来识别这个pattern。

但是需要在不同的receptive都放对应识别所有pattern的数量的neural吗,这样不会导致参数太多吗?

为了解决这个问题,提出的方法是,让不同的receptive field的neural之间parameter sharing共享参数。

所谓共享参数就是两个neural神经元的weight是一样的。在这里就是需要让两个守备不同receptive field的neural的参数是一模一样的。但是因为输入不一样(不同的receptive field)即使参数一样,输出也不会一样,所以没必要让两个观察同一个receptive field的neural来parameter sharing。

Simplifiction 2 - Typical Setting

常见的在影像辨识的方法:

每一个receptive field都有一组neural(eg:64)。

然后让每一个receptive field(RF)都是同用一组参数。

举例:
第一个receptive field的的1个neural与第二个receptive field的neural第1个neural参数相同,
第一个receptive field的的2个neural与第二个receptive field的neural第2个neural参数相同,
第一个receptive field的的3个neural与第二个receptive field的neural第3个neural参数相同,

这些每个神经元的参数有一个名字:filter!

所以综上来看,filter的用途就是,每一个filter用来识别一个pattern,每一个receptive field都要有全部的filter。

Convolutional Layer卷积层的好处

首先上面的处理就是建立一个卷积层的过程:

receptive field + parameter sharing = convolutional layer

这样做的好处有:

  1. 有的pattern可能远小于整个图片的尺寸(receptive field解决了这个问题)
  2. 相同的pattern可能出现在不同的位置(filter也就是parameter sharing解决了这个问题)

可以看出CNN的model bias比较大(因为CNN不是全连接网络,参数更少,能表示的函数更少)。但这并不一定是坏事,当model bias小,会容易出现over fitting的情况。

fully connected layer convolutional layer
参数更多,model bias更小 参数更少,model bias更大
可以做的事多,但是效果都不会最好 专门为影像设计,model bias大但是正好适合影像,但是应用到别的领域效果会变差

Convolutional Layer

从另一个角度理解CNN

所谓convolutional layer,就是其中有很多的名字叫filter的tensor。例如每个filter的尺寸是3∗3∗channels(频道数)3*3*channels(频道数)3∗3∗channels(频道数),总共有64个filter即64个pattern。每个filter的作用就是去图片中识别一个pattern。每个filter里的数值就是用gradient descent来更新的parameter。

训练之后,filter的用法就是将这个filter从图片的一端开始,对应位置做inner product内积(两个矩阵A、B对应分量乘积之和,结果为一个标量,(与向量的内积/点积/数量积的定义相似)。 所以A、B的行数列数都应相同,且有结论=tr(A^T* B)。)

计算完一个之后,根据stride的大小移动对应的位数(即切换到下一个receptive field),先横着走,到图片尽头后再向下stride位从重复上述过程。

如此便可得到一个全是上述计算的内积的一组数字(因为假设的输入是黑白照片,只有一个通道,所以每个filter扫出来的是矩阵,且他的长宽和原图不一样大,会更小一点,因为啥呢自己画两个大小不一样的方框绕一圈就看出来了)。通过观察这个矩阵,哪里大,就说明对应图片的哪里有这个filter想要找的pattern。

然后对每一个filter做同样的处理。

这样就得到了filter数量的一堆成组(矩阵)的数字将其称之为:feature map(是一个tensor,每个filter计算的矩阵的长宽和filter数量是这个tensor的三维)!

可以将这个feature map看成一个新的图片,但是这个图片的channel数量是filter的数量,按照上面举例则是64个。他就是这个卷积层的输出。

可以在卷积层后再加卷积层,这样上面得到的feature map就是这下一个卷积层的输入图片。

第二层的convolution layer也有许多filter,假设这些filter的长宽仍然是3∗33*33∗3,但是他们的大小是3∗3∗643*3*643∗3∗64,因为输入的图片有64个channel(通道)。

filter的高度,即channels的数值与输入图片的channels保持相同。所以每个filter扫出来的那一组数字不再是矩阵,而是一个tensor张量,他的厚度或者高度或者channel就是输入图片的channels,64。

有一种担心,如果每层的filter长宽都是3∗33*33∗3会不会无法看到一些尺寸比较大的pattern呢?并不会,如下图所示:

个人理解: 首先如果是一个更大的pattern的话,这个pattern内的每一片区域也应该是极为相似的。对着这片区域用filter过滤一遍后的结果也会是相同或者非常相似的。也就是说通过第一轮的convolutional layer,即使filter较小,也会保留更大的pattern的特征。

在这样的情况下,下一层的filter所看到的是仍保留了原图的pattern特征的feature map。并且该filter他对应的每个元素还原回原图的话拼接起来就是一个更大的图片。如此就观察了更大的pattern。

也就是说可以通过增加卷积层数来观察更大的pattern。

上图便是表明这件事情。

想要得到这一层convolutional layer的输出feature map,就要和上一个卷积层一样将每个feature的算出来的张量在channel也就是高度上叠加在一起。

比较两个理解CNN的角度

前者 后者
receptive field。weight也有bias filter的参数(也有bias)
parameter sharing filter扫描全图。即卷积convolution

视角3 pooling 池化

把一张比较大的图片做subsampling降采样,变小。

1. Pooling-Max Pooling

pooling本身没有参数,里面没有weight。不需要learn。比较像activation function。

以Max-Pooling为例,按照之前的做法,每一个filter对图片扫描一遍都会获得一组数字。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3cYud9bA-1648377128968)(imgs/Max%20Pooling.png)]

pooling就是把这些数字几个几个分成一组,上图就是2∗22*22∗2一组,每一组里选一个代表,在max-pooling中就是选最大的那一个。min pooling就是最小的那个。mean就是取平均。

所以昨晚convolution之后,往往后面还会跟着一个pooling。pooling做的事情就是把图片变小。,但是保持原channel不变。

实践中往往convolution与pooling交替使用。比如做几次convolution后做一次pooling这样的。

但是pooling对与模型的表现会带来负面效果,比如比较细节的pattern会被pooling给抹除。所以最近时期的CNN都已经在减少pooling的使用,使用full convolution。

pooling最主要的目的就是减少运算量,但是随着电脑算力的增加往往就不做pooling了。

在一个最普通的CNN中如何得到结果呢?

在最后的pooling(或者没有pooling的convolutional layer)之后,进行flatten,即把上一层输出的矩阵或者张量tensor的东西拉直成一个向量,再把这个向量输入道一个fully connected layer中,可能还要再进行softmax。然后最终得到影像辨识的结果。这就是经典的流程。

CNN Application: Playing GO

除了影像辨识,CNN的另一个常见用处就是下围棋。

下围棋本质就是一个分类的问题。输入是棋盘上黑子和白子的位置。输出就是下一步落子的位置。

但是对于一个network来说,输入的要求是一个向量。棋盘是有19∗1919*1919∗19个位置。所以可以把这个棋盘表示成一个19∗1919*1919∗19的向量。在向量中,黑子可以表示为1,白子可以表示为-1,没有子可以为0(也可以选择别的数字表示)。这样输入神经网络就可以明确棋盘的样子。

这个问题可以用fully connected network解决,但是用CNN的效率会更高。

因为首先,可以将棋盘视作一个分辨率19∗1919*1919∗19的图片,每一个像素就是一个可以落子的位置,按照alpha GO的论文,这个图片的channel(通道)有48个,也就是说要用48个数字来描述一个位置的信息(比如这个位置是不是要被吃掉、旁边有没有不一样颜色的子之类的)。

为什么用CNN下围棋更好呢?

  1. 满足一些pattern比整个图片的尺寸小很多
  2. 满足一些pattern在会出现在不同的位置region。
  3. 没有pooling,因为围棋比较精细,pooling会损失细节。

近年来CNN也可以用于语音识别、文字处理等。但是他们的receptive field的设计就和在图片处理上不再相同。

但是CNN也有一些弱点,比如本来识别是狗的图片,放大或者旋转后,就不能识别出来了。所以事实上CNN并不能处理图片的放大缩小,或者旋转之类的问题。所以在CNN训练之前都要对数据进行data augmentation(数据加强)来对数据进行放大、旋转等处理。有一种网络可以处理:special transformer layer。

为什么用了validation set,还是会overfitting

首先复习什么是validation set以及他的作用。

对于不同的模型,在训练集上选出每个模型最好的function。

然后将每个模型的选出的最好的function在监督集validation set上计算loss。选择其中最小的。

其中在validation set上做出选择也可以看作是一个训练过程。将上述得到的每个最好的方程也都放到一个集合中,在这个集合里寻找最好的方程。

所以即使有监督集也会出现过拟合的原因有可能是,待选择的模型太多了,也有可能是监督集的数据集太小了。

第五节 Convolutional Neural Network (CNN)相关推荐

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

    卷积神经网络(Convolutional Neural Network, CNN) 目录 卷积神经网络(Convolutional Neural Network, CNN) 概述: 结构: 卷积层:

  2. 【翻译论文】An Architecture Combining Convolutional Neural Network (CNN) and Support Vector Machine (SVM)

    [翻译论文]An Architecture Combining Convolutional Neural Network (CNN) and Support Vector Machine (SVM) ...

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

    卷积神经网络 转载请注明:http://blog.csdn.net/stdcoutzyx/article/details/41596663 自今年七月份以来,一直在实验室负责卷积神经网络(Convol ...

  4. 机器学习 卷积神经网络 Convolutional Neural Network(CNN)

    Convolutional Neural Network(CNN)- 卷积神经网络 CNN专用在影像上的神经网络,目的是作影像辨识.影像分类,即通过输入的影像,输出影像中的内容. 对于CNN,有两种解 ...

  5. 2021李宏毅 机器学习 Convolutional Neural Network (CNN)

    应用1:影像辨识 一张图片是一个三维的Tensor,一维是长,一维是宽,一维是channel (channel=3代表RGB的三种颜色,长和宽代表解析度,像素的数目) 模型的弹性越大,越容易过拟合. ...

  6. Paper翻译:《A Novel Convolutional Neural Network Based Model for Recognition and Classification of App》

    论文名称:<A Novel Convolutional Neural Network Based Model for Recognition and Classification of Appl ...

  7. 笔记:PoseCNN:A Convolutional Neural Network for 6D Object Pose Estimation in Cluttered Scenes

    PoseCNN: A Convolutional Neural Network for 6D Object Pose Estimation in Cluttered Scenes (Robotics: ...

  8. [Paper]Application of deep convolutional neural network for automated detection of myocardial...

    *侵删 *限于博主英语水平,若翻译不当之处恳请批评指正~3Q Application of deep convolutional neural network for automated detect ...

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

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

最新文章

  1. Exchange 2013 OWA搜索邮件失败问题处理
  2. 目录忽略_宣传册设计中目录的构思方法和运用
  3. 【一篇文章搞懂】dockerfile构建镜像的命令
  4. 告别.NET生成报表统计图的烦恼 (转)
  5. linux-文件目录类
  6. tkinter 菜单添加事件_Python+tkinter设置Label字体、字号、样式、对齐方式、鼠标形状、响应鼠标事件...
  7. 每天一小时python官方文档学习(七)————模块与包
  8. Django与Ajax
  9. pep3评估报告解读_quot;聚焦慢病、助力医改,检验项目风险评估培训计划“大兴区第四期培训班成功举办...
  10. 百度安全DDoS攻击年度报告出炉 企业防护有新招!
  11. PHP 操作ini文件,读取及写入操作(代码)
  12. 基于SSM毕业生就业管理系统
  13. 套接字sockets
  14. unity-动画 Animation read-only 问题
  15. 计算机二级虎贲跟未来教育那个好,考计算机二级的都看看,分享几款模拟软件...
  16. 移动端浏览器隐私模式/无痕模式使用本地存储localStorage/sessionStorage的问题
  17. 小波模极大值用于图像融合
  18. 职业规划以兴趣为导向,而不是盲目跟风
  19. linux之U盘安装
  20. TFN OTDR光时域反射仪F1/F1K 手持式高精度光纤光缆断点检测仪

热门文章

  1. 大学计算机试卷分析报告,大学试卷分析报告范文
  2. 通达信交易接口怎么实现策略选股?
  3. 已解决OSError: [Errno 22] Invalid argument
  4. c++如何完成二进制和十进制的互相转换
  5. Android launcher2 应用列表背景透明/透明壁纸
  6. 计算机毕业设计看这篇就够了(一)毕设目的
  7. vue高德地图学习 直接看最后推荐
  8. H3C NE考试复习GB0-190
  9. gitbook打包镜像
  10. 使用预训练模型直接进行图片识别