PyTorch中nn.Module详解
直接print(dir(nn.Module)),得到如下内容:
一、模型结构与参数
-
parameters()
- 用途:返回模块的所有可训练参数(如权重、偏置)。
- 示例:
for param in model.parameters():print(param.shape)
-
named_parameters()
- 用途:返回带名称的参数迭代器,便于调试和访问特定参数。
- 示例:
for name, param in model.named_parameters():if 'weight' in name:print(name, param.shape)
-
children()
- 用途:返回直接子模块的迭代器。
- 示例:
for child in model.children():print(type(child))
-
modules()
- 用途:递归返回所有子模块(包括自身)。
- 示例:
for module in model.modules():if isinstance(module, nn.Conv2d):print(module.kernel_size)
二、模型状态与模式
-
train()
和eval()
- 用途:切换训练/推理模式(影响Dropout、BatchNorm等层)。
- 示例:
model.train() # 训练模式 model.eval() # 推理模式
-
training
- 用途:布尔属性,指示当前模式(
True
为训练,False
为推理)。 - 示例:
print(model.training) # 输出:True/False
- 用途:布尔属性,指示当前模式(
三、模型保存与加载
-
state_dict()
- 用途:返回包含模型所有参数的字典(
OrderedDict
)。 - 示例:
torch.save(model.state_dict(), 'model.pth')
- 用途:返回包含模型所有参数的字典(
-
load_state_dict()
- 用途:从字典加载模型参数。
- 示例:
model.load_state_dict(torch.load('model.pth'))
四、设备与数据类型
-
to()
- 用途:将模型移动到指定设备(如GPU)或转换数据类型。
- 示例:
model.to('cuda') # 移动到GPU model.to(torch.float16) # 转换为半精度
-
cpu()
和cuda()
- 用途:快捷方法,分别将模型移动到CPU或GPU。
- 示例:
model.cuda() # 等价于 model.to('cuda')
五、前向传播与计算
-
forward()
- 用途:定义模型的前向传播逻辑(需在自定义模块中重写)。
- 示例:
class MyModel(nn.Module):def forward(self, x):return self.layer(x)
-
__call__()
- 用途:调用模型实例时触发(内部调用
forward()
,支持钩子函数)。 - 示例:
output = model(x) # 等价于 output = model.forward(x)
- 用途:调用模型实例时触发(内部调用
六、参数初始化与优化
-
zero_grad()
- 用途:清空所有参数的梯度(通常在每个训练步骤前调用)。
- 示例:
optimizer.zero_grad() # 等价于 model.zero_grad()
-
requires_grad_()
- 用途:设置参数是否需要梯度(用于冻结部分模型)。
- 示例:
for param in model.parameters():param.requires_grad = False # 冻结所有参数
七、调试与信息
-
extra_repr()
- 用途:自定义模块打印信息(需在子类中重写)。
- 示例:
class MyModel(nn.Module):def extra_repr(self):return f"hidden_size={self.hidden_size}"
-
dump_patches()
- 用途:打印模型的补丁信息(用于调试版本差异)。
八、其他实用方法
-
apply()
- 用途:递归应用函数到所有子模块(如初始化权重)。
- 示例:
def init_weights(m):if isinstance(m, nn.Conv2d):nn.init.kaiming_normal_(m.weight) model.apply(init_weights)
-
register_forward_hook()
- 用途:注册前向传播钩子(用于捕获中间输出,调试或特征提取)。
总结
日常使用中,最频繁的方法包括:
- 模型构建:
parameters()
,children()
,modules()
- 训练与推理:
train()
,eval()
,zero_grad()
,forward()
- 保存与加载:
state_dict()
,load_state_dict()
- 设备管理:
to()
,cuda()
,cpu()
其他方法根据具体需求选择使用,例如钩子函数用于高级调试,apply()
用于统一初始化。
与nn.Sequential对比:
1. 继承关系与基础属性
-
nn.Module
- 是所有神经网络模块的基类,提供最基础的功能(如参数管理、钩子机制)。
- 包含核心属性:
_parameters
,_modules
,_buffers
等。
-
nn.Sequential
- 是
nn.Module
的子类,继承了所有基础功能。 - 额外添加了与顺序执行相关的属性(如
__getitem__
、append
)。
- 是
2. 核心差异对比
功能类别 | nn.Module | nn.Sequential |
---|---|---|
模块构建 | 需要手动实现 forward 方法 | 自动按顺序执行子模块,无需定义 forward |
子模块访问 | 通过属性名(如 self.conv1 ) | 通过索引或命名(如 model[0] ) |
动态修改 | 需手动管理子模块 | 支持 append 、extend 、insert 等操作 |
适用场景 | 复杂网络结构(如ResNet、U-Net) | 简单顺序结构(如LeNet卷积部分) |
3. 具体方法对比
3.1 公共方法(两者都有)
# 模型参数与结构
['parameters', 'named_parameters', 'children', 'modules', 'named_children', 'named_modules']# 模型状态
['train', 'eval', 'training', 'zero_grad', 'requires_grad_']# 设备与数据类型
['to', 'cpu', 'cuda', 'float', 'double', 'half', 'bfloat16']# 保存与加载
['state_dict', 'load_state_dict']# 钩子机制
['register_forward_hook', 'register_backward_hook']
3.2 nn.Sequential
特有的方法
# 列表操作(动态修改模块顺序)
['__getitem__', '__setitem__', '__delitem__', '__len__', 'append', 'extend', 'insert', 'pop']# 索引相关
['_get_item_by_idx']
3.3 nn.Module
特有的方法
# 自定义实现
['forward', 'extra_repr']# 高级管理
['add_module', 'register_module', 'register_parameter', 'register_buffer']
4. 示例对比
4.1 创建模型
# nn.Module(需自定义 forward)
class CustomModel(nn.Module):def __init__(self):super().__init__()self.conv = nn.Conv2d(3, 64, 3)self.relu = nn.ReLU()def forward(self, x):return self.relu(self.conv(x))# nn.Sequential(自动按顺序执行)
seq_model = nn.Sequential(nn.Conv2d(3, 64, 3),nn.ReLU()
)
4.2 访问子模块
# nn.Module
custom_model.conv # 通过属性名访问# nn.Sequential
seq_model[0] # 通过索引访问
seq_model.append(nn.MaxPool2d(2)) # 动态添加模块
5. 总结
特性 | nn.Module | nn.Sequential |
---|---|---|
灵活性 | 高(自定义任意逻辑) | 低(仅支持顺序执行) |
代码复杂度 | 较高(需手动实现 forward ) | 低(自动处理前向传播) |
动态修改 | 不支持直接操作(需手动管理) | 支持 append 、insert 等操作 |
适用场景 | 复杂网络、分支结构、自定义操作 | 简单堆叠模块(如CNN的卷积部分) |
建议:
- 对于简单的顺序网络,优先使用
nn.Sequential
以减少代码量。 - 对于包含复杂逻辑(如残差连接、多输入输出)的网络,使用
nn.Module
自定义实现。
相关文章:

PyTorch中nn.Module详解
直接print(dir(nn.Module)),得到如下内容: 一、模型结构与参数 parameters() 用途:返回模块的所有可训练参数(如权重、偏置)。示例:for param in model.parameters():print(param.shape)named_parameters…...
Mac 每日磁盘写入量异常高
为什么你的 Mac 每日磁盘写入量异常高?深度分析与解决方案 文章目录 为什么你的 Mac 每日磁盘写入量异常高?深度分析与解决方案🔍 问题现象🕵️♂️ 六大罪魁祸首1. 系统日志疯狂输出典型场景: 2. 浏览器缓存3. Ti…...
《深入解析Go语言结构:简洁高效的工程化设计》
《深入解析Go语言结构:简洁高效的工程化设计》 引言 Go语言(Golang)由Google团队于2009年发布,专为现代分布式系统和云计算设计。其核心哲学是"简单性高于一切",通过精简的语法结构和创新的…...
[蓝桥杯]机器人塔
题目描述 X 星球的机器人表演拉拉队有两种服装,A 和 B。 他们这次表演的是搭机器人塔。 类似: A B B A B A A A B B B B B A B A B A B B A 队内的组塔规则是: A 只能站在 AA 或 BB 的肩上。 B 只能站在 AB 或 BA 的肩上。 你的…...
如何将vue2使用npm run build打包好的文件上传到服务器
要将 Vue 2 项目打包并部署到服务器上,并使用 Nginx 作为 Web 服务器,可以按照以下步骤操作: 1. 打包 Vue 2 项目 首先,确保你的 Vue 2 项目已经开发完成,并且可以在本地正常运行。然后使用以下命令进行打包…...
Ubuntu 22.04 系统下 Docker 安装与配置全指南
Ubuntu 22.04 系统下 Docker 安装与配置全指南 一、前言 Docker 作为现代开发中不可或缺的容器化工具,能极大提升应用部署和环境管理的效率。本文将详细介绍在 Ubuntu 22.04 系统上安装与配置 Docker 的完整流程,包括环境准备、安装步骤、权限配置及镜…...

动态表单开发避坑:改变input的值不会触发change事件即时修复策略-WdatePicker ——仙盟创梦IDE
原始传统模式 onchange <input onchange"未来之窗东方仙盟change(this)" oni > <script>function 未来之窗东方仙盟change(onj){console.log("未来之窗东方仙盟change",onj.value)} </script> 测试 原始传统模式 oninput <input …...

10.安卓逆向2-frida hook技术-frida基本使用-frida指令(用于hook)
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于:图灵Python学院 工具下载: 链接:https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwdzy89 提取码࿱…...

动态设置微信小程序页面标题(navigationBarTitleText属性)
前言: 最近在公司进行小程序研发的时候,产品给出了一个动态加载页面标题的需求,经过调研之后将结果在这里与各位伙伴进行分享。 代码展示: 在.json文件中进行初始配置: { "usingComponents": {}, &q…...
前端流式接收数据讲解
前端流式接收数据全面讲解 前端流式接收数据(Streaming Data Reception)是现代 Web 应用中一个重要特性,尤其在处理实时通信、大文件传输、聊天、视频播放、实时日志监控等场景下。下面我们从概念到技术实现,再到应用示例&#x…...

Flutter下的一点实践
目录 1、背景2、refena创世纪代码3、localsend里refena的刷新3.1 初始状态3.2 发起设备扫描流程3.3 扫描过程3.3 刷新界面 4.localsend的设备扫描流程4.1 UDP广播设备注册流程4.2 TCP/HTTP设备注册流程4.3 localsend的服务器初始化工作4.4总结 1、背景 在很久以前,…...
Python训练营打卡 Day41
简单CNN 知识回顾 数据增强卷积神经网络定义的写法batch归一化:调整一个批次的分布,常用与图像数据特征图:只有卷积操作输出的才叫特征图调度器:直接修改基础学习率 卷积操作常见流程如下: 1. 输入 → 卷积层 → Batch…...
Eclipse集成lombok
一、安装 Lombok 插件(Eclipse 支持) 下载 lombok.jar: 前往官网下载页面:https://projectlombok.org/download 下载最新版本的 lombok.jar 文件。 运行 lombok.jar 配置 Eclipse: 双击下载的 lombok.jar࿰…...
什么是trace,分布式链路追踪(Distributed Tracing)
在你提到的 “个人免费版” 套餐中,“Trace 上报量:5 万条 / 月,存储 3 天” 里的 Trace 仍然是指 分布式链路追踪记录,但需要结合具体产品的场景来理解其含义和限制。以下是更贴近个人用户使用场景的解释: 一、这里的…...

VScode ios 模拟器安装cocoapods
使用 Homebrew 安装(推荐) 如果你有 Homebrew,直接用它安装更稳定: brew install cocoapods...

Redis最佳实践——安全与稳定性保障之数据持久化详解
Redis 在电商应用的安全与稳定性保障之数据持久化全面详解 一、持久化机制深度解析 1. 持久化策略矩阵 策略触发方式数据完整性恢复速度适用场景RDB定时快照分钟级快容灾备份/快速恢复AOF实时追加日志秒级慢金融交易/订单关键操作混合模式RDBAOF同时启用秒级中等高安全要求场…...
互联网大厂Java求职面试实战:Spring Boot微服务架构及Kafka消息处理示例解析
互联网大厂Java求职面试实战:Spring Boot微服务架构及Kafka消息处理示例解析 引言 在互联网大厂的Java开发岗位面试中,考察候选人对微服务架构设计、消息队列处理及高并发处理能力是重点。本文结合Spring Boot框架和Kafka消息队列,模拟一个…...

K 值选对,准确率翻倍:KNN 算法调参的黄金法则
目录 一、背景介绍 二、KNN 算法原理 2.1 核心思想 2.2 距离度量方法 2.3 算法流程 2.4算法结构: 三、KNN 算法代码实现 3.1 基于 Scikit-learn 的简单实现 3.2 手动实现 KNN(自定义代码) 四、K 值选择与可视化分析 4.1 K 值对分类…...

技术栈ES的介绍和使用
目录 1. 全文搜索引擎(Elastic Search)的由来2. Elastic Search 概述2.1 Elastic Search 介绍2.2 Elastic Search 功能2.3 Elastic Search 特点 3. 安装 Elastic Search3.1 ES 的安装3.2 安装 kibana3.3 ES 客户端的安装 4. Elastic Search 基本概念4.1 …...
跟Gemini学做PPT-模板样式的下载
好的,这里有一些推荐的网站,您可以在上面找到PPT目录样式和模板的灵感: SlideModel (slidemodel.com) 提供各种预先设计的目录幻灯片模板。这些模板100%可编辑,可用于PowerPoint和Google Slides。您可以找到不同项目数量ÿ…...

Windows版本的postgres安装插件http
1、下载安装包 这里使用安装 pgsql-http 的扩展 源码地址:GitHub - pramsey/pgsql-http: HTTP client for PostgreSQL, retrieve a web page from inside the database. 编译的安装地址:http extension for windows updated to include PostgreSQL17 …...

uni-app学习笔记十六-vue3页面生命周期(三)
uni-app官方文档页面生命周期部分位于页面 | uni-app官网。 本篇再介绍2个生命周期 1.onUnload:用于监听页面卸载。 当页面被关闭时,即页面的缓存被清掉时触发加载onUnload函数。 例如:在demo6页面点击跳转到demo4,在demo4页面回退不了到d…...
优化的两极:凸优化与非凸优化的理论、应用与挑战
在机器学习、工程设计、经济决策等众多领域,优化问题无处不在。而在优化理论的世界里,凸优化与非凸优化如同两个截然不同的 “王国”,各自有着独特的规则、挑战和应用场景。今天,就让我们深入探索这两个优化领域的核心差异、算法特…...

(五)MMA(OpenTelemetry/Rabbit MQ/ApiGateway/MongoDB)
文章目录 项目地址一、OpenTelemetry1.1 配置OpenTelemetry1. 服务添加2. 添加服务标识3. 添加请求的标识4. 添加中间价 二、Rabbit MQ2.1 配置Rabbit MQ1. docker-compose2. 添加Rabbit MQ的Connect String 2.2 替换成Rabbit MQ1. 安装所需要的包2. 使用 三、API Gateways3.1 …...

TCP通信与MQTT协议的关系
1. MQTT 处理核心(Mqtt_Pro) void Mqtt_Pro(void) { MQTT_Init(); // 初始化MQTT协议栈(连接参数、缓冲区等) MQTT_SendPro(); // 处理MQTT发送(封装消息,调用TCP发送) MQTT_RecPro();…...
AWS创建github相关的角色
创建github-actions角色 {"Version": "2012-10-17","Statement": [{"Effect": "Allow","Principal": {"Federated": "arn:aws:iam::11111111:oidc-provider/token.actions.githubusercontent.com…...
数据编辑器所具备的数据整理功能
在企业的数据处理过程中,数据清洗与整理是至关重要的环节,而数据编辑器在这方面发挥着关键作用。在一份包含客户信息的数据表中,常常会出现缺失值的情况。比如客户的年龄、联系方式等字段可能因为各种原因没有被记录,这就形成了缺…...
Unity网络开发实践项目
摘要:该网络通信系统基于Unity实现,包含以下几个核心模块: 协议配置:通过XML定义枚举(如玩家/英雄类型)、数据结构(如PlayerData)及消息协议(如PlayerMsg)&a…...

Jetson Orin Nano - SONY imx415 camera驱动开发
目录 前言: 调试准备工作: 修改内核默认打印等级 一、imx415驱动开发 1、硬件接线 2、设备树修改 2.1 创建 tegra234-p3767-camera-p3768-imx415-C-4lane.dtsi 文件 2.2 tegra234-p3767-camera-p3768-imx415-C-4lane.dtsi 添加到设备树 2.3 编译设备树 3、imx415驱动…...

word为跨页表格新加表头和表名
问题: 当表格过长需要跨页时(如下图所示),某些格式要求需要转页接排加续表。 方法一: 1、选中表格,在“表布局”区域点开“自动调整”,选择“固定列宽”(防止后续拆分表格后表格变…...