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

动手学深度学习7.3 网络中的网络(NiN)-笔记练习(PyTorch)

以下内容为结合李沐老师的课程和教材补充的学习笔记,以及对课后练习的一些思考,自留回顾,也供同学之人交流参考。

本节课程地址:26 网络中的网络 NiN【动手学深度学习v2】_哔哩哔哩_bilibili

本节教材地址:7.3. 网络中的网络(NiN) — 动手学深度学习 2.0.0 documentation (d2l.ai)

本节开源代码:...>d2l-zh>pytorch>chapter_multilayer-perceptrons>nin.ipynb


网络中的网络(NiN)

LeNet、AlexNet和VGG都有一个共同的设计模式:通过一系列的卷积层与汇聚层来提取空间结构特征;然后通过全连接层对特征的表征进行处理。 AlexNet和VGG对LeNet的改进主要在于如何扩大和加深这两个模块。 或者,可以想象在这个过程的早期使用全连接层。然而,如果使用了全连接层,可能会完全放弃表征的空间结构。 网络中的网络NiN)提供了一个非常简单的解决方案:在每个像素的通道上分别使用多层感知机 (href="https://zh.d2l.ai/chapter_references/zreferences.html#id93">Linet al., 2013)。

(NiN块)

回想一下,卷积层的输入和输出由四维张量组成,张量的每个轴分别对应样本、通道、高度和宽度。 另外,全连接层的输入和输出通常是分别对应于样本和特征的二维张量。 NiN的想法是在每个像素位置(针对每个高度和宽度)应用一个全连接层。 如果我们将权重连接到每个空间位置,我们可以将其视为 1×1 卷积层(如6.4节 中所述),或作为在每个像素位置上独立作用的全连接层。 从另一个角度看,即将空间维度中的每个像素视为单个样本,将通道维度视为不同特征(feature)。

图7.3.1 说明了VGG和NiN及它们的块之间主要架构差异。 NiN块以一个普通卷积层开始,后面是两个1×1 的卷积层。这两个 1×1 卷积层充当带有ReLU激活函数的逐像素全连接层。 第一层的卷积窗口形状通常由用户设置。 随后的卷积窗口形状固定为 1×1。

7.3.1 对比 VGG 和 NiN 及它们的块之间主要架构差异。

import torch
from torch import nn
from d2l import torch as d2ldef nin_block(in_channels, out_channels, kernel_size, strides, padding):return nn.Sequential(nn.Conv2d(in_channels, out_channels, kernel_size, strides, padding),nn.ReLU(),nn.Conv2d(out_channels, out_channels, kernel_size=1), nn.ReLU(),nn.Conv2d(out_channels, out_channels, kernel_size=1), nn.ReLU())

[NiN模型]

最初的NiN网络是在AlexNet后不久提出的,显然从中得到了一些启示。 NiN使用窗口形状为 11×11 、 5×5 和 3×3 的卷积层,输出通道数量与AlexNet中的相同。 每个NiN块后有一个最大汇聚层,汇聚窗口形状为3×3,步幅为2。

NiN和AlexNet之间的一个显著区别是NiN完全取消了全连接层。 相反,NiN使用一个NiN块,其输出通道数等于标签类别的数量。最后放一个全局平均汇聚层(global average pooling layer),生成一个对数几率 (logits)。NiN设计的一个优点是,它显著减少了模型所需参数的数量。然而,在实践中,这种设计有时会增加训练模型的时间。

net = nn.Sequential(nin_block(1, 96, kernel_size=11, strides=4, padding=0),nn.MaxPool2d(3, stride=2),nin_block(96, 256, kernel_size=5, strides=1, padding=2),nn.MaxPool2d(3, stride=2),nin_block(256, 384, kernel_size=3, strides=1, padding=1),nn.MaxPool2d(3, stride=2),nn.Dropout(0.5),# 标签类别数是10nin_block(384, 10, kernel_size=3, strides=1, padding=1),nn.AdaptiveAvgPool2d((1, 1)),# 将四维的输出转成二维的输出,其形状为(批量大小,10)nn.Flatten())

我们创建一个数据样本来[查看每个块的输出形状]。

X = torch.rand(size=(1, 1, 224, 224))
for layer in net:X = layer(X)print(layer.__class__.__name__,'output shape:\t', X.shape)

输出结果:
Sequential output shape: torch.Size([1, 96, 54, 54])
MaxPool2d output shape: torch.Size([1, 96, 26, 26])
Sequential output shape: torch.Size([1, 256, 26, 26])
MaxPool2d output shape: torch.Size([1, 256, 12, 12])
Sequential output shape: torch.Size([1, 384, 12, 12])
MaxPool2d output shape: torch.Size([1, 384, 5, 5])
Dropout output shape: torch.Size([1, 384, 5, 5])
Sequential output shape: torch.Size([1, 10, 5, 5])
AdaptiveAvgPool2d output shape: torch.Size([1, 10, 1, 1])
Flatten output shape: torch.Size([1, 10])

[训练模型]

和以前一样,我们使用Fashion-MNIST来训练模型。训练NiN与训练AlexNet、VGG时相似。

lr, num_epochs, batch_size = 0.1, 10, 128
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, resize=224)
d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())

输出结果:
loss 0.352, train acc 0.871, test acc 0.874
1721.5 examples/sec on cuda:0

小结

  • NiN使用由一个卷积层和多个 1×1 卷积层组成的块。该块可以在卷积神经网络中使用,以允许更多的每像素非线性。
  • NiN去除了容易造成过拟合的全连接层,将它们替换为全局平均汇聚层(即在所有位置上进行求和)。该汇聚层通道数量为所需的输出数量(例如,Fashion-MNIST的输出为10)。
  • 移除全连接层可减少过拟合,同时显著减少NiN的参数。
  • NiN的设计影响了许多后续卷积神经网络的设计。

练习

  1. 调整NiN的超参数,以提高分类准确性。

解:
代码如下:

lr, num_epochs, batch_size = 0.05, 20, 128
d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())

输出结果:
loss 0.281, train acc 0.896, test acc 0.885
1719.9 examples/sec on cuda:0

2. 为什么NiN块中有两个 1×1 卷积层?删除其中一个,然后观察和分析实验现象。

解:
第一个 
1×1 卷积层作用是降维:用于减少特征图的通道数,从而降低网络的参数数量和计算复杂度,有助于防止过拟合,并使网络更加高效。
第二个 
1×1 卷积层作用是增加网络深度和像素的非线性性:对第一个卷积层的输出进行非线性变换,有助于网络学习更复杂的特征表示。通过这种方式,网络可以在保持参数数量相对较低的同时,增加其表达能力。
同时,
1×1 卷积层可以融合每个像素点不同通道的特征,因此也具有特征融合的作用。
删除其中一个 
1×1 卷积层后,训练损失略上升,训练和测试精度略下降,可能导致网络学习特征能力下降、非线性性降低,从而导致精度略下降。

def nin_block(in_channels, out_channels, kernel_size, strides, padding):return nn.Sequential(nn.Conv2d(in_channels, out_channels, kernel_size, strides, padding),nn.ReLU(),nn.Conv2d(out_channels, out_channels, kernel_size=1), nn.ReLU())
lr, num_epochs, batch_size = 0.1, 10, 128
d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())

输出结果:
loss 0.360, train acc 0.867, test acc 0.869
2208.1 examples/sec on cuda:0

3. 计算NiN的资源使用情况。

1)参数的数量是多少?

2)计算量是多少?

3)训练期间需要多少显存?

4)预测期间需要多少显存?

解:
计算过程如下:

对于一张图(1, 224, 224)而言:
1)参数的数量为:1.92 MB;
2)计算量为:1.55 GB;
3)训练期间的显存为参数占用显存+模型占用显存:
参数占用显存:1.92 * 4 * 2 = 15.38 MB (float32占4 bytes,1 for params, 1 for SGD)
模型占用显存:6.35 * 4 * 2 = 50.80 MB (float32占4 bytes,1 for forward, 1 for backward)
总占用显存:15.38 + 50.80 = 66.18 MB
4)预测期间的显存为参数占用显存+模型占用显存:
参数占用显存:1.92 * 4 = 7.69 MB (float32占4 bytes,only for params)
模型占用显存:6.35 * 4 = 25.40 MB (float32占4 bytes,only for forward)
总占用显存:7.69 + 25.40 = 33.09 MB

4. 一次性直接将 384×5×5 的表示缩减为 10×5×5 的表示,会存在哪些问题?
解:
一次性直接将 384×5×5 的表示缩减为 10×5×5 的表示,即不经过两个 1×1 卷积层降维,可能存在的问题有:
1)可能会丢失大量的信息。
2)可能过拟合增大:当特征维度降低太多时,网络可能无法捕捉到足够的特征来泛化到新的数据上。
3)可能学习能力下降:大幅度降低特征维度会限制网络的学习能力,使其难以学习复杂的函数映射。
4)可能破坏特征融合:不同层的特征图会通过 1 \times 1 卷积层进行融合,以提取更加抽象的特征。如果直接大幅度减少特征维度,可能会破坏这种特征融合的过程,影响网络性能。
5)可能会导致梯度消失或梯度爆炸。

相关文章:

动手学深度学习7.3 网络中的网络(NiN)-笔记练习(PyTorch)

以下内容为结合李沐老师的课程和教材补充的学习笔记,以及对课后练习的一些思考,自留回顾,也供同学之人交流参考。 本节课程地址:26 网络中的网络 NiN【动手学深度学习v2】_哔哩哔哩_bilibili 本节教材地址:7.3. 网络…...

SQL语言-select的使用方法

select语法的使用(SQLyog) 设定查询结果返回的行数 #设定查询结果返回的行数,需要使用limit,指定返回的行数 #格式:select 列名 from 表名 limit n; #n代表限定的行数 SELECT stu_name FROM student LIMIT 3;#格式&a…...

深入理解Python中的排序算法:快速排序与归并排序实现

深入理解Python中的排序算法:快速排序与归并排序实现 排序是计算机科学中一个基本而重要的操作,几乎在所有的编程任务中都会遇到。Python提供了内置的排序函数,但了解排序算法的实现原理对于提升编程能力和解决问题的能力至关重要。本文将深入探讨两种经典的排序算法:快速…...

Linux基础命令 ② 未完成

linux系统目录结构 解释 bin: 包含基本的可执行二进制文件,供所有用户使用。 boot: 存储操作系统启动所需的关键文件,如内核和初始化 RAM 磁盘(initramfs)。 dev: 包含设备节点,表示物理设备或虚拟设备。 etc: 存储…...

怎么加密文件?分享文件加密四个方法,2024新版操作教程,教你搞定!

数据的安全性与隐私保护显得尤为重要。 无论是个人敏感信息、企业商业机密还是创意作品,文件加密都是保障其不被未授权访问的重要手段。 本文将为您详细介绍四种文件加密方法,并附上2024年新版操作教程,助您轻松搞定文件加密,守护…...

cesium加载魔方立方体

cesium加载多个小立方体&#xff0c;组合拼成一个大立方体。 地理坐标拼合的大立方体有错位问题。必须进行坐标转换。 <template><div class"map"><div id"mapContainer" ref"mapContainer" class"map-container">&…...

unity 粒子系统学习

差不多了解了基本的ui面板&#xff0c;学一下粒子系统 取消轮廓线 这样粒子biubiu的时候就没有橙黄色的轮廓线了 三个子模块概念...

CogVideoX环境搭建推理测试

引子 智谱AI版Sora开源&#xff0c;首个可商用&#xff0c;18G显存即可运行。前文写了Open-Sora1.2的博文&#xff0c;感兴趣的童鞋请移步&#xff08;Open-Sora1.2环境搭建&推理测试_open sora 1.2-CSDN博客&#xff09;。对于这种占用资源少&#xff0c;且效果不错的多模…...

STL—容器—list【list的介绍和基本使用】【list的迭代器失效问题】

STL—容器—list list的使用并不难&#xff0c;有了之前使用string和vector的基础后&#xff0c;学习起来并不难。因此这里不在详细的讲解如何使用&#xff0c;而是大致的将其基本接口都熟悉一下 1.list介绍 list的文档介绍 list是可以在常数范围内在任意位置进行插入和删除…...

【面试宝典】MySQL 面试问题

一、MySQL 中有哪几种锁&#xff1f; MySQL中的锁机制是数据库并发控制的重要组成部分&#xff0c;它用于管理多个用户对数据库资源的访问&#xff0c;确保数据的一致性和完整性。MySQL中的锁可以根据不同的分类标准进行分类&#xff0c;以下是一些常见的分类方式及对应的锁类…...

【Cpp筑基】三、对象和类

【Cpp筑基】三、对象和类 Cpp系列笔记目录 【Cpp筑基】一、内联函数、引用变量、函数重载、函数模板 【Cpp筑基】二、声明 vs 定义、头文件、存储持续性作用域和链接性、名称空间 【Cpp筑基】三、对象和类 【Cpp筑基】四、重载运算符、友元、类的转换函数 【Cpp筑基】五、类的继…...

数据库原理面试-核心概念-问题理解

目录 1.数据库、数据库系统与数据库管理系统 2.理解数据独立性 3.数据模型 4.模式、外模式和内模式 5.关系和关系数据库 6.主键与外键 7.SQL语言 8.索引与视图 9.数据库安全 10.数据库完整性 11.数据依赖和函数依赖 12.范式&#xff1f;三范式&#xff1f;为什么要遵…...

【JavaScript】JavaScript里的“先斩后奏”之王 shift()方法

定义: JavaScript中 shift 方法用于删除数组的第一个元素,并返回该元素。注意,该方法会改变原数组! 解释: 成语解释: ‌先斩后奏是一个汉语成语,其拼音为xiān zhǎn hu zu。这个成语最早出自于汉‌班固的《‌汉书‌申屠嘉传》,原指先把罪犯处决,再向皇帝奏闻。在现代…...

Python面试宝典第32题:课程表

题目 你这个学期必须选修numCourses门课程&#xff0c;记为0到numCourses - 1。在选修某些课程之前&#xff0c;需要一些先修课程。先修课程按数组prerequisites给出&#xff0c;其中prerequisites[i] [ai, bi]&#xff0c;表示如果要学习课程ai&#xff0c;则必须先学习课程b…...

简单介绍BTC的Layer2项目RGB

这里写自定义目录标题 介绍&#xff08;历史背景&#xff0c;项目成员&#xff09;核心技术组成部分一次性密封条&#xff08;single-use-seals&#xff09;客户端验证&#xff08;client-side validation&#xff09; 总结 注&#xff1a;该内容不构成投资建议&#xff0c;有些…...

跨境电商卖家必看:搭建安全稳定测评自养号环境系统

对于卖家而言&#xff0c;测评作为一种低成本、高回报的推广策略&#xff0c;对于提升产品流量、转化率、优化关键词质量分及增强链接权重等方面均发挥着积极作用。以下是自养号优势及测评环境搭建技术要点 一、搭建安全稳定的测评环境系统 核心要点&#xff1a; 硬件参数去…...

如何对open62541.h/open62541.c的UA_Client进行状态(在线/掉线)监控

文章目录 背景解决方案注意事项 背景 目前在利用open62541.h/open62541.c编写了一个与PLC进行OPCUA通讯的上位机程序。 上位机这边会定时对PLC的某个opcua变量进行写操作。但是假如PLC离线或者说拔掉网线&#xff0c;上位机就会直接崩溃死机&#xff0c;并且报如下的错误&…...

高等数学 第九讲 一元函数积分学的应用

1. 一元函数积分学的应用 文章目录 1. 一元函数积分学的应用1. 几何应用1.1 用定积分表达和计算平面图形的面积1.2 用定积分表达和计算旋转体的体积1.2.1 微分法1.2.2 二重积分法1.2.3 古尔丁定理1.2.4 旋转体的体积公式总结 1.3 用定积分表达和计算函数的平均数1.4 其他几何应…...

django如何更新数据库字段并与数据库保持同步?

关键步骤&#xff1a; 第一步&#xff1a; 执行&#xff1a;python manage.py makemigrations 你的项目名称第二步&#xff1a;它会提示你选1还是2&#xff0c;这里因为添加字段&#xff0c;所以选1第三步&#xff1a;出现>>>这个&#xff0c;直接输入这个第四步&am…...

jenkins插件 SSH Publishers

Jenkins 是一个开源的自动化服务器&#xff0c;常用于持续集成和持续交付 (CI/CD)。以下是一些与 Jenkins 相关的 SSH 发布者及其功能&#xff1a; SSH 插件&#xff1a; 功能: 允许 Jenkins 通过 SSH 执行远程命令。用户可以配置 SSH 服务器&#xff0c;使用 SSH 密钥进行身份…...

基于MATLAB的三母线高斯-赛德尔潮流分析计算程序解析

MATLAB代码&#xff1a;基于MATLAB的三母线高斯赛德尔潮流分析计算 关键词&#xff1a;潮流计算 电力系统 高斯赛德尔迭代法 MATLAB 参考文献自制详细实验文档 仿真平台&#xff1a;MATLAB 主要内容&#xff1a;潮流计算是判断电力系统是否稳定的重要方法&#xff0c;通过最初赋…...

Shell脚本初级测试题

文章目录一、 填空题 (共10题)二、 选择题 (共10题&#xff0c;单选)以下是为Shell脚本初学者设计的20道练习题&#xff0c;涵盖填空和选择两种题型&#xff0c;所有题目均基于您提供的【文档内容】。一、 填空题 (共10题) Shell脚本是解释型程序&#xff0c;其本质是将需要执…...

从‘电池’到‘胡萝卜’:聊聊构建YOLO生活垃圾数据集时遇到的坑与收获

从‘电池’到‘胡萝卜’&#xff1a;构建YOLO生活垃圾数据集的实战思考 去年夏天&#xff0c;我在自家小区做垃圾分类志愿者时&#xff0c;发现一个有趣现象&#xff1a;居民们对"1号电池属于有害垃圾"这类规则记得很牢&#xff0c;但面对"半个胡萝卜该扔哪个桶…...

2026毕业论文降AI工具指南:实测4款高通过率方案

答辩前三天被通知AI率超标要重改的焦虑&#xff0c;我至今印象深刻。去年帮二十多位同专业学弟学妹调整过毕业论文的AI检测问题&#xff0c;整理出的实用经验今天全部分享给大家。 先说结论&#xff1a;SpeedAI科研小助手和思笔AI是我最推荐的两款。前者性价比极高且全平台适配…...

东莞初效过滤器厂家推荐

阳江初效过滤器生产厂家推荐在当今对空气质量要求日益提高的时代&#xff0c;初效过滤器在众多领域发挥着至关重要的作用。阳江地区对初效过滤器的需求也在不断增长&#xff0c;市场上生产厂家众多&#xff0c;而广州灵洁空气净化设备制造有限公司值得重点推荐。专业的技术实力…...

2026年五款新手热门电钢琴横向评测~电钢琴深度对比与选择建议

不少钢琴学习者熬过初期的热情期后&#xff0c;都会陷入一个怪圈&#xff0c;就是在练琴时长明明在增加&#xff0c;可实际演奏的声音却机械又僵硬&#xff0c;完全没了灵动质感。从核心逻辑来看&#xff0c;电钢琴从来不是单纯的电子产品&#xff0c;而是高精度传感系统与声学…...

RobotFramework自动化测试实战:从关键字设计到复杂循环处理

RobotFramework自动化测试实战&#xff1a;从关键字设计到复杂循环处理 在软件测试领域&#xff0c;自动化测试已经成为提升效率、保证质量的必备手段。而RobotFramework作为一款基于Python的开源自动化测试框架&#xff0c;凭借其关键字驱动的设计理念和高度可扩展性&#xf…...

Oracle到MySQL迁移必看:INSTR函数跨库兼容处理指南(附SQLServer替代方案)

Oracle到MySQL迁移实战&#xff1a;INSTR函数深度兼容方案与企业级案例解析 当企业面临数据库迁移需求时&#xff0c;函数兼容性往往是技术团队最头疼的问题之一。作为字符串处理的核心函数&#xff0c;INSTR在Oracle、MySQL和SQL Server三大主流数据库中存在显著差异。本文将深…...

普通人如何杀入AI赛道?(附岗位薪资与避坑指南)AI转行必看!

AI几乎成为了打工人的必修课。和大家交流过程中&#xff0c;最常见的一些问题&#xff1a;“现在转行AI还来得及吗&#xff1f;”、“我不懂代码&#xff0c;能做AI产品经理吗&#xff1f;”、“以及怎么转行做AI&#xff1f;”。 答案是&#xff1a;不仅来得及&#xff0c;而且…...

Kubernetes网络入门004篇【20260407】

文章目录 Kubernetes 网络入门完整版(深度扩容侧重基础知识) 一、学习K8s网络前必须掌握的Linux网络基础 1.1 Linux Network Namespace(网络命名空间) 1.2 Veth Pair(虚拟以太网设备对) 1.3 Linux Bridge(Linux网桥) 1.4 iptables 1.5 路由表 二、K8s网络基础核心概念与…...