PyTorch中nn.Module详解

news2025/6/3 0:42:22

直接print(dir(nn.Module)),得到如下内容:
在这里插入图片描述

一、模型结构与参数

  1. parameters()

    • 用途:返回模块的所有可训练参数(如权重、偏置)。
    • 示例
      for param in model.parameters():
          print(param.shape)
      
  2. named_parameters()

    • 用途:返回带名称的参数迭代器,便于调试和访问特定参数。
    • 示例
      for name, param in model.named_parameters():
          if 'weight' in name:
              print(name, param.shape)
      
  3. children()

    • 用途:返回直接子模块的迭代器。
    • 示例
      for child in model.children():
          print(type(child))
      
  4. modules()

    • 用途:递归返回所有子模块(包括自身)。
    • 示例
      for module in model.modules():
          if isinstance(module, nn.Conv2d):
              print(module.kernel_size)
      

二、模型状态与模式

  1. train()eval()

    • 用途:切换训练/推理模式(影响Dropout、BatchNorm等层)。
    • 示例
      model.train()  # 训练模式
      model.eval()   # 推理模式
      
  2. training

    • 用途:布尔属性,指示当前模式(True 为训练,False 为推理)。
    • 示例
      print(model.training)  # 输出:True/False
      

三、模型保存与加载

  1. state_dict()

    • 用途:返回包含模型所有参数的字典(OrderedDict)。
    • 示例
      torch.save(model.state_dict(), 'model.pth')
      
  2. load_state_dict()

    • 用途:从字典加载模型参数。
    • 示例
      model.load_state_dict(torch.load('model.pth'))
      

四、设备与数据类型

  1. to()

    • 用途:将模型移动到指定设备(如GPU)或转换数据类型。
    • 示例
      model.to('cuda')          # 移动到GPU
      model.to(torch.float16)   # 转换为半精度
      
  2. cpu()cuda()

    • 用途:快捷方法,分别将模型移动到CPU或GPU。
    • 示例
      model.cuda()  # 等价于 model.to('cuda')
      

五、前向传播与计算

  1. forward()

    • 用途:定义模型的前向传播逻辑(需在自定义模块中重写)。
    • 示例
      class MyModel(nn.Module):
          def forward(self, x):
              return self.layer(x)
      
  2. __call__()

    • 用途:调用模型实例时触发(内部调用 forward(),支持钩子函数)。
    • 示例
      output = model(x)  # 等价于 output = model.forward(x)
      

六、参数初始化与优化

  1. zero_grad()

    • 用途:清空所有参数的梯度(通常在每个训练步骤前调用)。
    • 示例
      optimizer.zero_grad()  # 等价于 model.zero_grad()
      
  2. requires_grad_()

    • 用途:设置参数是否需要梯度(用于冻结部分模型)。
    • 示例
      for param in model.parameters():
          param.requires_grad = False  # 冻结所有参数
      

七、调试与信息

  1. extra_repr()

    • 用途:自定义模块打印信息(需在子类中重写)。
    • 示例
      class MyModel(nn.Module):
          def extra_repr(self):
              return f"hidden_size={self.hidden_size}"
      
  2. dump_patches()

    • 用途:打印模型的补丁信息(用于调试版本差异)。

八、其他实用方法

  1. apply()

    • 用途:递归应用函数到所有子模块(如初始化权重)。
    • 示例
      def init_weights(m):
          if isinstance(m, nn.Conv2d):
              nn.init.kaiming_normal_(m.weight)
      model.apply(init_weights)
      
  2. 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.Modulenn.Sequential
模块构建需要手动实现 forward 方法自动按顺序执行子模块,无需定义 forward
子模块访问通过属性名(如 self.conv1通过索引或命名(如 model[0]
动态修改需手动管理子模块支持 appendextendinsert 等操作
适用场景复杂网络结构(如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.Modulenn.Sequential
灵活性高(自定义任意逻辑)低(仅支持顺序执行)
代码复杂度较高(需手动实现 forward低(自动处理前向传播)
动态修改不支持直接操作(需手动管理)支持 appendinsert 等操作
适用场景复杂网络、分支结构、自定义操作简单堆叠模块(如CNN的卷积部分)

建议:

  • 对于简单的顺序网络,优先使用 nn.Sequential 以减少代码量。
  • 对于包含复杂逻辑(如残差连接、多输入输出)的网络,使用 nn.Module 自定义实现。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

动态表单开发避坑:改变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)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwdzy89 提取码&#xff1…

动态设置微信小程序页面标题(navigationBarTitleText属性)

前言&#xff1a; 最近在公司进行小程序研发的时候&#xff0c;产品给出了一个动态加载页面标题的需求&#xff0c;经过调研之后将结果在这里与各位伙伴进行分享。 代码展示&#xff1a; 在.json文件中进行初始配置&#xff1a; { "usingComponents": {}, &q…

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、背景 在很久以前&#xff0c;…

VScode ios 模拟器安装cocoapods

使用 Homebrew 安装&#xff08;推荐&#xff09; 如果你有 Homebrew&#xff0c;直接用它安装更稳定&#xff1a; brew install cocoapods

Redis最佳实践——安全与稳定性保障之数据持久化详解

Redis 在电商应用的安全与稳定性保障之数据持久化全面详解 一、持久化机制深度解析 1. 持久化策略矩阵 策略触发方式数据完整性恢复速度适用场景RDB定时快照分钟级快容灾备份/快速恢复AOF实时追加日志秒级慢金融交易/订单关键操作混合模式RDBAOF同时启用秒级中等高安全要求场…

K 值选对,准确率翻倍:KNN 算法调参的黄金法则

目录 一、背景介绍 二、KNN 算法原理 2.1 核心思想 2.2 距离度量方法 2.3 算法流程 2.4算法结构&#xff1a; 三、KNN 算法代码实现 3.1 基于 Scikit-learn 的简单实现 3.2 手动实现 KNN&#xff08;自定义代码&#xff09; 四、K 值选择与可视化分析 4.1 K 值对分类…

技术栈ES的介绍和使用

目录 1. 全文搜索引擎&#xff08;Elastic Search&#xff09;的由来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 …

Windows版本的postgres安装插件http

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

uni-app学习笔记十六-vue3页面生命周期(三)

uni-app官方文档页面生命周期部分位于页面 | uni-app官网。 本篇再介绍2个生命周期 1.onUnload&#xff1a;用于监听页面卸载。 当页面被关闭时&#xff0c;即页面的缓存被清掉时触发加载onUnload函数。 例如:在demo6页面点击跳转到demo4&#xff0c;在demo4页面回退不了到d…

优化的两极:凸优化与非凸优化的理论、应用与挑战

在机器学习、工程设计、经济决策等众多领域&#xff0c;优化问题无处不在。而在优化理论的世界里&#xff0c;凸优化与非凸优化如同两个截然不同的 “王国”&#xff0c;各自有着独特的规则、挑战和应用场景。今天&#xff0c;就让我们深入探索这两个优化领域的核心差异、算法特…

(五)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 处理核心&#xff08;Mqtt_Pro&#xff09; void Mqtt_Pro(void) { MQTT_Init(); // 初始化MQTT协议栈&#xff08;连接参数、缓冲区等&#xff09; MQTT_SendPro(); // 处理MQTT发送&#xff08;封装消息&#xff0c;调用TCP发送&#xff09; MQTT_RecPro();…

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为跨页表格新加表头和表名

问题&#xff1a; 当表格过长需要跨页时&#xff08;如下图所示&#xff09;&#xff0c;某些格式要求需要转页接排加续表。 方法一&#xff1a; 1、选中表格&#xff0c;在“表布局”区域点开“自动调整”&#xff0c;选择“固定列宽”&#xff08;防止后续拆分表格后表格变…

测试用例篇章

本节概要&#xff1a; 测试⽤例的概念 设计测试⽤例的万能思路 设计测试⽤例的⽅法 一、测试用例 1.1 概念 什么是测试用例&#xff1f; 测试⽤例&#xff08;Test Case&#xff09;是为了实施测试⽽向被测试的系统提供的⼀组集合&#xff0c;这组集合包含&#xff1a;测…

2025年北京市职工职业技能大赛第六届信息通信行业网络安全技能大赛复赛CTF部分WP-哥斯拉流量分析

2025年北京市职工职业技能大赛第六届信息通信行业网络安全技能大赛复赛CTF部分WP-哥斯拉流量分析 一、流量分析 题目没有任何提示,附件gzl.pcap 解题哥斯拉流量300多KB包很多,没啥经验只能挨个看回来之后又狠狠得撸了一把哥斯拉流量分析我这里用的是哥斯拉4.0.1 测试链接…

Django ToDoWeb 服务

我们的任务是使用 Django 创建一个简单的 ToDo 应用程序,允许用户添加、查看和删除笔记。我们将通过设置 Django 项目、创建 Todo 模型、设计表单和视图来处理用户输入以及创建模板来显示任务来构建它。我们将逐步实现核心功能以有效地管理 todo 项。 Django ToDoWeb 服务 …

各种数据库,行式、列式、文档型、KV、时序、向量、图究竟怎么选?

慕然回首&#xff0c;发现这些年来涌现出了许多类型的数据库&#xff0c;今天抽空简单回顾一下&#xff0c;以便于后面用到时能快速选择。 1. 关系型数据库(行式) 关系型数据库&#xff08;RDBMS&#xff09;&#xff0c;我们常说的数据库就是指的关系型数据库。 它的全称是关…

全志科技携飞凌嵌入式T527核心板亮相OpenHarmony开发者大会

近日&#xff0c;OpenHarmony开发者大会2025&#xff08;OHDC.2025&#xff0c;以下简称“大会”&#xff09;在深圳举办&#xff0c;全志科技作为OpenHarmony生态的重要合作伙伴受邀参会&#xff0c;并进行了《全志科技行业智能芯片OpenHarmony方案适配与认证经验分享》的主题…