【PyTorch单点知识】深入了解 nn.ModuleList和 nn.ParameterList模块:灵活构建动态网络结构
文章目录
- 0. 前言
- 1. 为什么需要 `nn.ModuleList` 和 `nn.ParameterList`?
- 2. `nn.ModuleList`:管理模块的列表
- 2.1 什么是 `nn.ModuleList`?
- 2.2 创建 `nn.ModuleList`
- 2.3 动态添加或删除层
- 3. `nn.ParameterList`:管理参数列表
- 3.1 什么是 `nn.ParameterList`?
- 3.2 创建 `nn.ParameterList`
- 3.3 动态添加或删除参数
- 4. 自适应模型
- 5. 总结
0. 前言
按照国际惯例,首先声明:本文只是我自己学习的理解,虽然参考了他人的宝贵见解及成果,但是内容可能存在不准确的地方。如果发现文中错误,希望批评指正,共同进步。
在 PyTorch 中,nn.ModuleList
和 nn.ParameterList
是两种非常有用的工具,可以让你以更加灵活的方式构建和管理动态网络结构。这两种列表允许你在构建模型时轻松地添加或删除层,这对于构建自适应模型、循环网络或其他需要动态调整结构的场景非常有用。
本文将详细介绍这两个类的使用方法及其应用场景,帮助你更好地理解和运用它们来构建复杂和灵活的神经网络模型。
1. 为什么需要 nn.ModuleList
和 nn.ParameterList
?
在构建深度学习模型时,我们经常需要创建包含多个层的网络。传统的做法是显式地定义每一层,但这在某些情况下可能不够灵活。例如,当你需要根据输入数据动态决定网络结构时,就需要一种更加灵活的方式来组织和管理这些层。
nn.ModuleList
和 nn.ParameterList
提供了这样的灵活性。它们允许你将多个层或参数集合组织在一起,并且可以方便地在运行时增加、删除或修改这些层或参数。
2. nn.ModuleList
:管理模块的列表
2.1 什么是 nn.ModuleList
?
nn.ModuleList
是一个包含 nn.Module
子类实例的有序列表。它可以用于管理一个模型中的多个层,而且这些层可以是任意类型的 nn.Module
对象。
2.2 创建 nn.ModuleList
要创建一个 nn.ModuleList
,你可以简单地将 nn.Module
的实例作为一个列表传递给构造函数。例如:
import torch.nn as nnclass MyModel(nn.Module):def __init__(self):super(MyModel, self).__init__()self.layers = nn.ModuleList([nn.Linear(10, 10) for _ in range(5)])def forward(self, x):for layer in self.layers:x = layer(x)return xM = MyModel()
print(M)
输出为:
MyModel((layers): ModuleList((0-4): 5 x Linear(in_features=10, out_features=10, bias=True))
)
在这个例子中,MyModel
包含了一个由五个 nn.Linear
层组成的 ModuleList
。每个层都将输入的维度从 10 映射到 10。
2.3 动态添加或删除层
nn.ModuleList
支持像 Python 列表那样的索引操作,因此可以轻松地添加、删除或替换其中的层:
import torch.nn as nnclass MyModel(nn.Module):def __init__(self):super(MyModel, self).__init__()self.layers = nn.ModuleList([nn.Linear(10, 10) for _ in range(5)])def forward(self, x):for layer in self.layers:x = layer(x)return xM = MyModel()M.layers.append(nn.Conv2d(in_channels=1,out_channels=3,kernel_size=3))
print(M.layers[5])
输出为:
Conv2d(1, 3, kernel_size=(3, 3), stride=(1, 1))
3. nn.ParameterList
:管理参数列表
3.1 什么是 nn.ParameterList
?
nn.ParameterList
类似于 nn.ModuleList
,但它用于管理一组 nn.Parameter
对象。这些参数可以是权重矩阵、偏置向量等。
3.2 创建 nn.ParameterList
要创建一个 nn.ParameterList
,你可以将 nn.Parameter
对象作为一个列表传递给构造函数:
import torch.nn as nn
import torchtorch.manual_seed(666)class MyModel(nn.Module):def __init__(self):super(MyModel, self).__init__()self.weights = nn.ParameterList([nn.Parameter(torch.randn(3, 3)) for _ in range(5)])def forward(self, x):for weight in self.weights:x = torch.mm(x, weight)return xM = MyModel()
print(M.weights)
print(M.weights[-1])
输出为:
ParameterList((0): Parameter containing: [torch.float32 of size 3x3](1): Parameter containing: [torch.float32 of size 3x3](2): Parameter containing: [torch.float32 of size 3x3](3): Parameter containing: [torch.float32 of size 3x3](4): Parameter containing: [torch.float32 of size 3x3]
)
Parameter containing:
tensor([[ 2.1743, -0.9672, -0.7672],[-0.5229, -2.2826, 0.1051],[-0.2497, -1.5241, 1.5813]], requires_grad=True)
在这个例子中,MyModel
包含了一个由五个随机权重矩阵组成的 ParameterList
。
3.3 动态添加或删除参数
nn.ParameterList
同样支持像 Python 列表那样的索引操作,因此你可以轻松地添加、删除或替换其中的参数:
import torch.nn as nn
import torchtorch.manual_seed(666)class MyModel(nn.Module):def __init__(self):super(MyModel, self).__init__()self.weights = nn.ParameterList([nn.Parameter(torch.randn(3, 3)) for _ in range(5)])def forward(self, x):for weight in self.weights:x = torch.mm(x, weight)return xM = MyModel()M.weights.append(torch.zeros(3,3))
print(M.weights)
print(M.weights[-1])
输出为:
ParameterList((0): Parameter containing: [torch.float32 of size 3x3](1): Parameter containing: [torch.float32 of size 3x3](2): Parameter containing: [torch.float32 of size 3x3](3): Parameter containing: [torch.float32 of size 3x3](4): Parameter containing: [torch.float32 of size 3x3](5): Parameter containing: [torch.float32 of size 3x3]
)
Parameter containing:
tensor([[0., 0., 0.],[0., 0., 0.],[0., 0., 0.]], requires_grad=True)
4. 自适应模型
比如构建一个模型,其中的某些层可以根据输入数据动态决定是否使用。你可以使用 nn.ModuleList
来存储这些层,并在 .forward()
方法中根据条件决定是否使用它们:
import torch.nn as nn
class AdaptiveModel(nn.Module):def __init__(self, num_layers):super(AdaptiveModel, self).__init__()self.layers = nn.ModuleList([nn.Linear(5, 5) for _ in range(num_layers)])def forward(self, x):use_layers = [True, False, True, True, False] # 示例:使用第0、2、3层for i, layer in enumerate(self.layers):if use_layers[i]:x = layer(x)return x
5. 总结
nn.ModuleList
和 nn.ParameterList
提供了一种灵活的方式来构建和管理动态网络结构。通过这些工具,可以轻松地构建自适应模型、循环网络或其他需要动态调整结构的场景。
相关文章:

【PyTorch单点知识】深入了解 nn.ModuleList和 nn.ParameterList模块:灵活构建动态网络结构
文章目录 0. 前言1. 为什么需要 nn.ModuleList 和 nn.ParameterList?2. nn.ModuleList:管理模块的列表2.1 什么是 nn.ModuleList?2.2 创建 nn.ModuleList2.3 动态添加或删除层 3. nn.ParameterList:管理参数列表3.1 什么是 nn.Par…...

vscode创建Python虚拟环境无法激活问题处理
系统环境 win7环境,Python3.7,VScode1.70.3 问题报错: PS C:\Users\Administrator\PycharmProjects\websites> .\venv\Scripts\activate 无法加载文件 C:\Users\Administrator\PycharmProjects\websites\venv\Scripts\Activate.ps1,因为在此系统中禁止执行脚本。有关…...

【Go】Go语言中的基本数据类型与类型转换
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...

【Python中导入Tkinter模块创建计算器界面】
使用Tkinter库创建计算器界面涉及布局多个控件(如按钮、输入框和标签)以形成一个用户友好的界面。以下是一个基本的步骤和示例代码,展示了如何使用Tkinter创建一个简单的计算器界面。 步骤 导入Tkinter库:首先,你需要…...

中关村科金推出得助音视频鸿蒙SDK,助力金融业务系统鸿蒙化提速
鸿蒙生态大势所趋,各种应用适配加速 近日,华为纯血鸿蒙系统(HarmonyOS NEXT)再度引发市场高度关注。据媒体消息,鸿蒙NEXT Beta版将在9月24日对Mate 60系列、X5系列、Pura70系列等16款旗舰机型进行推送,这已…...

如何实现视频数据的PES打包和传输?
实现视频的PES(Packetized Elementary Stream)打包和传输涉及多个步骤,主要包括视频数据的编码、PES打包、以及通过网络协议的传输。以下是大概的实现思路: 一、视频数据编码 原始视频数据获取: 获取需要传输的原始视…...

【软考】程序设计语言基础
【软考】程序设计语言基础 一.程序设计语言基础概念 计算机要通过程序或指令来控制才能完成各种任务。程序设计语言(计算机语言):人与机器交换信息的语言。 1.程序设计语言 计算机语言大致分为机器语言、汇编语言和高级语言三种。机器语言…...

野指针与空指针的异同
1、什么是野指针 在了解什么是野指针之前我们要知道什么是指针即指针的定义是什么。 指针:是一种特殊的变量类型,它存储的是一个内存地址,该地址指向另一个变量的位置。可以通过指针来间接访问和修改该地址所指向的变量的值。 PSÿ…...

虚拟存储器“大观”,讲解核心逻辑知识和408大题方法
虚拟存储器 写在前面:虚拟存储器(Virtual Memory)是计算机系统中用于管理内存的一种技术,它通过虚拟地址空间为进程提供比物理内存更大的地址空间,同时实现内存保护和进程隔离。 在408整个体系中计组和操作系统都有涉…...

【AI赋能医学】基于深度学习和HRV特征的多类别心电图分类
一、数据集简介 论文中使用了来自三类不同心电图记录的162条数据,这些数据来自三个公开的数据库: MIT-BIH 心律失常数据库 (ARR) 96条记录,主要包含不同类型的心律失常样本。 MIT-BIH 正常窦性心律数据库 (NSR) 36条记录,包含健…...

速盾:做外贸用高防cdn需要国外节点的吗?
在进行外贸业务时,使用高防CDN(Content Delivery Network)可以带来很多好处,如提高网站的访问速度、降低服务器负载、保护网站安全等。然而,是否需要国外节点的高防CDN则取决于具体的需求和情况。 高防CDN是通过在全球…...

单片机中为什么要使用5v转3.3v,不直接使用3.3V电压
5V和3.3V是常见的电压水平,在技术上都有其特定的应用场景。为了保护电路、提升效能和确保系统的稳定运行,经常需要将5V转换为3.3V。 1.为什么要5V来供电 使用5V是因为部分传感器需要5V的供电,并且我们数据线一般都输出5V电压,而…...

SpringBoot项目请求返回json空字段过滤
接口返回的json中有的字段可能是为空的,我们不希望他为空的还返回,如下例子: 解决方案:只需要加一个配置类就行: import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.Dese…...

linux下进程详解
在 Linux 系统中,进程是计算机执行程序的基本单位。理解进程的概念和管理方法对系统管理员和开发者都非常重要。下面是对 Linux 下进程的详细介绍: 进程的基本概念 进程:进程是程序在计算机上执行的一个实例。每个进程都有自己独立的内存空间…...

春招审核流程优化:Spring Boot系统设计
1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理大学生入学审核系统的相关信息成为必然。开…...

QT:音视频播放器
目录 一.播放器设计 二.需要使用的控件 三.选择视频 四.播放视频 五.暂停视频 六.关闭视频 七.播放状态设置 八.切换视频(上一首) 九.切换视频(下一首) 十.设置视频滑块 十一.更新滑块显示 十二.实现效果 十三.代码设计 1.mainwindow.h 2.mainwindow.cpp 一.播放…...

大模型入门 ch 03:注意力机制
本文是github上的大模型教程LLMs-from-scratch的学习笔记,教程地址:教程链接 Chapter 3: Attention Mechanism 本文首先从固定参数的注意力机制说起,然后拓展到可以训练的注意力机制,然后加入掩码mask,最后…...

STM32点亮第一个LED
还有第二个,并轮换。 准备入门STM32,于是拿出了买到手至少2年的洋桃M1板子,STM32F103C8T6 配置有3个LED,3个按钮,RS232,RS485,CAN,有JTAG,有RTC电池,IO口引…...

[Linux]:动静态库
✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:Linux学习 贝蒂的主页:Betty’s blog 1. 动静态库的介绍 一般而言,库分为动态库和静态库。 在Linux当中…...

windows 显示进程地址空间
windows 显示进程地址空间 windows 显示进程地址空间 文章目录 windows 显示进程地址空间显示进程地址空间 显示进程地址空间 /* 3-ProcessInfo.cpp 显示进程地址空间 */#include "..\\CommonFiles\\CmnHdr.h" #include "..\\CommonFiles\\Toolhelp.h"#i…...

Android 12 SystemUI下拉状态栏禁止QuickQSPanel展开
1.概述 遇到需求,QuickQSPanel首次下拉后展示快捷功能模块以后就是显示QuickQSPanel,而不展开QSPanel,接下来要从下滑手势下拉出状态栏分析功能实现。也就是直接是展开状态。 2、涉及核心类 frameworks\base\packages\SystemUI\src\com\and…...

二分思想与相关问题(下)
接下来详细讲解几道比较难的例题,仔细体会二分和其他概念混合在一起的趣味。 下面这道题涉及了“碎片拼接”的概念,很妙,也很难想。 P r o b l e m 5 Problem5 Problem5 同时运行N台电脑的最长时间 LeetCode2141 你有 n 台电脑。给你整数 n…...

【算法专题】搜索算法
二叉树剪枝 LCR 047. 二叉树剪枝 - 力扣(LeetCode) 本题要求我们将全部为0的二叉树去掉,也就是剪枝,当我们举一个具体的例子进行模拟时,会发现,只关注于对其中一个子树的根节点进行剪枝,由于我…...

B2064 斐波那契数列
题目描述 斐波那契数列是指这样的数列:数列的第一个和第二个数都为 11,接下来每个数都等于前面 22 个数之和。 给出一个正整数 aa,要求斐波那契数列中第 aa 个数是多少。 输入格式 第 11 行是测试数据的组数 nn,后面跟着 nn 行…...

Spark的介绍
一、分布式的思想 不管是数据也好,计算也好,都没有最大的电脑,而是多个小电脑组合而成。 存储:将3T的文件拆分成若干个小文件,例如每500M一个小文件,将这些小文件存储在不同的机器上 。 -- HDFS 计算&#…...

SpringBoot项目是如何启动
启动步骤 概念 运行main方法,初始化SpringApplication 从spring.factories读取listener ApplicationContentInitializer运行run方法读取环境变量,配置信息创建SpringApplication上下文预初始化上下文,将启动类作为配置类进行读取调用 refres…...

科技之光,照亮未来之路“2024南京国际人工智能展会”
全球科技产业的版图正以前所未有的速度重构,而位于中国东部沿海经济带的江浙沪地区,作为科技创新与产业升级的高地,始终站在这一浪潮的最前沿。2024年,这一区域的科技盛宴——“2024南京人工智能展会”即将在南京国际博览中心盛大…...

在深度学习计算机视觉的语义分割中,Boundary和Edge的区别是?
在深度学习中的计算机视觉任务中,语义分割中的 Boundary 和 Edge 其实有一些相似之处,但它们的定义和使用场景略有不同。下面是两者的区别: 1. Boundary(边界) 定义:Boundary 是指一个对象或区域的边界&a…...

【JAVA入门】Day41 - 字节缓冲流和字符缓冲流
【JAVA入门】Day41 - 字节缓冲流和字符缓冲流 文章目录 【JAVA入门】Day41 - 字节缓冲流和字符缓冲流一、缓冲流的体系结构二、字节缓冲流2.1 字节缓冲流提高效率的底层原理 三、字符缓冲流 在IO流体系中,FileInputStream,FileOutputStream,F…...

collocate join,bucket join,broadcast join,shuffle join对比分析
在分布式计算和大数据处理中,尤其是在使用像 Apache Spark、Hive 等大数据处理框架时,Join 操作是非常常见的。根据数据分布方式和执行机制,Join 操作可以分为不同的类型,如 Collocate Join、Bucket Join、Broadcast Join 和 Shuffle Join。以下是它们的详细对比分析: 1.…...