torch.nn.Module

Module类是用户使用torch来自定义网络模型的基础,Module的设计要求包括低耦合性,高模块化等等。一般来说,计算图上所有的子图都可以是Module的子类,包括卷积,激活函数,损失函数节点以及相邻节点组成的集合等等,注意这里的关键词是“节点”,Module族类在计算图中主要起到搭建结构的作用,而不涉及运算逻辑的具体实现。

要注意的是,Module类对象的children所指向的其他Module类对象,并不等同于计算图中的子节点。如果我们展开Module网络,得到的一般是树形结构而非DAG,Module网络需要经过其他工作才能转化为计算图。

源代码分析

成员分析

首先直接从前端入手,找到torch/nn/module目录,可以看到这个目录下主要存放Module及其子类的定义,如。我们首先找到module.py内Module的定义

阅读__init__ 函数,可以看到Module基类的主要私有成员,其中包括

指向本Module内带梯度的可学习参数的parameter
指向本Module内不需要学习的模型状态参数的buffer
其他临时参数
前向与反向过程的hook函数,这些函数在运行backward与forward时允许自定义其它额外工作
state_dict相关函数,state_dict保存了模型的状态,是模型写入磁盘与加载的主要方式
modules指向该模块内部的所有子模块

方法分析

结构相关
  • 子模块生成

首先从我们日常使用pytorch搭建网络的用法可以想到,应该先去__setattr__函数寻找建立子节点的入口。

下图折叠了几个分支,可以看到当我们运行self.c1 = Conv2d(...)时,将会进入1202行的分支内,并且判断新成员是否是Module类型,如果是则将其放入本对象的子模块字典内。

__setattr__ 内主要对Parameter,Module,特定name的Tensor(也就是buffer)等参数做特判,其他情况则调用object的属性设置流程。事实上,其他的类似方法(如getattr等)也是同样的流程。

  • 内部参数访问

对于存储于私有成员_module内的子模块,一般使用children方法进行调用

我们在外部所使用的xx.modules()方法,就是通过调用children方法实现的。

另外,nn.Module实现了许多对参数转化的方法,比如CPU(将内部参数转移到内存中),CUDA(将内部参数转移到显存中)以及type(将参数转化为指定类型),而这些是通过调用内部的_apply方法实现的

可以看到,_apply接受一个函数指针参数,并对所有的子模块递归地调用自己。然后对本Module内所有的Parameter与buffer应用该函数。

问题来了,既然每个节点都进行函数应用,那么如何避免对同一参数重复应用fn?这个问题的关键在于内部的Parameter到底是如何存储的。

印象里,我们在外部使用xx.parameters()时,得到的是xx模块的所有参数,看起来和上述代码里的_parameters并非直接取用的关系,我们可以看一下parameters()的实现

注意到默认参数recurse=True,相信大部分人已经明白原因了,我们继续看到named_parameters()

对_named_member方法传入了获取子模块_parameters字典键值对的匿名函数,继续看到_named_members()

可以看到具体流程是先递归或者不递归地获取该模块下的所有用户希望获得的东西(具体定义在第一个函数参数中),然后返回迭代器

这里1489行体现递归调用,原因是named_modules方法本身就是一个递归函数

事实上,named_parameters, named_buffers均是通过named_members进而调用named_modules方法实现的,_module成员体现网络结构的特殊性在这里可以窥见一二。另外可以看到,上述方法内都存在memo集合进行去重,确保不会返回相同的指针对象。

  • 简要流程图

参考文章

https://zhuanlan.zhihu.com/p/340453841

PyTorch项目源码学习(3)——Module类初步学习的更多相关文章

  1. 项目源码--Android视频MV类网站客户端

    下载源码 技术要点: 1.视频MV类网站客户端框架 2.底部TAB功能模块 3.用户管理模块 4.结合优质动画技术,良好的用户体验 5.用户设置模块 6.sqlite数据库灵活的应用 7.源码带有非常 ...

  2. 项目源码--Android聚合视频类播放器

    下载源码 技术要点:  1.高效支持主流的视音频格式 2.本地视频的播放与管理 3.聚合电视在线直播 4.聚合优酷.搜狐.乐视.爱奇艺等多种在线视频 5.优质播放,包含播放.暂停,声音.亮度调整等功能 ...

  3. 对于学习apache软件基金会顶级项目源码的一点思路(转)

    ASF的开源项目,为软件行业贡献了太多好的产品和软件思维.学习ASF的项目源码能很大的提升自身的能力.程序运行在服务器上的流程:执行启动脚本(start.sh) -> 指向程序的主方法 -> ...

  4. MongoDB的使用学习之(七)MongoDB的聚合查询(两种方式)附项目源码

    先来张在路上…… 铛铛铛……项目源码下载地址:http://files.cnblogs.com/ontheroad_lee/MongoDBDemo.rar 此项目是用Maven创建的,没有使用Mave ...

  5. 反射实体自动生成EasyUi DataGrid模板 第二版--附项目源码

    之前写过一篇文章,地址 http://www.cnblogs.com/Bond/p/3469798.html   大概说了下怎么通过反射来自动生成对应EasyUi datagrid的模板,然后贴了很多 ...

  6. Struts2SpringHibernate整合示例,一个HelloWorld版的在线书店(项目源码+详尽注释+单元测试)

    Struts2,Spring,Hibernate是Java Web开发中最为常见的3种框架,掌握这3种框架是每个Java Web开发人员的基本功. 然而,很多初学者在集成这3个框架的时候,总是会遇到各 ...

  7. MyBatis项目配置案例详解与Web下的增删改查实现[附项目源码]

    MyBatis项目案例 项目图示: 项目源码地址:https://github.com/JluTiger/mybatispro 1.项目功能 项目案例:后台管理系统用户数据维护平台 所有用户数据查询 ...

  8. JAVAWEB贵美网上商城完整项目源码(SSH2)

    JAVAWEB贵美网上商城完整项目源码(SSH2) 贵美网上商城原是北大青鸟的一个内部项目,项目采用 struts2+spring4+hibernate4+MySQL等技术实现,数据库连接池采用c3p ...

  9. 最新app源码下载:200款优秀Android项目源码

    200款优秀Android项目源码!菜鸟必备!Android开发又将带来新一轮热潮,很多开发者都投入到这个浪潮中去了,创造了许许多多相当优秀的应用.其中也有许许多多的开发者提供了应用开源项目,贡献出他 ...

  10. Spring mvc Data Redis—Pub/Sub(附Web项目源码)

    一.发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候,我们称这个客户端为发布者(publisher). 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE ...

随机推荐

  1. 若依vue分离版(ruoyi-vue)跳过token验证,设置白名单

    找到SecurityConfig类的configure方法 如图所示 在设置白名单后还需要把接口上的权限标识符去掉.然后需要重启一下项目,热加载不行,会报错.

  2. 产品代码都给你看了,可别再说不会DDD(七):实体与值对象

    这是一个讲解DDD落地的文章系列,作者是<实现领域驱动设计>的译者滕云.本文章系列以一个真实的并已成功上线的软件项目--码如云(https://www.mryqr.com)为例,系统性地讲 ...

  3. DPDK丢包那些事

    本文来自博客园,作者:T-BARBARIANS,博文严禁转载,转载必究! 一.前言 DPDK技术原理相关的文章不胜枚举,但从实战出发,针对DPDK丢包这一类问题进行系统分析的文章还是凤毛麟角. 刚好最 ...

  4. C#计数排序算法

    前言 计数排序是一种非比较性的排序算法,适用于排序一定范围内的整数.它的基本思想是通过统计每个元素的出现次数,然后根据元素的大小依次输出排序结果. 实现原理 首先找出待排序数组中的最大值max和最小值 ...

  5. 手动添加winform的combobox和listbox名称和值

    先定义一个ListItem类,工程内其他窗体都可以用的.  public class ListItem : Object     {         public string Text { get; ...

  6. [Python急救站]草莓熊的绘制

    草莓熊也是一个热门的图案,今天就用Python绘制一下 import turtle as t # 设置背景颜色,窗口位置以及大小 t.colormode(255) # 颜色模式 t.speed(0) ...

  7. animate.css 动画种类(详细)

    作者:WangMin 格言:努力做好自己喜欢的每一件事 以下为各种动画类型包含的不同动画效果类,仅供参考.具体可查看animate.css 官网. bounce 弹跳 2. flash 闪烁 3. p ...

  8. 通义千问, 文心一言, ChatGLM, GPT-4, Llama2, DevOps 能力评测

    引言 "克隆 dev 环境到 test 环境,等所有服务运行正常之后,把访问地址告诉我","检查所有项目,告诉我有哪些服务不正常,给出异常原因和修复建议",在过 ...

  9. 2023浙江省大学生信息安全竞赛决赛 Cry+Misc wp

    搞到了一些附件,做做看难度如何. CRYPTO R_r 1.题目信息 查看代码 from Crypto.Util.number import * import random from gmpy2 im ...

  10. CF510B Fox And Two Dots

    题目大意 矩阵中各个方格都有颜色,判断是否有相同颜色的方块可以组成环.(原题链接:CF510B Fox And Two Dots) 输入: 第一行:\(n\), \(m\),表示矩阵的行和列 接下来\ ...