当前位置: 首页 > news >正文

深度学习之卷积神经网络学习笔记一

1. 引言

深度学习是一系列算法的统称,包括卷积神经网络(CNN),循环神经网络(RNN),自编码器(AE),深度置信网络(DBN),生成对抗模型(GAN)等。由于各算法的网络结构不同,被运用到的领域也不尽相同。卷积神经网络常被用于图像处理,如图像分类,语义分割,目标识别等领域。相比于传统的算法,深度学习能够自动构建特征,并联合这些特征完成相应任务。

2. 卷积神经网络

2.1 分类模型

卷积神经网络常被用于图像分类任务中。在图像分类任务中,模型更倾向于找到图像的主要语义特征,如手写数字集中的几何特征,imagenet数据集中的主体的纹理和颜色特征等。

LeCun(1989)提出了第一个卷积神经网络LeNet,并将其用于数字识别,且取得了较好的成绩。该文章首次提出了权值共享(weight sharing)和特征图像(feature map)的概念。模型包括一个输入层,三个隐藏层,一个输入层。隐藏层包括两层卷积,一层全连接。激活函数使用了双曲正切(tanh)函数,损失函数使用了均方误差函数,网络训练采用了反向传播算法。特征图像指的是卷积层通过在被提取层上滑动计算,得到的结果图。权值共享是指在一个卷积核在卷积过程时共享相同的参数,即一个卷积核对应一种特征图。反向传播算法是1986年Hinton提出用于训练浅层神经网络的算法,该算法能够通过计算神经元的梯度,优化神经元权值,从而得到最佳的神经网络模型。

自2012年,Hinton等提出AlexNet模型以来,卷积神经网络一直围绕以下几个方面进行优化:

1卷积核尺寸及多尺寸卷积核的研究;

2反向传播算法时出现的梯度消失问题;

3模型体量大小的优化问题;

4低层特征与高层特征融合问题。

AlexNet首次使用Relu激活函数在一定程度上解决了sigmoid和tanh等激活函数存在的梯度弥散问题,同时在全连接层使用了dropout随机忽略部分神经元,避免模型的过拟合,在Relu激活函数后使用了局部响应归一化函数增强较大值的神经元,抑制较小的神经元,使模型更加契合于分类任务。然而AlexNet使用了 11*115*5 的几百个大卷积核进行特征的提取,最后使用全连接层作为模型的分类器,这种大尺寸和数量的卷积核及全连接层大大增加了模型的计算量。

VGGNet继承了AlexNet的卷积-池化-全连接层的思想,并使用了多个 3*3 的卷积核叠加,提高了卷积层的感受野的同时,减少了神经元数量。例如,两个3*3卷积层的串联相当于1个 5*5 的卷积层,3个 3*3 的卷积层串联相当于1个 7*7 的卷积层,即3个 3*3 卷积层的感受野大小相当于1个 7*7 的卷积层。但是3个 3*3 的卷积层参数量只有 7*7 的一半左右。但是VGGNet由于使用了大量的卷积核及全连接层,所以计算量更为巨大。

GoogleNet提出了一种Inception结构,这种结构使用了 1*13*35*5 的卷积核进行特征提取,并使用了 1*1 的卷积核对大卷积核进行降维,减少计算量的同时,丰富了特征空间。值得一提的是,GoogleNet使用了 7*7 的卷积层取代了传统的全连接层,进一步提高了模型的效率。然而无论是VGGNet还是GoogleNet,随着模型层数的增加,分类性能并没有提高,反而收敛速度越来越慢,进而出现梯度消失的问题。

ResNet是何凯明等在2015年提出深度卷积神经网络模型,他们发现深层次模型在训练时,有些层对网络的分类能力并没有正面反馈,反而会降低模型的精度。所以他们提出了Shortcut Connection的结构,上层网络的输出为X,在下一层网络的变换映射下变为F(x),假设目前网络已达到最优,F(x)层为使模型退化的卷积层,我们的目的是将F(x)训练成恒等变换层。传统累加模型在训练时,很少能将F(x)自动训练成恒等变换层,ResNet提出的残差网络解决了这个问题,模型直接使用上层输出X及映射层F(x)的和作为模型的训练目标,何凯明等人通过大量实验发现将G(x)中的F(x)训练为0比将F(x)训练成恒等映射容易得多。从直观上来理解,SC结构中,每一层都能接收到上一层的信息,如此在链式求导时使每一项多出1(即X的求导项)。

目前主流的卷积神经网络,都采用了ResNet的SC结构。在以后的模型中,大多都借鉴了ResNet的思想,深层的卷积都联合了浅层特征,加强了特征的重用,缓解了梯度消失问题。典型的网络如DenseNet所有层之间密集连接,每层卷积层都接受来自前N-1个卷积层的结果,这种结构加大了特征的重用,减少了神经元的数量。简单来说,ResNet在很大程度上解决了上面提出的四个问题:首先,ResNet里面的每个SC结构里吸收了VGGNet的精华,都是 3*3 的卷积核嵌套。其次ResNet解决了深层次网络存在的梯度消失的问题,大大增加了网络的深度,如何凯明等已完成了一千多层的ResNet,并且分类性能并未下降。然后针对模型的体量问题,ResNet参考了GoogleNet的 1*1 卷积核思想,对高维特征进行了降维。最后,SC结构考虑了前一层的特征图,综合了前层的特征,这一思想为以后的模型构建提出了一种新的思路。

近年来,各种模型在体量上已经能够满足绝大多数特征的提取,然而这些特征对分类结果的影响是否相同?如在VGG-19中,最后一层一共有512个特征图,但是并不是每个特征图对最后的分类结果都有正面的贡献,那么如何区分这些特征的的贡献度呢?Google团队在RNN上首先使用了attention机制。Attention机制来源于人在观察事物并不是关注事物的整体,而是事物的某些突出的特征,即赋予突出特征较大权重。在CNN中,这一机制是通过卷积实现的:假设我们在某一层的特征图大小为 W*H*D (W和H代表特征图大小,D为特征图深度),首先使用深度为D,大小为W*H卷积核进行卷积,得到 1*1*D 的贡献度矩阵,并使用sigmoid函数进行归一化,得到的结果与原 W*H*D 直接相乘(不是矩阵乘法),这样每个特征图所占的权重就不一样了。目前,attention机制已经广泛运用到深度学习的各种模型中。

另一方面,卷积神经网络模型也朝着高效率,高精度的方向发展。无论是Google公司提出的轻量级网络MobileNet(2017)、EfficientNet(2019),还是Momenta公司提出的SENet(2017),都将研究方向放在如何在提高精度的前提下,尽量减少模型的体量,去除冗余网络分支。

从以上的模型发展可以看出,一个好的模型不仅能够保证其易于训练,拟合任务的数据集,以较小的体量充分地提取到图像特征,并且能够将多级特征联合,注重各级特征的语义,以便更好地完成分类任务,这些都是是以后我们构建模型所要考虑的问题。

2.2 分割模型

分割任务是将图像上的按预定义好的像素类别精确分割出来。相比于分类模型注重于图像主体特征的联合,分割模型更加注重于图像的细节特征的恢复。

2015年,Long等人首次提出了基于像素的语义分割模型全卷积神经网络(FCN)。FCN继承了CNN前5层卷积-池化操作,并将全连接层替换成了反卷积层。经过前5层卷积池化操作,分别得到原图1/2,1/4,1/8,1/16,1/32大小的特征图。若直接使用1/32特征图进行32倍反卷积,得到的模型为FCN-32;使用1/32的特征图进行2倍反卷积,得到1/16的热度图,再与1/16的特征图进行融合,最后对融合结果进行16倍反卷积,得到的模型为FCN-16。以此类推,文章还训练了FCN-8。由于FCN-8融合了1/8特征图,所以其细节上的效果要好于FCN-16和FCN-32。然而FCN还是存在以下缺点:

1由于经过了几次池化操作,使得图像细节丢失,所以FCN的结果不够平滑与精细;

2FCN是对逐像素进行分类,这导致每个像素被当做独立的个体,割裂了像素间的空间关系,缺乏空间一致性;

3FCN直接使用了8倍、16倍、32倍反卷积,由于反卷积步长太大,难以训练达到原标签的分割效果。

U-Net是FCN的改进模型之一,最开始被用于医学影像的分割。相比于FCN,U-Net使用了最经典的编码-解码结构。编码即为CNN特征提取的过程,在解码时,U-Net不仅使用了反卷积,还融合了每个卷积-池化层的特征图,并在解码时使用了卷积层进行训练,所以严格意义上讲,U-net才是第一个在上采样时经过训练的分割网络模型。其联合底层的特征与分类模型的思想也有异曲同工之妙。然而U-net还是具有传统分割神经网络模型的缺点:最大池化问题。大部分神经网络模型在进行特征提取时都会使用最大池化来减小网络体量,突出主要特征。然而这种方法在分割时忽略了细节,并且丢失了主体特征的空间位置信息,直接对这种特征图进行上采样容易出现特征位置的不对应。

SegNet改进了U-Net的上采样结构。SegNet在编码-解码时使用的是VGG模型,只是在池化的过程中记录了每个最大池化特征的索引,在模型上采样时,通过这些索引将这些特征还原到原来位置。这种方法略去了FCN和U-Net的反卷积操作,直接使用值为0的padding进行上采样,所以模型比上述两种容易训练,体量也更小。然而由于池化层的存在,SegNet在小物体分割方面远不如大物体。

---

为了减少池化层带来的信息损失,Deeplab将VGG最后两层池化的步长减少为1,同时增加了1层padding,如此可以保留细节信息。然而更改了VGG的池化层后,原模型的感受野变小,Deeplab提出了一种带孔卷积增加了模型的感受野,图a中是dilated=1的带孔卷积,就是普通卷积。图b中是dilated=2的带孔卷积,红点表示参与计算的点,未参与计算的带孔点由0补充,如此达到扩大感受野的目的,通过合适的步长,可以让特征图上所有点参与到卷积中。带孔卷积在不增加计算量的前提下,增大了分割模型的感受野,同时减少了池化层,让模型更加聚焦于细节特征。

3. 总结

在卷积神经网络模型中,还有一种用于目标检测和识别的网络如RCNN,该网络主要包括分类和回归两种任务,分类主要是描述任务主体的类别,回归主要是找出任务主体的具体位置,这里不再展开讨论。

从LeNet到AlexNet,是模型体量的增加和训练方法的优化。从AlexNet到VGGNet,是卷积方法的优化和特征图的泛化。而GoogleNet更多的是压缩模型结构,去除冗余。ResNet则是卷积神经网络突破层数限制的重大创新。在以后的模型中,研究者们更加注重特征的含义和模型的效率,Attention机制提出了“不同特征不同权重”的新研究方向,DenseNet给出特征的重复利用的研究路线。SENet和EfficientNet则更注重于网络体量的压缩与优化。所以,解释各层特征的含义,了解模型在训练时具体的过程,优化模型体量,增加分类精度,是卷积神经网络研究的重点和难点。

相关文章:

深度学习之卷积神经网络学习笔记一

1. 引言深度学习是一系列算法的统称,包括卷积神经网络(CNN),循环神经网络(RNN),自编码器(AE),深度置信网络(DBN),生成对抗…...

黑盒测试的常用方法

这里我们先设置一个示例,后面的文章中会根据示例来进行讲解 假设有一个程序是判断一个整形数字是否属于1-100 目录 1.等价类法 2.边界值法 3.判定表法 4.场景设计法 5.错误猜测法 6.正交法 1.等价类法 概念:系统性的确定要输入的测试条件的方法可以看出概念非常抽象,那…...

操作系统笔记-第一章

文章目录操作系统概述1. 操作系统的概念1.1 操作系统的地位1.2 操作系统的作用1.3 操作系统的定义2. 操作系统的历史2.1 操作系统的产生2.1.1 手动操作阶段(20世纪40年代)2.1.2 批处理阶段(20世纪50年代)2.1.3 执行系统阶段&#…...

daillist

daillist #重要说明: #[1]任意两个配置参数之间必须以空格隔开,否则,拨号脚本无法识别。 #[2]Info格式说明:厂商名简称_制式_频段 #VID #PID #PORT_M #PORT_A #PORT_G #script_*99# #script_#777 #Info 05c6 9025 /dev/ttyUSB1 /dev/ttyUSB2 …...

vue中render函数的作用和参数(vue2中render函数用法)

render 函数是 Vue2.x 新增的一个函数、主要用来提升节点的性能,它是基于 JavaScript 计算。使用 Render 函数将 Template 里面的节点解析成虚拟的 Dom 。Vue 推荐在绝大多数情况下使用模板来创建 HTML。然而在一些场景中,需要 JavaScript 的完全编程能力…...

基于Istio的高级流量管理二(Envoy流量劫持、Istio架构、高级流量管理)

文章目录一、Envoy流量劫持机制(Iptables规则流转)1、流量出向劫持流程(1)envoy怎样劫持入向流量?(2)Envoy劫持到流量之后,干什么?(查询目的地)&a…...

Sharding-Springboot-mybatis-plus整合(三)-inline策略

Sharding-Springboot-mybatis-plus整合(三) 1.简介 本节目标,使用SpringBoot整合Sharding和Mybatis-Plus验证上节分片策略 从配置文件上看策略包括( inline、standard、complex、hint) 环境搭建以inline策略演示 …...

编码的基本概念

本专栏包含信息论与编码的核心知识,按知识点组织,可作为教学或学习的参考。markdown版本已归档至【Github仓库:information-theory】,需要的朋友们自取。或者公众号【AIShareLab】回复 信息论 也可获取。 文章目录信源编码分类前缀…...

函数指针与指针函数的区别

目录:一、函数指针1 函数类型2 函数指针(指向函数的指针)3 函数指针数组二.函数指针和指针函数比较1 定义不同2 写法不同3.用法不同三.函数指针做函数参数(回调函数)1 利用回调函数实现打印任意类型数据2 提供能够打印任意类型数组函数3 利用回调函数 提供查找功能四…...

死锁的四个必要条件以及如何避免死锁

死锁的四个必要条件以及如何避免死锁 一.什么是死锁?二.死锁的四个必要条件 1.互斥条件:2.请求与保持条件:3.不剥夺条件:4.循环等待条件: 三.如何避免死锁 1.破坏请求保持条件2.破坏不剥夺条件3.破坏循环等待条件 死锁的四个必要条件以及如…...

浏览器多线程到事件循环机制

浏览器与js运行机制 进程与线程 进程 进程是CPU分配资源的最小单位,它是一个可以自己独立运行且拥有自己资源空间的任务程序;包括程序以及程序所使用的内存及系统资源 线程 线程是CPU调度的最小单位,它就是程序中的一个执行流&#xff1…...

Lambda表达式的本质

一直想写一篇文章,来总结lambda表达式,但是之前感觉总结的不是特别到位,现在看了几篇文章和视频后,感觉对lambda表达式有了比较深刻的认识,现在进行记录总结如下: lambda表达式又叫做匿名函数,…...

类的加载过程(生命周期)

类的加载过程(生命周期) 一、装载:通过一个类的全限定名获取定义此类的二进制字节流将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构在内存中生成一个代表这个类的java.lang.Class对象(将字节码加载到内存中),作为…...

2023最新谷粒商城笔记之MQ消息队列篇(全文总共13万字,超详细)

MQ消息队列 其实队列JDK中本身就有,不过这种队列也只能单体服务可能会使用,一旦项目使用的分布式架构,那么一定还是需要用到一个消息中间件的。我们引入消息队列的原因就是对我们的页面相应速度再优化,让用户的体验更好&#xff…...

多变量线性回归模型

多变量线性回归模型 模型参数为n1维向量,此时模型公式为 hθ(x)θ0x0θ1x1θ2x2...θnxnh_{\theta}(x)\theta_{0}x_{0}\theta_{1}x_{1}\theta_{2}x_{2}...\theta_{n}x_{n} hθ​(x)θ0​x0​θ1​x1​θ2​x2​...θn​xn​ 可以简化为 hθ(x)θTXh_{\theta}(x)\th…...

php 基于ICMP协议实现一个ping命令

php 基于ICMP协议实现一个ping命令 网络协议是什么ICMP 协议什么是ICMP?ICMP 的主要功能ICMP 在 IPv4 和 IPv6 的封装Wireshark抓包ICMP 请求包分析PHP构建 ICMP 数据包php中的 pack & unpack 函数字节和字符packunpackICMP计算校验和步骤总结网络协议是什么 网络协议&…...

Java基本数据类型

1.概述 佛说,大千世界,无奇不有。在这个世界里,物种的多样性,遍地开花,同样,在Java的世界里,也有着异曲同工之妙,Java秉承面向对象的特性,必然少不了区分对象的类型&…...

English Learning - L2 语音作业打卡 Day2 2023.2.22 周三

English Learning - L2 语音作业打卡 Day2 2023.2.22 周三💌 发音小贴士:💌 当日目标音发音规则/技巧:🍭 Part 1【热身练习】🍭 Part2【练习内容】🍭【练习感受】🍓元音[ ɑː ]&…...

45. 跳跃游戏 II

题目: 45. 跳跃游戏 II难度中等1974收藏分享切换为英文接收动态反馈给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 num…...

应届生Java面试50题线程篇(含解析)

什么是线程? 答:线程是操作系统能够进行运算调度的最小单位,是程序执行流的最小单元。在Java中,可以通过实现Runnable接口或继承Thread类来创建线程。 创建线程的方式有哪些?各自的优缺点是什么? 继承 Thread 类&…...

【数据库】第七章 数据库设计

第七章数据库设计 数据库设计概述 数据库设计的基本步骤 需求分析概念结构设计逻辑结构设计物理结构设计数据库实施数据库运行和维护 需求分析 收集需求,理解需求 收集各个角色的需求 概念数据库设计 建立概念模型 ,E-R图/IDEF1x图 消除冲突&…...

Burp Suite 常用模块简介

Burp Suite 常用模块分为 目标站点(target)模块 代理(proxy)模块 攻击(Intruder)模块 重放(Repeater) 模块 Target模块是对站点资源的收集,与站点各资源包发出和相应包的记录 Proxy模块是核心模块,可以拦截数据包发送往浏览器,进行修改后再…...

QML Item和Rectangle详解

1.Item和Rectangle Item类型是Qt Quick中所有可视项的基本类型。 Qt Quick中的所有可视项都继承Item。尽管Item对象没有视觉外观,但它定义了视觉项中常见的所有属性,例如x和y位置、宽度和高度、锚定和键处理支持。 Rectangle继承自Item,多…...

常见前端基础面试题(HTML,CSS,JS)(六)

GET 和 POST 的区别 从 http 协议的角度来说,GET 和 POST 它们都只是请求行中的第一个单词,除了语义不同,其实没有本质的区别。 之所以在实际开发中会产生各种区别,主要是因为浏览器的默认行为造成的。 受浏览器的影响&#xf…...

深度学习 李沐报错

3.6. softmax回归的从零开始实现 — 动手学深度学习 2.0.0 documentation softmax从0开始实现 函数执行需要加main指定 改成这样 if __name__"__main__":print(evaluate_accuracy(net, test_iter)) 不然会这样出错 RuntimeError: An attempt has been m…...

【JAVA程序设计】(C00104)基于Springboot的家庭理财管理系统——有文档

基于Springboot的家庭理财管理系统项目简介项目获取开发环境项目技术运行截图运行视频项目简介 基于Springboot开发的家庭理财管理系统设计与实现共分为三个角色:系统管理员、家庭管理员、家庭用户 管理员角色包含以下功能: 用户管理、修改密码、角色管…...

【第五章 AOP概述,底层原理,AOP术语,切入点表达式,AOP操作(基于注解方式,基于xml配置文件)】

第五章 AOP概述,底层原理,AOP术语,切入点表达式,AOP操作(基于注解方式,基于xml配置文件) 1.AOP概述: (1)什么是AOP: ①面向切面编程(…...

面试官: 你知道 JWT、JWE、JWS 、JWK嘛?

想起了 之前做过的 很多 登录授权 的项目 它相比原先的session、cookie来说,更快更安全,跨域也不再是问题,更关键的是更加优雅 ,所以今天总结了一篇文章来介绍他 JWT 指JSON Web Token,如果在项目中通过 jjwt 来支持 J…...

基于企业微信应用消息的每日早安推送

基于企业微信应用消息的每日早安推送 第一步:注册企业微信 企业微信注册地址:https://work.weixin.qq.com/wework_admin/register_wx 按照正常流程填写信息即可,个人也可以注册企业微信,不需要公司 注册完成后,登录…...

【数字IC基础】黑盒验证、白盒验证、 灰盒验证

文章目录 一、黑盒验证二、白盒验证三、灰盒验证一、黑盒验证 1、黑盒验证:大多数基于仿真的验证环境都是黑盒验证;2、不需要知道设计的内部结构和特性,只需要在输入端口打激励,观察输出即可;3、验证工程师学习设计的规格,然后编写验证环境中的 drivers, monitors, check…...

wordpress增加访问速度/百度资源共享

VMware ThinApp可以实现在同一操作系统上运行任何版本的虚拟应用程序而不发生冲突,你甚至可以运行同一应用程序的多个版本。将VMware ThinApp应用到现在的基础管理设施上,并加快您的软件开发和桌面部署吧,通过无代理的应用程序虚拟化技术让应…...

做网站要不要签合同/互联网营销师是干什么的

12、请描述OSI7层模型各层名字及功能,并举例在不同层对应的协议 第一层:物理层,利用传输介质为数据提供物理连接, 对应的协议:ARP 第二层:数据链路层:建立和管理各节点间的链接链路 对应的协议&…...

网站响应式首页模板/百度seo招聘

人才的标准从来都不是一成不变的。在东方的战国时代和西方的骑士时代里,最受器重的是力敌万夫的勇士和巧舌善辩的谋臣;在中国的科举时代里,靠着“死记硬背”和“八股文章”而金榜题名的书生最容易出人头地;在西方工业革命风起云涌…...

好域名做网站/网络推广方案七步法

一、问题由来前一段时间本人的电脑崩溃了,系统还原之后,eclipse就用不了,也找不大原因。eclipse报错原因是jvm出现问题:JVM terminated Exit code2 C:\ProgramData\Oracle\javapath\javaw.exe等发现似乎是JVM出现错误了然后输入ja…...

thinkphp网站后台模板/百度移动端排名

Annotation是从JDK 1.5之后提出的一个新的开发技术结构,利用Annotation可以有效的减少程序配置的代码,并且可以利用Annotation进行一些结构化的定义。 Annotation是一一种注解的形式实现的程序开发。 如果想清楚Annotation的生产意义,则必须…...

响水做网站的价格/seo优化价格

对象的序列化主要解决的是对象状态的保存问题。这里所说的“对象状态”,其实就是指某一时刻对象所拥有的各个字段值的集合。 序列化最主要的作用有:1、在进程下次启动时读取上次保存的对象的信息 2、在不同的AppDomain或进程之间传递数据 3、在分布式应用…...