深度学习之卷积神经网络学习笔记一
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*11 和 5*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*1,3*3 和 5*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调度的最小单位,它就是程序中的一个执行流࿱…...
Lambda表达式的本质
一直想写一篇文章,来总结lambda表达式,但是之前感觉总结的不是特别到位,现在看了几篇文章和视频后,感觉对lambda表达式有了比较深刻的认识,现在进行记录总结如下: lambda表达式又叫做匿名函数,…...
类的加载过程(生命周期)
类的加载过程(生命周期) 一、装载:通过一个类的全限定名获取定义此类的二进制字节流将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构在内存中生成一个代表这个类的java.lang.Class对象(将字节码加载到内存中),作为…...
2023最新谷粒商城笔记之MQ消息队列篇(全文总共13万字,超详细)
MQ消息队列 其实队列JDK中本身就有,不过这种队列也只能单体服务可能会使用,一旦项目使用的分布式架构,那么一定还是需要用到一个消息中间件的。我们引入消息队列的原因就是对我们的页面相应速度再优化,让用户的体验更好ÿ…...
多变量线性回归模型
多变量线性回归模型 模型参数为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)θ0x0θ1x1θ2x2...θnxn 可以简化为 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 类&…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
