【基于 PyTorch 的 Python 深度学习】6 视觉处理基础:卷积神经网络(2)

前言

文章性质:学习笔记 📖

学习资料:吴茂贵《 Python 深度学习基于 PyTorch ( 第 2 版 ) 》【ISBN】978-7-111-71880-2

主要内容:根据学习资料撰写的学习笔记,该篇主要介绍了卷积神经网络的池化层部分和现代经典网络。

一、池化层

池化 Pooling 又称下采样,通过卷积层获得图像的特征后,理论上可以直接使用这些特征训练分类器,例如 softmax 。但这样会面临巨大的计算量挑战,而且容易产生过拟合的线下。为了降低网络训练参数及模型的过拟合程度,需要对卷机层进行池化处理。

最大池化 Max Pooling:选择 Pooling 窗口中的最大值作为采样值。

均值池化 Mean Pooling:选择 Pooling 窗口中的所有值相加取平均,以平均值作为采样值。

全局最大 / 均值池化:与最大或均值池化不同,全局池化是对整个特征图的池化,而不是在移动窗口范围内的池化。 

池化层在卷积神经网络中可用来减小尺寸,提高运算速度及减小噪声影响,让各特征更具有健壮性。池化层比卷积层简单,它没有卷积运算,只是在滤波器算子滑动区域内取最大值或平均值。池化的作用体现在下采样:保留显著特征、降低特征维度、增大感受野。深度网络越往后面越能捕捉到物体的语义信息,这种语义信息建立在较大的感受野基础上。

1、局部池化

局部池化:在移动窗口内的池化,取窗口内的最大值或平均值作为结果,经过操作后,特征图下采样,减少过拟合现象。

在 PyTorch 中,最大池化常使用 nn.MaxPool2d ,平均池化使用 nn.AvgPool2d 。在实际应用中,最大池化最为常用:

torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, 
                   return_indices=False, ceil_mode=False)
参数说明
kernel_size

池化窗口的大小,取四维向量,通常是 [height, width]

若二者相等,可以是数字,例如 kernel_size = 3

stride

窗口在每个维度上滑动的步长,通常是 [stride_w, stride_h]

若二者相等,可以是数字,例如 stride = 1

padding与卷积类似,输入的每一条边补充 0 的层数
dilation卷积对输入数据的空间间隔
return_indices是否返回最大值对应的下标
ceil_mode使用一些方块代替层结构

假设输入 input 的形状为 (N,C,H_{in},W_{in}) ,输出 output 的形状为 (N,C,H_{out},W_{out}) ,则输出大小与输入大小的计算公式为:

H_{out}=[\frac{H_{in}+2\times padding[0]-dilation[0]\times (kernel\: size[0]-1)-1}{stride[0]}+1]

W_{out}=[\frac{W_{in}+2\times padding[1]-dilation[1]\times (kernel\: size[1]-1)-1}{stride[1]}+1]

说明:如果不能整除,则取整数。

import torch
import torch.nn as nn

# 池化窗口为正方形 kernel_size=3,stride=2
m1 = nn.MaxPool2d(3, stride=2)

# 池化窗口为非正方形
m2 = nn.MaxPool2d((3, 2), stride=(2, 1))
input = torch.randn(20, 16, 50, 32)
output = m2(input)
print(output.shape)
# torch.Size([20, 16, 24, 31])

2、全局池化

与局部池化相对的就是全局池化,也分最大池化或平均池化。局部平均池化会有卷积核大小限制,比如 2×2 ,而全局平均池化没有大小限制,它针对的是整张特征图。我们以全局平均池化为例进行讲解,全局平均池化 Global Average Pooling 不以窗口的形式取均值,而是以特征图为单位进行均值化,即一个特征图输出一个值。具体说明如图 6-25 所示。

图左:将 4 个特征图先用一个全连接层展平为一个向量,然后通过一个全连接层输出为 4 个分类节点。GAP 可以将这两步合并。

图右:将 GAP 视为特殊的平均池化层,其池的大小与整个特征图的大小相同,其实就是求每张特征图所有像素的均值,输出一个数据值,这样 4 个特征图就会输出 4 个数据点,这些数据点将组成一个 1×4 的向量。

使用全局平均池化代替 CNN 中传统的全连接层。在使用卷积层的识别任务中,全局平均池化能够为每个特定的类别生成一个特征图。GAP 的优势在于:

  1. 相较于全连接层的黑箱,各类别与特征图之间的联系更加直观,特征图被转化为分类概率更加容易;
  2. GAP 不需要调参数,避免了过拟合问题;
  3. GAP 汇总了空间信息,因此对输入的空间转换更具鲁棒性。

所以目前卷积网络中最后几个全连接层大都被 GAP 替换了。

全局池化层在 Keras 中有对应的层,如全局最大池化层 GlobalMaxPooling2D ,PyTorch 中虽然没有对应名称的池化层,但可以使用其中的自适应池化层 AdaptiveMaxPool2d 或者 nn.AdaptiveAvgPool2d 实现。

import torch
import torch.nn as nn

# nn.AdaptiveMaxPool2d(output_size, return_indices=False)

# 输出大小为 5×7
m = nn.AdaptiveMaxPool2d((5, 7))
input = torch.randn(1, 64, 8, 9)
output = m(input)
print(output.size())

# 输出大小为 7×7
m = nn.AdaptiveMaxPool2d(7)
input = torch.randn(1, 64, 10, 9)
output = m(input)
print(output.size())

# 输出大小为 10×7
m = nn.AdaptiveMaxPool2d((None, 7))
input = torch.randn(1, 64, 10, 9)
output = m(input)
print(output.size())

# 输出大小为 1×1
m = nn.AdaptiveMaxPool2d((1))
input = torch.randn(1, 64, 10, 9)
output = m(input)
print(output.size())

说明:自适应池化层的输出张量的大小都是给定的 output_size 。例如输入张量大小为 (1, 64, 8, 9),设定输出大小为 (5, 7),通过自适应池化层,可以得到大小为 (1, 64, 5, 7) 的张量。

二、现代经典网络

最近几年卷积神经网络大致的发展轨迹:

1、LeNet-5 模型

LeNet 模型由卷积神经网络大师 LeCun 在 1998 年提出,用于完成手写数字识别的视觉任务,定下了CNN 的基本架构:卷积层、池化层、全连接层。LeNet-5 模型架构:输入层—卷积层—池化层—卷积层—池化层—全连接层—全连接层—输出层,为串联模式。

LeNet-5 模型具有如下特点:

  • 每个卷积层包含 3 个部分:卷积、池化和非线性激活函数。
  • 使用卷积提取空间特征。
  • 采用下采样的平均池化层。
  • 使用双曲正切 Tanh 的激活函数。
  • 最后用 MLP 作为分类器。

2、AlexNet 模型

AlexNet 在 2012 年的 ImageNet 竞赛中以超过第二名 10.9 个百分点的绝对优势夺冠,自此,深度学习和卷积神经网络得到迅速发展。AlexNet 为 8 层深度网络,包含 5 层卷积层和 3 层全连接层,不计 LRN 层和池化层。

AlexNet 模型具有如下特点:

  • 由 5 层卷积层和 3 层 全连接层组成,输入图像为三通道,大小为 224×224 ,网络规模远大于 LeNet 。
  • 使用 ReLU 激活函数。
  • 使用 dropout 作为正则项,防止过拟合,提升模型鲁棒性。
  • 具备一些很好的训练技巧,包括数据增广、学习率策略、权重衰减 Weight Decay 等。

3、VGG 模型

Visual Geometry Group 可以看作升级版本的 AlexNet ,也是由卷积层和全连接层组成,且层数高达 16 或 19 层。

VGG 模型具有如下特点:

  • 更深的网络结构。网络层数由 AlexNet 的 8 层增至 16 或 19 层。更深的网络意味着更强大的网络能力,也意味着需要更强大的计算力,不过后来硬件发展也很快,显卡运算力也在快速增长,助推了深度学习的快速发展。
  • 模型中使用较小的 3×3 卷积核。两个 3×3 的感受野相当于一个 5×5,且参数量更少,之后的网络都基本遵循这个范式。

4、GoogLeNet 模型

虽然 VGG 模型增加了网络的深度,但当深度达到一定程度时,可能成为瓶颈。GoogLeNet 模型 则从另一个维度来增加网络能力,即让每个单元有许多层并行计算,使网络更宽。基本单元,Inception 模块 如图 6-30 所示。

GoogLeNet 模型架构如图 6-31 所示,包含多个 Inception 模块,且为了便于训练,还添加了两个辅助分类分支补充梯度。

GoogLeNet 模型具有如下特点:

  • 引入 Inception 模块,这是一种 Network In Network 网中网结构。通过网络的水平排布,可以用较浅的网络得到很好的模型能力,并进行多特征融合,同时更容易训练。另外,为了减少计算量,使用 1×1 卷积来对特征通道进行降维。Inception 模块堆叠起来就形成了 Inception 网络,而 GoogLeNet 就是一个精心设计的、性能良好的 Inception v1 网络 的实例。
  • 采用全局平均池化层,将后面的全连接层全部替换为简单的全局平均池化层,最后的参数会变得更少,例如 AlexNet 中最后 3 层的全连接层参数差不多占总数的 90% ,GoogLeNet 的宽度和深度部分移除了全连接层,不会影响到结果的精度,在 ImageNet 竞赛中实现了 93.3 %的精度,且比 VGG 还快。不过,网络太深无法很好训练的问题始终没有得到解决,直到 ResNet 提出了 残差链接

5、ResNet 模型

何恺明在 2015 年推出的 ResNet 模型在 ISLVRC 和 COCO 上超越其他模型,获得冠军。ResNet 在网络结构上做出创新,即采用残差网络结构,而不再简单地堆积层数,为卷积神经网络提供了新思路。残差网络的核心思想:输出的是两个连续的卷积层,并且输入下一层。ResNet 残差网络结构如图 6-32 所示。

通过引入残差、恒等映射 indentity mapping ,相当于一个梯度高速通道,使训练更简洁,且避免了梯度消失问题,所以可以得到更深的网络,如网络层数由 GoogLeNet 的 22 层发展到 ResNet 的 152 层。

ResNet 模型具有如下特点:

  • 层数非常深,已经超过百层。
  • 引入残差单元来解决退化问题。

6、DenseNet 模型

ResNet 模型极大地改变了参数化深层网络中函数的方式,DenseNet 稠密网络在某种程度上可以说是 ResNet 的逻辑扩展,其每一层的特征图是后面所有层的输入。DenseNet 网络结构如图 6-34 所示。

ResNet 模型和 DenseNet 模型的主要区别在于,DenseNet 的输出是连接,而不是 ResNet 的简单相加。

DenseNet 模型主要由两部分构成:稠密块 Dense Block 和 过渡层 Transition Layer 。前者定义如何连接输入和输出,后者控制通道数量、特征图的大小等,使其不会太复杂。图 6-36 是几种典型的稠密网络结构。

DenseNet 模型的主要创新点如下:

  • 相较于 ResNet 模型,DenseNet 拥有更少的参数数量。
  • 旁路加强了特征的重用。
  • 网络更易于训练,并且具有一定正则效果。
  • 缓解了梯度消失 Gradient Vanishing 和模型退化 Model Degradation 的问题。

7、CapsNet 模型

Hinton 及其团队在 2017 年底提出了全新的神经网络,即胶囊网络 CapsNet 模型。胶囊网络克服了卷积神经网络的一些不足:

  1. 训练卷积神经网络一般需要较大数据量,而胶囊网络使用较少数据就能泛化。
  2. 卷积神经网络因池化层、全连接层等丢失大量的信息,从而降低了空间位置的分辨率,而胶囊网络能将很多细节的姿态信息,如对象的准确位置、旋转、厚度、倾斜度、尺寸等,保存在网络中,从而有效避免嘴巴和眼睛倒挂也被认为是人脸的错误。
  3. 卷积神经网络不能很好地应对模糊性,但胶囊网络可以,因此胶囊网络在非常拥挤的场景也能表现得很好。

如图 6-37 所示,CapsNet 网络架构由两个卷积层和一个全连接层组成,其中,第一个卷积层为一般的卷积层,第二个卷积层相当于为 Capsule 层做准备,并且该层的输出为向量,所以它的维度要比一般的卷积层再高一个维度。最后就是通过向量的输入与路由过程等构建 10 个向量,每一个向量的长度都直接表示某个类别的概率。

CapsNet 模型具有如下特点:

  • 神经元输出为向量。每个胶囊给出的输出是一组向量,而不是传统人工神经元那样的单独数值(权重)。
  • 采用动态路由机制。为了解决这组向量向哪一个更高层的神经元传输的问题,就需要动态路由 Dynamic Routing 机制,而这就是胶囊神经网络的一大创新点。动态路由使胶囊神经网络可以识别图形中的多个图形,这是 CNN 所不能的。

说明:虽然 CapsNet 在简单的数据集 MNIST 上表现出了很好的性能,但是在更复杂的数据集如 ImageNet、CIFAR10上,却没有这种表现。这是因为在图像中发现的信息过多会使胶囊脱落。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2022CSP-S易错题解析

21.B i的取值分别是0、5、6、7、8、13,其中i5时,j运行3次;i6时,j运行2次;i7时,j运行1次;i13时,j运行4次。共10次。 25.D 第1次执行时,数字是按照三进制下的最低位从小到…

【C++】——string类

前言 在C语言里面我们用的字符串都是以\0结尾的字符合集,为了操作方便所以在c中推出了stirng类 一 string介绍 1.string是表示字符串的字符串类 2.因为是类,所以他会有一些常用的接口,同时也添加了专门用来操作string的常规操作 3.string…

什么是$t?$t的介绍及使用

目录 $t介绍&#xff1a; 作用&#xff1a; 安装国际化插件&#xff1a; 创建国际化资源文件 配置 vue-i18n &#xff1a; 切换语言&#xff1a; 下面为中文和英文状态下的效果&#xff1a; 如下面所示&#xff0c;这是一段前端代码&#xff1a; <el-form-item :label…

基于短时傅里叶变换域的一维信号邻域降噪方法(MATLAB)

基于傅里叶变换的信号频域表示及能量频域分布揭示了信号在频域的特征&#xff0c;但傅里叶变换是一种整体变换&#xff0c;只能了解信号的全局特性&#xff0c;不能有效检测信号频率随时间的变化情况。只有把时域和频域结合起来才能更好地反映非平稳信号的特征。时频分析的基本…

Redis 的主从复制

Redis 的主从复制 1、主从复制的实现2、主从复制的同步功能(PSYNC)2.1、部分重同步 本文讲解的Redis 主从复制机制&#xff0c;是基于 2.8及以后的版本而言&#xff0c;2.8以前的版本主从复制机制与此有所不同&#xff0c;请知悉。 Redis的复制功能分为 同步 (psync) 和 命令传…

远程点击没反应

目录 todesk远程登录后点击没反应 解决方法&#xff1a; 方法1 快捷键&#xff1a; 方法2 界面点击Ctrl Alt Delete todesk&#xff0c;向日葵远程登录后点击没反应 todesk远程登录后点击没反应 解决方法&#xff1a; 方法1 快捷键&#xff1a; Ctrl Alt Delete 方法…

【Python从入门到进阶】54、使用Python轻松操作SQLite数据库

一、引言 1、什么是SQLite SQLite的起源可以追溯到2000年&#xff0c;由D. Richard Hipp&#xff08;理查德希普&#xff09;所创建。作为一个独立的开发者&#xff0c;Hipp在寻找一个能够在嵌入式系统中使用的轻量级数据库时&#xff0c;发现现有的解决方案要么过于庞大&…

DML操作表的数据

一、增加数据 语法&#xff1a; INSERT [INTO] 表名 [( 列名表 )] VALUES ( 值列表 ) 1.1 插入全部字段 l 所有的字段名都写出来 INSERT INTO 表名 (字段名1, 字段名2, 字段名3…) VALUES (值1, 值2, 值3); l 不写字段名 INSERT INTO 表名 VALUES (值1, 值2, 值3…); 注&…

吴恩达机器学习笔记:第 9 周-16推荐系统(Recommender Systems) 16.5-16.6

目录 第 9 周 16、 推荐系统(Recommender Systems)16.5 向量化&#xff1a;低秩矩阵分解16.6 推行工作上的细节&#xff1a;均值归一化 第 9 周 16、 推荐系统(Recommender Systems) 16.5 向量化&#xff1a;低秩矩阵分解 在上几节视频中&#xff0c;我们谈到了协同过滤算法&…

Unity VR在编辑器下开启Quest3透视(PassThrough)功能

现在有个需求是PC端串流在某些特定时候需要开启透视。我研究了两天发现一些坑,记录一下方便查阅,也给没踩坑的朋友一些思路方案。 先说结论,如果要打PC端或者在Unity编辑器中开启,那么OpenXR当前是不行的可能还需要一个长期的过程,必须需要切换到Oculus。当然Unity官方指…

胆子真大,敢搞B站

今天给大家分享一款浏览器插件&#xff0c;能让你的B站在电脑端访问时候会更高级 作者已经开源到Github Star数量还在持续上升中 来看下这款插件究竟具备哪些功能 首先是开启首页干净模式&#xff0c;也就是去除大屏 正常情况我们访问B站是这个样子的~ 开启总开关后 首页的视…

SM4-GCM Library代码示例

sm4-gcm加密解密测试代码: fn main() {let key Sm4Key([0u8; 16]);let nonce [0u8; 12];let plaintext b"Hello World!";let ciphertext sm4_gcm::sm4_gcm_encrypt(&key, &nonce, plaintext);println!("Encrypted: {}", hex::encode(&cip…

K-AI01,K-AO01,K-BUS02和利时

K-AI01,K-AO01,K-BUS02和利时1.将工程师站的计算机开机&#xff1b;2.开机后鼠标双击桌面上的“maintenance tool”图标&#xff0c;K-AI01,K-AO01,K-BUS02和利时。出现如下图标&#xff1a; 按顺序点击”图标中的箭头所指的按钮&#xff0c;出现如下画面选中画面中需要强制的逻…

MybatisPlus入门用法

目录 1.引入依赖 2.继承BaseMapper 常见注解 常见配置 1.引入依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version></dependency> 2.继承Bas…

next水和错误

产生原因 应该是和预渲染有关&#xff0c;官方也有谈到 水和错误主要原因 这个主要事服务器端渲染和客户端渲染结果不一致&#xff0c;客户端再渲染导致的错误&#xff0c;主要结果就是耗费性能&#xff0c;当然也可以关闭提示错误 具体解决措施可以看看官方文档参考 相关的…

ACE框架学习4

目录 ACE Proactor框架 异步I/O工厂类 ACE_Handler类 前摄式Acceptor-Connector类 ACE_Proactor类 ACE Streams框架 ACE_Model类 ACE_Streams类 ACE Proactor框架 ACE Proactor框架实现了proactor模式&#xff0c;也就是异步网络模式&#xff0c;允许事件驱动…

C++内存管理(2)+模版初阶

目录 1.内存的划分 2.内存泄漏 3.模版初阶 &#xff08;1&#xff09;模版的引入 &#xff08;2&#xff09;函数模版 &#xff08;3&#xff09;类模版 &#xff08;4&#xff09;类型的不匹配问题 1.内存的划分 &#xff08;1&#xff09;C里面&#xff0c;把内存划分为…

漫谈ApplicationContext和BeanFactory的区别

各位大佬光临寒舍&#xff0c;希望各位能赏脸给个三连&#xff0c;谢谢各位大佬了&#xff01;&#xff01;&#xff01; 目录 1.背景介绍 2.细述ApplicationContext和BeanFactory 3.总结 1.背景介绍 当我们使用SpringBoot创建项目的时候会看到一串代码&#xff1a…

全面理解BDD(行为驱动开发):转变思维方式,提升软件质量

在传统的软件开发流程中&#xff0c;开发人员和测试人员的工作通常是相互独立的。开发人员负责编写代码&#xff0c;测试人员负责找出代码中的问题。然而&#xff0c;这种方法可能导致沟通不足&#xff0c;而且会浪费时间和资源。为了解决这些问题&#xff0c;出现了一种新的开…

Linux cmake 初窥【3】

1.开发背景 基于上一篇的基础上&#xff0c;已经实现了多个源文件路径调用&#xff0c;但是没有库的实现 2.开发需求 基于 cmake 的动态库和静态库的调用 3.开发环境 ubuntu 20.04 cmake-3.23.1 4.实现步骤 4.1 准备源码文件 基于上个试验的基础上&#xff0c;增加了动态库…