边境的悍匪—机器学习实战:第十四章 使用卷积神经网络的深度计算机视觉
第十四章 使用卷积神经网络的深度计算机视觉
文章目录
- 第十四章 使用卷积神经网络的深度计算机视觉
- 前言
- 一、思维导图
- 二、主要内容
- 1、视觉皮层的架构
- 2、卷积层
- 3、池化层
- 4、CNN架构
- 5、使用Keras实现RestNet-34 CNN
- 6、使用Keras的预训练模型
- 7、迁移学习的预训练模型
- 8、分类和定位
- 9、物体检测
- 10、语义分割
- 三、课后练习
- 四、总结
前言
神经网络除了基础的前馈神经网络,还有一些可以用于特殊场景的神经网络结构。这一章我们来了解一下常用于计算机视觉的神经网络结构——卷积神经网络(CNN)。受到生物视觉皮层的启发,科学家们提出了卷积神经网络的概念,使得网络中的神经元并不是一对一的全连接,而是使用一些特别的规则链接在一起,并且提出了两个概念:卷积层、池化层。随着时间的发证更多的科学家在原始CNN结构的基础上做出了很多的变体,并在各种赛事中取得了优异的成绩。下面就让我们来看一下吧。
一、思维导图
二、主要内容
1、视觉皮层的架构
科学家们在对动物的视觉皮层进行研究时发现,不同的神经元在大脑的皮层中起着不同的作用,并且每一个神经元只会与上一层的部分神经元连接。当这一发现应用到神经网络中并逐步发展到今天演变出了卷积神经网络(CNN),提出了卷积层与池化层两个概念来实现卷积神经网络的核心部分。
2、卷积层
卷积层
卷积层模仿视觉皮层的模式处理图像,卷积神经网络的第一层卷积层并不会与整个图像的像素全连接,而只会像接受野一样只与部分像素连接。这种架构允许在第一隐藏层中的低阶特征在下一隐藏层中组合成高维的特征。
滤波器
滤波器就是卷积层的核心,同时也是接受野的一种体现。文中提到垂直滤波器与水平滤波器两种,垂直滤波器会忽略除了垂直方向上的所有内容,同样水平滤波器也会忽略出来水平方向上的所有内容。所以当一个使用相同滤波器的层时会输出一个特征图,这个特征图主要体现的就是原始图像中最能激活滤波器的区域。
堆叠多个特征图
为了能够更加精准的以3D模式显示,我们一般会使用多个滤波器,然后将每个滤波器的输出特征图堆叠起来,同一个特征图中的神经元共享相同的参数。神经元的接受野与之前描述的是相同的,但是它拓展到了先前所有层的特征图,简而言之就是卷积层将多个可训练的滤波器同时应用于其输入,从而使其能够检测到输入中任何位置的多个特征。TensorFlow的实现
我们在使用TnesorFlow来实现卷积层时,需要注意到很多的超参数。例如:滤波器的数据,滤波器的大小,步幅,填充方式。内存需求
虽然卷积神经网络没有像深度神经网络那么使用全连接,但是同样有着很大的内存需求。我们在使用卷积神经网络预测的时候,我们可以在计算下一层隐藏层时就释放掉前一层的内存,所以只需要保证连续两层的内存。但是在训练神经网络的时候由于需要保存正向传播的所有内容,所以在训练需要保证所有层的内存。
3、池化层
池化层的工作原理与卷积层的大致相同,只不过池化层的目的是为了对图像进行缩小、减少计算量、减少内存使用量和减少参数。池化层的神经元都与接受野种的所有神经元连接,不同的是池化层的神经元没有权重,他的所有工作就是使用聚合函数聚合输入。
- TenosrFlow的实现
TensorFlow实现池化层很简单,是需要使用keras.layers就可以创建很多的池化层。
池化层除了可以从空间维度进行操作,还可以从深度维度进行操作。虽然Kera没有提供创建深度池化层的方法,但是TenosrFlow 底层API提供了实现的方式。
4、CNN架构
经典架构
经典的CNN架构,堆叠了一些卷积层然后是池化层,然后又是几个卷积层和池化层,在结构的顶部是一个常规的全连接前馈神经网络加上一个输出层。随着时代的发展,很多科学家已经在这个经典架构的基础上开发了很多的变体,并取得了不错的成绩。
LeNet-5
LeNet-5是一个广为人知的CNN架构,1998年创建被广泛用于手写数字识别,特殊的是他的池化层使用了平均池化层,输出层输出的是输入向量和权重向量之间的欧几里得距离的平方,而不是计算输出和权重向量的矩阵乘法。AlexNet
AlexNet CNN架构与LeNet-5架构相似,只是他更大更深,并且没有像LeNet-5一样将池化层放在卷积层之上,而是直接堆叠卷积层。为了减少过拟合作者使用了两种正则化技术,一是对部分全连接层的输出使用了dropout率为50%的dropout技术,二是通过随机转换图像来进行数据增强。GoogLeNet
GoogLeNet架构由google研究院开发。与前两个CNN架构不同,比他们更深,添加了一种称为盗梦空间的模块来更有效的使用参数,这个模块可以输出各种比例大小的的复杂的特征图。
完整的GoogLeNet,有很深的层,是一个高堆叠包括9个inception的模块。
原始的GoogLeNet是有两个辅助分类器,但是后期因为发现作用很小而删除。后续也有研究员使用对盗梦空间模块进行微调提出了几个变体并取得了很好的性能。VGGNet
VGGNet由牛津大学视觉几何组研究实验室开发,结构相对简单就是由两个或三个卷积层和一个池化层一直重复此结构总共有16到19个卷积层,还有两个隐藏层和一个输出层。并且他使用的滤波器只是3*3的。ResNet
ResNet是一个有152层组成的非常深的CNN,它证实了一个趋势,当模型越来越深的时候参数会越来越少,能够训练这种深层神经网络的关键是使用跳过连接,及跳过一部分的层,直接将输入添加到网络的输出,这种方式成为残缺学习。
这个架构的完整结构的开始和结束与GoogLeNet完全相同,中间是由一堆刚刚提到的残缺单元组成,每个残缺单元由两个卷积层组成。
ResNet还有34层、50层、101层几个变体,每个变体在结构上都有微妙的差别。Xception
Xception算是GoogLeNet的一个变体,他用可分离卷积层替换了盗梦空间的模块,构建了空间滤波器和跨通道滤波器两个部分,与常规的卷积层相比,可以分离卷积层使用了更少了的参数更少的内存和更少的计算。SENet
SENet扩展了现有的架构,在原始的inception模块或者是残缺单元添加了一个成为SE块的小型神经网络。SE块的作用在于连接单元的输出对输出的特征图进行校验,降低无关的特征图。
5、使用Keras实现RestNet-34 CNN
我们可以从0开始使用Keras实现一个RestNet-34CNN架构,首选需要自定义一个ResidualUnit层,也就是架构中的残缺层,然后使用Sequential按照RestNet-34架构构建起来。虽然我们可以自己构建,方法也很简单,但是还有更简单的方法,Keras已经内置了一些常用的CNN架构。
6、使用Keras的预训练模型
在实际应用当我们完全可以不用像上一节提到的一样从无到有创建一个CNN架构,因为Keras已经为我们提供了一些标准的模型,只需要简单的几行代码就能够创建一个模型并且可以下载预训练的权重。
7、迁移学习的预训练模型
在上一节使用Keras预训练模型的基础上我们可以做迁移学习,使用原始架构的一部分层,加上自定义的层组合成一个完整模型后开始训练。然后再解冻部分层,再训练直到获得一个优秀的模型。
8、分类和定位
物体的分类我们已经通过迁移学习的方式来完成。物体的定位我们可以物体中心的水平坐标和垂直坐标,加上高度和宽度,然后使用MSE损失来进行训练。在评估模型的性能时我们可以使用交并比来评估及预测边界框和目标边界框之间的重叠面积除以他们的联合面积。
9、物体检测
物体检测的含义是在图像中对多个物体进行分类和定位的任务。一种复杂的实现方式是多次执行CNN,删除边界框。
- 全卷积网络
这个概念是将CNN顶部的密集层替换成卷积层。使得模型就像是拿了一个原始的CNN在图像上滑动。替换的约束是:卷积层中的滤波器数,必须等于密基层中的单元数,滤波器的大小必须等于输入特征图的大小,并且使用"valid"填充。 - YOLO
YOLO是一种快速到可以使用在实时视频中的实现物体检测的CNN架构,并且在后续的几年又提出了几种优化后的变体。 - 均值平均精度
均值平均精度是物体检测中常用的指标。当需要用到多个类别来评估模型的性能时,我们需要一次计算每个类别的平均精度(AP),然后再计算均值(mAP)。
10、语义分割
语义分割是对图像中每个像素进行分类。但是常规的CNN会合并同一类的所有物品归为一个大块,不会更加精确。我们有几种方式解决这个问题,并且TensorFlow也提供了几种卷积层,在GitHub上也有语义分割的实现,甚至还能找到预训练的模型。
三、课后练习
- 与用于图像分类的全连接的DNN相比,CNN有什么优势?
在CNN连续的层只有一部分连接并且有大量的权重时复用的,所以CNN的参数要比全连接的少,加快了训练速度,降低了过拟合的风险,需要的需要的训练数据也少的多。
CNN学会了可以检测到特定特征的内核后,就可以在图像的任何角度检测到特征,但是DNN只能在学习到的位置检测到它。所以对于很多重复特征的图像,CNN可以作用使用很少的训练实例,就可以比DNN更好的泛化到图像处理任务。
DNN没有像素的排列方式的先验知识。它不知道附近的像素很近。CNN架构嵌入了此先验知识。较低的层通常在图像的较小区域中标识特征,而高层将较低层的特征组合为较大的特征。这对大多数自然图像都能很好的工作,所以使用CNN比DNN更具有领先优势。 - 考虑由三个卷积层组成的CNN,每个卷积层具有3×3内核,步幅为2和"same"填充。最低层输出100个特征图,中间层输出200个特征图,最顶层输出400个特征图。输入图像是200×300像素的RGB图像。CNN中的参数总数是多少?如果我们使用的是32位浮点数,那么在对单个实例进行预测时,至少该网络需要多少RAM?训练一个包含50个图像的小批量时会怎样?
由于第一个卷积层内核为33并且输入为三个通道,那么第一层每个特征图有333 + 1 = 28个权重参数,第一个卷积层有100个特征图一共是2800个权重参数。第二层内核也为33 输入为上一层的100个特征图的集合,那么一个特征图的权重参数为3*3 100 + 1(偏执项)= 901,第二层有200个特征图 权重参数数量为 901 * 200 = 180200。以此类推第三层有720400个参数。所以三个卷积层加起来有903400个权重参数。
当我们对单个实例进行预测时。由于我们的填充方式为SAME步幅为2,输入的图像大小为200,300,因此我们第一层卷积层特征图大小为100150 第二层为50, 75 第三层为25 * 38。并且一个32为是4个字节,所以第一层是6M,第二层是3M,第三层是1.5M,由于预测时是需要同时使用两层,所以6+3=9。加上上一个问题的903400个参数每个参数四个字节,一共是3.6M。一共参数加上卷积层输出的特征图为12.6M内存。
上一个问题计算出,每个实例需要12.6M的内存,那么一个50个实例就为526M内存,加上输入图像的内存50 * 4 * 200 * 300 * 3= 3600万字节,36M,再加上上一个问题计算出来的参数内存3.6M。50个图形在训练时保守估计需要 525 + 36 + 3.6 = 564.6M内存。 - 如果训练CNN时GPU内存不足,可以尝试哪5种方法来解决这个问题?
如果在训练CNN时发现内存不够,可以使用以下几种方式来解决。1、减小小批量的大小。2、在一层或者多层中使用较大的步幅来降维。3、去除一层或者多层。4、使用16位浮点数而不是32位。5、在多个设备上分布CNN。 - 为什么要添加最大池化层而不是具有相同步幅的卷积层?
因为最大池化层没有参数,而卷积层是有参数的。 - 你何时要添加局部响应归一化层?
局部响应归一化层中使用最强烈激活的神经元一直在相同位置但在相邻特征图中的神经元,从而是不同的特征图有针对性并相互远离,使它们探索更为广泛的特征。它通常用于较低的层,以拥有更大的低层特征池。 - 与LeNet-5相比,你能说出AlexNet的主要创新之处吗?GoogLeNet、ResNet、SENet和Xception的主要创新是什么呢?
与LeNet-5相比,AlexNet的主要创新之处在于它更大、更深,并且将卷积层直接堆叠在彼此之上,而不是将池化层堆叠在每个卷积层之上。GoogLeNet的主要创新之处在于引入了inception模块,与以前的CNN架构相比,它具有更少的参数,从而可以有更深的网络。ResNet的主要创新是引入了链接跳跃,这使超过100层成为可能。可以说,其简单行和一致性也颇具创新新。SENet的主要创新是在inception网络中的每个inception模块或RestNet中的每一个残差但愿之后使用SE块来重新校准特征图的相对重要性。最后,Xception的主要创新是使用了深度可分离卷积层,他们可以各自识别空间模式和深度模式。 - 什么是全卷积网络?如何将密集层转换为卷积层?
完全卷积网络是由卷积层和池化层组成的神经网络。FCN可以有效的处理任何宽度和高度的图像。他们对于物体检测和语义分割最有用,因为他们只需要查看一次图像。如果你有CNN,则可以将这些密集层转换位卷积层来创建FCN:只需用内核大小等于该层输入大小的卷积层替换最低密集层,再密集层中每个神经元使用一个过滤器,并使用valid填充。通常,步幅应为1,但是你可以根据需要将其设置为更高的值,但是要使用1X1的内核。实际上可以通过适当的重排密集层的权重矩阵这种方式来转换经过训练的CNN。 - 语义分割的主要技术困难是什么?
语义分割的主要技术难点是,当信息经过每一层时许多空间信息会在CNN中丢失,这个空间信息需要被恢复才能准确的预测出每个像素的类别。
四、总结
这一章节从计算机视觉的角度讲解了卷积神经网络(CNN),包括卷积神经网络的起源、发展与应用。着重说明了什么是卷积神经网络,他的组成和整体架构以及由经典架构进化的变体。
- 卷积神经网络是按照视觉皮层的结构演变而来的。
- 视觉皮层中接受野的体现是CNN中的滤波器,每一个卷积层可以有多个滤波器,每一个由相同滤波器组成的隐藏层会输出一个特征图。
- CNN中还有一个概念叫池化层,工作原理与卷积层相同,但作用是缩小图像,减少使用的内存,减少计算量、减少权重参数。
- 经典的CNN架构为,一些卷积层加一个池化层,再加一些卷积层和一个池化层,架构的顶端为一个常规的全连接前馈深度神经网络加上一个输出层。其他的所有变体都是在这个基础上演变出来的。
- 我们可以使用TensorFlow轻松实现一个卷积神经网络,并且可以使用预训练的权重数据。
- 对一个图像中的多个物体进行分类和检测的操作称为物体检测,解决物体检测的方法会用到全卷积网络,也就是将卷积神经网络的顶部的密基层替换为卷积层。其中POLO架构是一直快速的物体检测架构。
对文章有任何疑惑或者想要和博主一起学机器学习一起进步的朋友们可以添加 群号:666980220。需要机器学习实战电子版或是思维导图的也可以联系我。祝你好运!
项目地址: github
边境的悍匪—机器学习实战:第十四章 使用卷积神经网络的深度计算机视觉相关推荐
- 【神经网络与深度学习-TensorFlow实践】-中国大学MOOC课程(十四)(卷积神经网络))
[神经网络与深度学习-TensorFlow实践]-中国大学MOOC课程(十四)(卷积神经网络)) 14 卷积神经网络 14.1 深度学习基础 14.1.1 深度学习的基本思想 14.1.2 深度学习三 ...
- 机器学习实战(十四)利用SVD简化数据
第十四章 利用SVD简化数据 14.1 SVD的应用 14.1.1 隐形语义索引 14.1.2 推荐系统 14.2 矩阵分解(SVD矩阵分解) 14.3 利用python实现SVD 14.4 基于协同 ...
- 机器学习实战(十四)Pegasos(原始估计子梯度求解器)
目录 0. 前言 1. SVM 概念 2. Pegasos 3. 实战案例 3.1. Pegasos 学习完机器学习实战的Pegasos,简单的做个笔记.文中部分描述属于个人消化后的理解,仅供参考. ...
- 吴恩达《机器学习》第十四章:降维
文章目录 十四.降维 14.1 应用一:数据压缩 14.2 应用二:数据可视化 14.3 主成分分析PCA 14.4 重建的压缩表示 14.5 选择主成分的数量 14.6 主成分分析的应用建议 十四. ...
- CNN的Python实现——第四章:卷积神经网络的结构
文章目录 第4章 卷积神经网络的结构 4.1 概述 4.1.1 局部连接 4.1.2 参数共享 4.1.3 3D特征图 4.2 卷积层 4.2.1 卷积运算及代码实现 4.2.2 卷积层及代码初级实现 ...
- 《机器学习实战》第四章
记 本章介绍了数个训练模型(非常多的数学公式对咱十分不友好) 1.线性回归 随机生成线性数据集: import numpy as npX = 2 * np.random.rand(100, 1) y ...
- 机器学习实战(十)——利用K-均值聚类算法对未标注数据分组
机器学习实战(十)--利用K-均值聚类算法对未标注数据分组 聚类是一种无监督的学习,即对于训练数据来说并没有已知标签,我们是根据样本之间的相似程度将其划分为多个类. 一.K-均值聚类算法 K-均值算法 ...
- 机器学习(周志华) 参考答案 第十四章 概率图模型 14.9
机器学习(周志华西瓜书) 参考答案 总目录 http://blog.csdn.net/icefire_tyh/article/details/52064910 机器学习(周志华) 参考答案 第十四章 ...
- R语言实战笔记--第十四章 主成分和因子分析
R语言实战笔记–第十四章 主成分和因子分析 标签(空格分隔): R语言 主成分分析 因子分析 原理及区别 主成分分析与因子分析很接近,其目的均是为了降维,以更简洁的数据去解释结果,但这两种方法其实是相 ...
- 李弘毅机器学习笔记:第十四章—Why deep?
李弘毅机器学习笔记:第十四章-Why deep? 问题1:越深越好? 问题2:矮胖结构 v.s. 高瘦结构 引入模块化 深度学习 使用语音识别举例 语音辨识: 传统的实现方法:HMM-GMM 深度学习 ...
最新文章
- 收集42款经典的Chrome 插件
- java ee jstl_Java EE之JSTL(下)
- 通过@Import注解把类注入容器的四种方式
- 4. linux调用文件计算阶乘前5项和_【题解循环】1091:求阶乘的和
- linux 从一台服务器向另台服务器复制文件
- sublime java 编译_03 sublime text3下配置Java的编译运行环境
- 【滑动窗口】leetcode1456:定长子串中元音的最大数目
- jquery 根据样式或者名称获取 对象遍历赋值
- 昨天凌晨故宫网站崩了,被众多人“围攻”!留言亮了...
- textarea光标处插入文字
- 七、文章管理页面及功能实现《iVX低代码/无代码个人博客制作》
- android view分析工具,Android 性能分析工具之TraceView
- 仓库货位 mysql_Max(TM)财务进销存管理系统
- mysql创建学生信息选课系统_MySQL学生信息管理系统
- 【安卓开发】开源Notepad记事本APP项目(完整代码+说明文档)
- 2019年安徽省模块七满分多少_2019年安徽中考总分是多少 考试科目及分值
- c语言必背数据结构_C语言实现常用数据结构:简要一览(第1篇
- 捕获输入值的异常(try...except)
- 无条件转移jmp详细执行过程
- 5G无线关键技术 — 非正交多址接入技术