深度学习修炼(七)——卷积神经网络

文章目录

  • 7 卷积神经网络
    • 7.1 卷积网络和传统网络的区别
    • 7.2 卷积
      • 7.2.1 卷积过程画大饼
      • 7.2.2 图像的不变性
      • 7.2.3 互相关运算*(补充)
      • 7.2.4 图像颜色通道*(补充)
      • 7.2.5 步幅
      • 7.2.6 多次卷积
      • 7.2.7 边缘填充
      • 7.2.8 特征图的大小
      • 7.2.9 卷积参数共享
    • 7.3 池化
    • 7.4 整体网络架构
    • 7.5 后话

7 卷积神经网络

如果你现在有一张图片,其只是一个二值图或是灰度图,那么它的通道数是1,也就是说,每一张图实际上都是一个矩阵(二维张量);但是遇见彩色的RGB三通道图你怎么处理呢?当我们仅仅通过将图像数据展成一维向量而忽略了每个图像的空间结构信息,将数据送入一个全连接的多层感知机中。因为这些网络特征元素的顺序是不变的,因此最优的结果是利用先验知识,即利用相近像素之间的相互关联性,从 图像数据中学习得到有效地模型。

本章介绍的卷积神经网络是一类强大的、为处理图像数据而设计的神经网络。基于卷积神经网络架构的模型在计算机视觉(compute vision)领域中已经占主导地位,当今几乎所有的图像识别、目标检测或语义分割相关的学术竞赛和商业应用都以这种方法为基础。

如检测任务:

image-20220402132216872

如分类和检索任务:

image-20220402132237148

超分辨率重构:

image-20220402132440592

医学任务等:

image-20220402132528862

无人驾驶:

image-20220402132547571

人脸识别:

image-20220402132714763

卷积神经网络需要的参数少于我们前面学的那种全连接架构的网络例如多层感知机那样的,而且卷积也很容易用GPU并行运算。因此卷积神经网络除了能够高效地采样从而获得精确的模型,还能够高效地计算。所以不管是语音识别还是自然语言处理还是图像识别,从事相关工作人员都喜欢用CNN去处理。

在本讲中,我们将介绍构成所有卷积网络包含的基本元素。这包括卷积层本身、填充(padding)步幅(stride)的基本细节,还有用于在相邻区域集聚信息的汇聚层(pooling),在每一层中多通道(channel)的使用,以及有关现代卷积网络架构的仔细讨论。

7.1 卷积网络和传统网络的区别

以下是传统网络和卷积神经网络的对比。

image-20220402132824024

相比于传统的神经网络,卷积神经网络的输入不再是一维的张量,而是三维张量。

让我们来看看卷积神经网络的整体架构:

image-20220402133128541

在前面openCV的学习中,我们学过高斯滤波器。实际上,高斯滤波器可以看做是一个卷积核。卷积层一般由卷积核提取图像特征,经由卷积核提取后的图像数据称为卷积层;有时提取特征后的卷积层图像数据可能过于庞大,需要做压缩,此时就会用一个汇聚窗口去扫描卷积层的图像,使之输出称为池化层(汇聚层);当以上的图片处理过程结束后,后面再跟上一个多层感知机,就能够很好地处理图像数据。

7.2 卷积

7.2.1 卷积过程画大饼

我们来通过下面的图来看看卷积神经网络中的卷积干了一件什么事。

image-20220402134540825

让我们回忆一下在之前openCV的学习中,我们曾经用Sobel算子和原图像进行互相关运算,使不同的区域边缘特征增强,从而获得边缘检测的效果。

那么如果我们要在卷积神经网络网络中我们如何进行特征提取?我们姑且谈论灰度图或二值图,因为通道数为1。我们首先是将一张图像分为若干个区域,每个区域的大小和扫描的卷积核大小一样大。假设我们用一个3×3的卷积核去扫描原图像,那么在这个卷积核上带有一组权重参数,它能够和原图像中的某一块区域像素值x进行互相关计算,使得计算出一个值y,这个值让我们姑且称呼它为特征对应的评分吧。

如果你还指定了偏置b,那么上述过程实际上符合前面的线性模型:y = wx+b。对于图像中每一个像素点,我们都把他当做特征,与卷积核上的权重参数w做内积(互相关运算),所得结果加上偏置b后则称为我们的输出值y,对于卷积层,无非就是按位置排列好的关于y的多维矩阵。

7.2.2 图像的不变性

让我们思考上述卷积过程的一些细节。

如果是你自己,抛开这个学科不讲,就你自己,你如果想在一张图片中找到某个物体,拿到一张图片,我们可以知道的绝对是:物体和所在位置无关。比如说猪会飞,飞机会下海,哥斯拉会出现在你家门口,这些实际上在图片中是不奇怪的。

让我们看一下下面的图:

image-20220102163506663

如果给你这张图,要你在里面找一个人,你能找到吗?你要怎么找?按照卷积的过程,如果你想找到这个人,你可以把这种图片切割成n份,然后给每份的区域打个分(表示这个人可能在这部分被切割区域的可能性)。

对此,我们说卷积过程是保持两个特性的:

  1. 平移不变性:不管检测对象出现在图片的哪个位置,神经网络的前面几层应该对相同的图像区域反应都一样,你不能说猪就不能上天了是吧。
  2. 局部性:神经网络的前面几层应该只探索输出图像的局部区域(也就是图片被分割的那一小块),而不是过度去在意图像中相隔较远区域的关系。也就是说,我们如果是想找到一个人,那么我们只需要在分割的区域中找到人就行,而不是直接在图像的整体找到人。

7.2.3 互相关运算*(补充)

严格来说,卷积层是个错误的叫法,因为它所表达的运算其实是互相关运算,而不是卷积运算,在卷积层中,输入张量卷积核张量通过互相关运算产生输出张量

首先我们暂且忽略通道这一要素,看看如何处理二维图像数据和隐藏表示。假如现在输入是高度为3,、宽度为3的二维张量。卷积核高度和宽度都是2,而卷积核的输出结果由内核的高度和宽度决定。如下图所示:

image-20220105130429041

上图说明了,卷积层上的19是根据卷积核去扫描输入图像然后做计算得出的结果。

根据上面的原理,我们可以知道,输出大小等于输入nh×nwn_h×n_wnh×nw减去卷积核大小kh×kwk_h×k_wkh×kw,(注:h为height长度,w为weight宽度)即:

(nh−kh+1)×(nw−kw+1)(n_h-k_h+1)×(n_w-k_w+1)(nhkh+1)×(nwkw+1)

这是因为我们需要足够的空间在图像上“移动”卷积核。稍后,我们将看到如何通过在图像边界周围填充零(零填充)来保证有足够的空间移动内核,从而保持输出大小不变。

7.2.4 图像颜色通道*(补充)

这一部分实际上在openCV的学习中应该就很明了了,如果你不是很清楚,可以看一下下面。

对于一张彩色图片来说,通常是由三色通道叠加而成,如下所示:

image-20220402135624972

由此可见,图片不是一个二维张量,而是一个由高度、宽度和颜色组成的三维张量。

比如一张包含1024×1024×3个像素。那么实际上就是表示这个图片的长和宽都是1024个像素点,且有三个通道。

比如这张图片的RGB值是(0,255,0),则表明这张图片的R(红色)和B(蓝色)最暗,而G(绿色)最亮。也就是说,在RGB的值中,值越大,说明对应的通道颜色越亮。

那在卷积中是怎么处理多通道的图片的?同样地,它也是用一个多层卷积核去扫描原图像,由于图像是多通道,所以用同一个卷积核的不同层对每一层通道的同一个位置扫描得出的结果进行相加。如图所示:

image-20220402140818306

上面可能有点晦涩难懂,让我们看一下全局过程。

image-20220402141649621

对于Output Volume中的3是怎么来的?原图像有三层,所以我们也要选择一个三层的卷积核。在上述的过程中,我们选定用3×3×3的卷积核FilterW0Filter W_0FilterW0去扫描图像,卷积核的第一层扫描图像第一层的第一块区域时,卷积核上的权重参数和图像中的像素做互相关运算,所得结果为-1+1 = 0,卷积核的第二层扫描图像第二层的第一块区域时,所得结果为2;同理第三层所的结果为0。又因为我们的线性模型是wx+b,我们又指定了b的初始化值为1,则对于y即卷积层为该为0+2+0+1 = 3。

那上面怎么还有一个FilterW1FilterW_1FilterW1?而且Output Volume有两层?这是因为有时候卷积层可以不止一层。

我们在平时谈论的时候,相对于提取特征来说,我们把输出的结果叫做特征图;而当相对于卷积核时,我们把输出的结果叫做卷积层

特征图可以有多个,当我们用多个相同大小的卷积核去扫描图像时,就可以得到更多的特征图。如下所示:

image-20220402150653214

以上这些特征图堆叠而成了卷积层。

7.2.5 步幅

卷积核移动的步幅决定了输出的特征图的大小。

image-20220402152245681

一般来说,我们默认滑动卷积核都是一步。但是有时候为了高效计算或是缩减采样次数,卷积核可以每次滑动多个元素。

image-20220402141649621

还是拿以上的这幅图来说,为什么我们输出的Output Volume才3×3,正是因为每次卷积核滑动的步幅为2。

7.2.6 多次卷积

以上的步骤中,我们都是对原图像做了一次卷积。那么对原图像仅仅只做一次卷积就够用了吗?

image-20220402151811442

在CNN中,对输入进来的图像仅仅只做一次卷积是不够的。在第一次卷积后得出的特征图中,我们需要在这张特征图再一次进行卷积操作,多次提取特征。

image-20220402152149120

当然,卷积次数不是说越多越好,到了某个程度就停了。在后面的小节中我们再去讨论这个问题。

7.2.7 边缘填充

如果进行多次卷积的话,很容易丢失边缘像素。还是这幅图:

image-20220402141649621

对于以上这幅图,我们在原图像的外围实际上进行了零填充,即最外圈填充了一圈零。而对于最外圈的像素点来说,它能够被卷积核扫描到的次数只有一次。也就是说,图片最外圈的特征可能在逐次的卷积中慢慢的卷没了;而对于图片较内区域的像素点,它可以被卷积核多次扫过,特征保留较完整。

image-20220105175842567

假设图像的大小为nxn,过滤器是fxf,那么卷积运算的结果为(n-f+1)x(n-f+1)。

  • 卷积运算后图像会缩小,经过若干次卷积运算图像和图像的特征可能会缩小
  • 卷积运算中覆盖边缘和角落的像素点比中间像素点少,导致丢失图像边缘信息

为了解决这一问题,引入填充Padding。

填充在一般来说都是在边缘填充0,我们也叫零填充。当然,也可以不是0。当我们在最外圈填充了数值之后,拿零举例,填充后的图片如下所示:

image-20220402153620689

这样的话,对于原图片边缘的特征像素点,能够被卷积核扫描的次数就变多了。

当然,零填充也有好处。如果你不是用0而是用1去填充,那么很可能在做互相关运算时,输出的结果会影响到特征图,而是如果你用0,互相关的结果仍然是0,不会过度影响最终结果。

当然,填充也可以不止填充一圈,也可以填充多圈,看需求而定。

7.2.8 特征图的大小

特征图的大小是有计算公式的:

  • 长度:H2=H1−FH+2PS+1H2 = \frac{H_1-F_H+2P}{S}+1H2=SH1FH+2P+1
  • 宽度:W2=W1−FW+2PS+1W2 = \frac{W_1-F_W+2P}{S}+1W2=SW1FW+2P+1

其中W1、H1W_1、H_1W1H1表示输入的宽度、长度;W2、H2W_2、H_2W2H2表示输出特征图的宽度、、长度;F表示卷积核长和宽的大小,S表示滑动窗口的步长,P表示边界填充(加了几圈)。

7.2.9 卷积参数共享

有时候我们可能会有些疑问,对于一张图片不同的区域,我们不用不同的卷积核去扫呢?

如果采用不同的卷积核,就意味着卷积核中的权重参数不一样,也就意味着w要变多。记得我们前面提到的过拟合吗?导致过拟合的原因之一就是参数过多。所以为了防止过拟合,也为了高效计算,我们采用同一个卷积核扫遍整张图片。

对于32×32×3的图像,如果用10个5×5×3的卷积核来卷积,那么所需的参数为750个,而且这还不算上b,如果每个卷积核都有一个对应的偏置参数,最终需要750+10 = 760个参数。

记得我们前面还讲过全连接开销非常大吗?如果不用卷积参数共享来做卷积,那么使用全连接的话,就是32×32×3 = 3072个参数,恐怖如斯,开销巨大,这也是为什么在多层感知机中我们采用暂退法通过减少结点来减少参数的缘故。

7.3 池化

如果一张图片的像素点非常多,在做完一次卷积后仍然保留有非常多的像素点(特征),那么使用池化(汇聚)就能够压缩图片的特征。

image-20220402160252871

图片的特征压缩不是随便说丢就丢了,需按照一定的规律。按照不同的规律进行池化,我们可以把池化分为两类。

与卷积核类似,池化也是用一个固定形状的窗口组成,该窗口根据其步幅大小在输入的所有区域上滑动,为固定形状窗口(有时称为汇聚窗口)遍历的每个位置计算一个输出。然而,不同于卷积层中的输入和卷积核之间的互相关计算,汇聚窗口不包含参数,我们通常计算汇聚窗口中所有元素的最大值或平均值,所得的输出结果我们称为汇聚层(池化层),而这些操作分别称为最大汇聚(最大池化)平均汇聚层(平均池化)

在这两种情况下,汇聚窗口都是从输入张量的左上角开始,从左往右、从上往下的在输入张量内滑动。在汇聚窗口到达的每个位置,它计算该窗口中输入子张量的最大值或平均值。计算最大值或平均值是取决于使用了最大汇聚层还是平均汇聚层。

image-20220105222823891

举个例子,用2×2的汇聚窗口去扫描,如果窗口内的值是

max(0,1,3,4)=4,

max(1,2,4,5)=5,

max(3,4,6,7)=7,

max(4,5,7,8)=8。

汇聚窗口形状为p×q的汇聚层称为p×q汇聚层,汇聚操作称为p×q汇聚

7.4 整体网络架构

CNN完整的网络架构可以用下面的图片来描述:

image-20220402161207939

对于一张输入而来的图片,我们会经过多次卷积和多次池化。需要知道的是,在每次卷积后,我们都会用ReLu修正线性单元来激活。而对于卷积核池化,实际上都是在处理图片而已,如果要做出最终分类的效果,我们需要将处理好的图片输入全连接层。

全连接层无法接收多维的图片,所以在输入前,多维图片会被拉伸成一维的特征向量来输入到全连接层中,后面的操作和前面分类的操作完全一样,这里不再赘述。

我们在谈论一个网络多少层时,一般看他带不带参数计算。如上面的例子,实际上只有6层卷积层和1层全连接层,为七层神经网络。

在整体网络的运行时,特征图的变化如下:

image-20220402161819731

7.5 后话

相信经过上面的学习,你应该是对卷积神经网络在做啥事有个大局观了。在后面的学习中,我们会看到多个经典的卷积神经网络如Alexnet、VGG等。当然这都是后话,今天你也累了,早点休息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/398575.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络爬虫(一)——爬虫及其实现

文章目录1.1 爬虫概述1.1.3 网络爬虫和浏览器的区别1.1.2 网络爬虫的定义1.2 requests请求库1.2.1 requests基本概念1.2.2 疫情数据爬取1.2.3 get请求1.2.4 headers请求头1.2.5 Cookies验证1.3 Beautiful Soup解析库1.3.1 安装1.3.2 对象的创建1.3.3 find方法1.3.4 后话1.4 正则…

Windows五种IO模型性能分析和Linux五种IO模型性能分析

Windows五种IO模型性能分析和Linux五种IO模型性能分析 http://blog.csdn.net/jay900323/article/details/18141217 http://blog.csdn.net/jay900323/article/details/18140847 重叠I/O模型的另外几个优点在于,微软针对重叠I/O模型提供了一些特有的扩展函数。当使用重…

C++从0到1的入门级教学(十一)——友元

文章目录11 友元11.1 全局函数做友元11.2 友元类11.3 成员函数做友元11 友元 让我们引入一个例子来讲述友元是什么。 生活中你的家有客厅,有卧室,客厅所有来的客人都可以进去,但是你的卧室是私有的。对于认识的人来说你可以允许它进去&…

KeyMob:为国内应用开发者管理的广告聚合平台

为什么80%的码农都做不了架构师?>>> 应用开发者在应用中嵌入广告SDK的来源主要包括两种:使用移动广告平台与移动广告聚合平台。国内有多少家提供移动广告管理的平台?据统计,这两个版本,已经有四五十家。虽…

模拟航班查询及预定系统 编写示例

一、建立C#窗体 所需控件: Label标签 Button 按钮 TextBox 文本框 ComboBox 组合框 DATaGridView 数据显示 DateTimePicker 日期表 NumericUpDown 数字选择 二、建立后台数据库 大概需要四张表 1,航空公司表 2,城市信息表 3,航班…

数据结构杂谈(七)——串

文章目录7 串7.1 基本知识7.1.1 串的定义:rose:定义:rose:各种概念:rose:字符串和线性表的区别7.1.2 串的抽象类型数据定义7.1.3 串的比较:rose:原理7.2 串的存储结构:rose:7.2.1串的顺序存储:rose:7.2.2 串的链式存储7.3 基本操作:rose:7.3.1 返回子串操作:rose:7.3.2 比较操作…

Linux实现的IEEE 802.q VLAN

本文转载自: http://blog.chinaunix.net/uid-20786208-id-4291059.html Technorati 标签: Linux VLAN--------------------------我是快乐的分割线-------------------------------------------------- 第一部分:VLAN的核心概念 说起IEEE 802.1q&#xf…

C++从0到1的入门级教学(十二)——运算符重载

文章目录12 运算符重载12.1 加法运算符重载12.2 左移运算符重载12.2.1 演示与说明12.2.2 常见的友元使用:重载>>运算符12.3 递增运算符重载12.4 赋值运算符重载12.5 关系运算符重载12.6 函数调用运算符重载12 运算符重载 在本讲中,我们会设计到一…

C++从0到1的入门级教学(十三)——继承

文章目录13 继承13.1 继承的基本语法13.2 继承方式13.3 继承的对象模型13.4 继承中构造和析构顺序13.5 继承同名成员处理方式13.6 继承同名静态成员处理方式13.7 多继承语法13.8 菱形继承13 继承 继承是面向对象三大特性之一。有些类和类之间存在特殊的关系,如下图…

线性代数(二)

2 解线性方程组 1 Ax b的列图像实质是A的列向量有各种线性组合,b为其中的一种组合结果。 2 Ax b可以写为Axx1a1...xnanbAx x_1a_1...x_na_n bAxx1​a1​...xn​an​b,其中a1,a2...ana_1,a_2...a_na1​,a2​...an​为A中的列向量。 3 当Ax 0时&#…

xor方程组消元 UVA 11542 Square

题目传送门 题意:给n个数,选择一些数字乘积为平方数的选择方案数。训练指南题目。 分析:每一个数字分解质因数。比如4, 6, 10, 15,, , , , 令,表示选择第i个数字,那么&am…

深度学习修炼(八)——经典卷积网络

文章目录8 经典卷积网络8.1 LeNet模型8.2 Alexnet8.3 VGG8.4 ResNet8.5 感受野8 经典卷积网络 在前面一讲,我们谈论了关于卷积神经网络的诸多细节。综合来讲,卷积神经网络就是含卷积层的网络。在本讲中,我们将会根据卷积神经网络发展的历史&…

视觉中的经典图像特征小结(一): 颜色直方图, HOG, LBP

[普兒原创, 如有错误和纰漏欢迎指正. 更新中...] 1. 颜色直方图 颜色空间在本质上是定义在某种坐标系统下的子空间,空间中的每一个坐标表示一种不同的颜色。颜色空间的目的在于给出某种颜色标准,使得不同的设备和用途都能对颜色有一致的描述。这里主要介…

C++从0到1的入门级教学(七)——指针

文章目录7 指针7.1 指针的基本概念7.2 指针变量的定义和使用7.3 指针所占内存空间7.4 空指针7.5 野指针7.6 void*指针7.7 指向指针的指针7.8 const修饰指针7.9 指针和数组7.10 指针和函数7 指针 指针是指向另外一种类型的符合类型,和引用类似,指针也实现…

C++从0到1的入门级教学(五)——字符串、向量和数组

文章目录5 字符串、向量和数组5.1 命名空间5.2 标准库string5.2.1 定义和初始化string对象5.2.2 string对象上的操作5.2.2.1 读取string对象5.2.2.2 风格5.2.2.3 使用getline读取一整行5.2.2.4 empty和size操作5.2.2.5 size_type类型5.2.2.6 比较string对象5.2.2.7 string对象的…

媒体格式分析之flv -- 基于FFMPEG

本来是应该先写一个媒体文件格式的简单讲解的,还没来得及写,以后再写。今天就先根据ffmpeg的flv.c的flv_demux这个结构体来讲解一下当前比较流行的媒体格式flv. FLV 是FLASH VIDEO的简称,FLV流媒体格式是随着Flash MX的推出发展而来的视频格式…

C++从0到1的入门级教学(三)——表达式和运算符

文章目录3 运算符3.1 表达式3.1.1 基本概念3.1.2 运算符和运算对象3.1.3 运算对象的转换3.1.4 左值和右值3.2 运算符3.2.1 算术运算符3.2.2 赋值运算符3.2.3 比较运算符3.2.4 逻辑运算符3.2.5 成员访问运算符3.2.6 条件运算符3 运算符 C提供了一套供操作内置数据类型的运算符&…

谈谈用SQLite和FMDB而不用Core Data

谈谈用SQLite和FMDB而不用Core Data 发布于:2014-04-22 11:22阅读数:4235 凭良心讲,我不能告诉你不去使用Core Data。它不错,而且也在变好,并且它被很多其他Cocoa开发者所理解,当有新人加入你的组或者需要别…

Idea工具开发 SpringBoot整合JSP(毕设亲测可用)

因为,临近毕业了,自己虽然也学了很多框架。但是,都是在别人搭建好的基础上进行项目开发。但是springboot的官方文档上明确指出不提倡使用jsp进行前端开发,但是在校期间只学了jsp作为前端页面。所以,废话不多说&#xf…

深度学习番外——Yolov5服务器环境搭建

文章目录1 服务器搭建yolov5环境1.1 创建环境1.2 跟随官方指引2 下载预训练权重3 推理4 测试1 服务器搭建yolov5环境 1.1 创建环境 首先先的在本地环境下搭建一个我们的环境,名字设为yolo5-6 conda create -n yolov5-6 python3.7#创建环境 conda activate yolov5…