pytorch 中_call_impl()函数
记录pytorch 版本中的 nn.Module() 重要函数
1. _call_impl()
1.1 torch1.7.1 版本
def _call_impl(self, *input, **kwargs):for hook in itertools.chain(_global_forward_pre_hooks.values(),self._forward_pre_hooks.values()):result = hook(self, input)if result is not None:if not isinstance(result, tuple):result = (result,)input = resultif torch._C._get_tracing_state():result = self._slow_forward(*input, **kwargs)else:result = self.forward(*input, **kwargs)for hook in itertools.chain(_global_forward_hooks.values(),self._forward_hooks.values()):hook_result = hook(self, input, result)if hook_result is not None:result = hook_resultif (len(self._backward_hooks) > 0) or (len(_global_backward_hooks) > 0):var = resultwhile not isinstance(var, torch.Tensor):if isinstance(var, dict):var = next((v for v in var.values() if isinstance(v, torch.Tensor)))else:var = var[0]grad_fn = var.grad_fnif grad_fn is not None:for hook in itertools.chain(_global_backward_hooks.values(),self._backward_hooks.values()):wrapper = functools.partial(hook, self)functools.update_wrapper(wrapper, hook)grad_fn.register_hook(wrapper)return result
以上的函数的功能作用解释如下:
提供的代码是 PyTorch 模块方法的 _call_impl 实现。当模块用作可调用对象时,通常使用输入数据调用它时,将调用此方法。让我们逐步分解代码以了解其功能:
for hook in itertools.chain(_global_forward_pre_hooks.values(), self._forward_pre_hooks.values()):
此循环遍历两个钩子集合:
_global_forward_pre_hooks 和 _forward_pre_hooks 。
钩子是可以注册为在神经网络向前或向后传递期间在特定点执行的函数。
这些预置挂钩将在模块的实际前向传递之前执行。
result = hook(self, input):
对于每个钩子,使用 self (模块)和 input 参数调用 hook 该函数。
if result is not None:
如果钩子返回非 None 值,则表示钩子修改了输入数据,并且此修改后的数据将成为循环中下一个挂钩的新输入。
if not isinstance(result, tuple): result = (result,)
钩子的结果将转换为元组(如果它还没有元组)。这是为了处理钩子可能返回单个值而不是元组的情况。
input = result
修改后的输入将成为循环中下一个钩子的新输入。
if torch._C._get_tracing_state(): result = self._slow_forward(*input, **kwargs)
此条件块检查是否正在跟踪当前正向传递。如果是,则使用修改后的输入数据调用该方_slow_forward 。
else: result = self.forward(*input, **kwargs)
如果未跟踪正向传递,则使用修改后的输入数据调用模块的正常 forward 方法。
for hook in itertools.chain(_global_forward_hooks.values(), self._forward_hooks.values()):
此循环遍历两个前向钩子集合: _global_forward_hooks 和 _forward_hooks 。这些钩子在模块的正向传递之后执行。
hook_result = hook(self, input, result):
对于每个钩子,使用 self 、 input 和 result 作为参数调用 hook 函数。
if hook_result is not None: result = hook_result
如果钩子返回非 None 值,则表示钩子修改了正向传递的结果,并且此修改后的结果将成为循环中下一个挂钩的新结果。
if (len(self._backward_hooks) > 0) or (len(_global_backward_hooks) > 0):
此条件块检查是否有任何全局或为此特定模块注册的向后钩子。
var = result
正向传递的结果存储在变量 var 中。
while not isinstance(var, torch.Tensor):
此循环迭代 till 是 var 的 torch.Tensor 实例。
if isinstance(var, dict): var = next((v for v in var.values() if isinstance(v, torch.Tensor)))
如果是一个字典,它 var 查找字典中的第一个值,即 torch.Tensor .
else: var = var[0]
如果不是字典,它 var 假定它是一个序列(例如,列表,元组)并获取其第一个元素。
grad_fn = var.grad_fn
grad_fn torch.Tensor 实例的属性被分配给变量 grad_fn 。此属性表示在反向传播期间计算张量梯度的函数。
if grad_fn is not None:
如果 不是 grad_fn None,则表示张量参与了需要梯度的计算,我们需要向其附加向后钩子。
for hook in itertools.chain(_global_backward_hooks.values(), self._backward_hooks.values()):
此循环遍历两个向后钩子集合: _global_backward_hooks 和 _backward_hooks 。这些钩子在模块的向后传递期间执行。
wrapper = functools.partial(hook, self)
对于每个向后钩子,通过将钩子函数与模块 self 作为参数部分应用来创建一个新函数。这样做是为了确保钩子函数可以访问模块。
functools.update_wrapper(wrapper, hook)
包装器函数使用原始钩子函数中的信息进行更新,例如其名称和文档字符串。
grad_fn.register_hook(wrapper)
包装器函数注册为挂接到 grad_fn .这意味着在反向传播期间计算梯度时,将执行钩子以对梯度执行其他操作。
return result
返回前向传递的最终结果。
总之,该方法 _call_impl 执行前向挂钩(前向前和后向前),执行前向传递,执行向后挂钩(如果需要),并返回向前传递的结果。它还处理钩子修改输入或结果数据的情况,并确保向后钩子附加到相关张量,以便在反向传播期间进行梯度计算。
相关文章:
pytorch 中_call_impl()函数
记录pytorch 版本中的 nn.Module() 重要函数 1. _call_impl() 1.1 torch1.7.1 版本 def _call_impl(self, *input, **kwargs):for hook in itertools.chain(_global_forward_pre_hooks.values(),self._forward_pre_hooks.values()):result hook(self, input)if result is n…...
openGauss学习笔记-22 openGauss 简单数据管理-HAVING子句
文章目录 openGauss学习笔记-22 openGauss 简单数据管理-HAVING子句22.1 语法格式22.2 参数说明22.3 示例 openGauss学习笔记-22 openGauss 简单数据管理-HAVING子句 HAVING子句可以让我们筛选分组后的各组数据。 WHERE子句在所选列上设置条件,而HAVING子句则在由…...
干货 | 常见电路板GND与外壳GND之间接一个电阻一个电容,为什么?
干货 | 常见电路板GND与外壳GND之间接一个电阻一个电容,为什么? 外壳是金属的,中间是一个螺丝孔,也就是跟大地连接起来了。这里通过一个1M的电阻跟一个0.1uF的电容并联,跟电路板的地连接在一起,这样有什么好…...
网络层协议总览
网络层协议总览 IPARP(地址解析协议)ICMP(网际控制报文协议)路由选择协议NAT(网络地址转换协议) 网络层的主要协议包括IP、ARP、RARP、ICMP、IGMP以及各种路由选择协议等。 IP IP协议是TCP/IP协议簇中的核…...
C++模拟实现list
1.首先要了解到vs底层的list链表是带头双向循环的链表。 所以首先就要看成员变量 那么就说明我们还需要构造一个Node的结构体,(typedef一下就好了,名字不影响) 现在就可以完成间的push_back函数了。 1.list的iterator 我们之前模…...
PostgreSQL PG16 逻辑复制在STANDBY 上工作 (译)
开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共…...
《零基础入门学习Python》第058讲:论一只爬虫的自我修养6:正则表达式2
上一节课我们通过一个例子(匹配 ip 地址)让大家初步了解到正则表达式的魔力,也让大家充分了解到学习正则表达式是一个相对比较困难的事情。所以这一节课我们将继续学习 正则表达式的语法。 我们依稀还记得在Python中,正则表达式是…...
第一堂棒球课:MLB棒球大联盟的主要战术·棒球1号位
MLB棒球大联盟的主要战术 攻击战术run-and-foul(跑垒战术):以速度为优势,在适当的时机发动进攻,争取在一回合内完成得分。 grounder(阻截战术):队员在垒包之间阻止对手的跑垒和传球。…...
【论文阅读】利用道路目标特征的多期车载激光点云配准
目录 引 言1 道路场景点云特征2 配准方法2.1 配准基元获取2.2 特征点提取2.3 两期道路场景车载点云的配准 2.3.1 基于特征点的4PCS 粗配准 3 实验与分析4 结论5 参考文献 摘 要 针对车载移动测量系统获取的城市道路点云场景巨大、目标复杂多样,多期道路场景重访车载…...
L---泰拉瑞亚---2023河南萌新联赛第(三)场:郑州大学
链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 示例1 输入 1 10 3 5 输出 3 说明 只有一把回旋镖,你可以先打两次伤害为3的,再打一次倾尽全力的,造成的伤害为5。总伤害为33511,即可获得胜…...
windows无盘启动技术开发之使用本地镜像文件启动电脑
by fanxiushu 2023-07-26 转载或引用请注明原始作者。 其实使用本地镜像文件启动电脑,这个windows操作系统本身就是自带的功能。 win7以上的系统,制作 vhd或vhdx格式的镜像文件, 然后在镜像文件中安装windows操作系统,然后放到真实…...
PoseiSwap 即将开启质押,利好刺激下 POSE通证短时涨超 30%
随着 Nautilus Chain 主网的上线,预示着 Web3 世界迎来全新的模块化、Layer3 时代,为 Web3 世界与 Web2 世界的深入融合构建基础。而 PoseiSwap 作为 Nautilus Chain 上的首个 DEX,也成为了加密行业首个以模块化为基础构建的 DEX。 基于 Naut…...
Linux文本编辑器-vim
目录 前言 Vim三种模式 打开方式 命令模式 插入模式 可视模式 保存和退出 前言 Vim是一个功能丰富且强大的文本编辑器,被广泛用于Linux系统。它是Vi的增强版本,提供了更多的功能和改进,同时可以通过插件扩展其功能; Vim三…...
vscode使用g++编译.c文件或.cpp文件
vscode是一个跨平台、轻量级、插件非常丰厚的IDE,这里介绍在vscode里使用g来编译.cpp文件。g也叫GCC, 在Window中,是使用MinGW方式实现g的,它分为32位和64位2个版本,其中,MinGW-64是64位的,MinGW-32是32位的…...
云计算的服务模式包括哪些|PetaExpress云服务商
云计算(cloud computing)它是一种分布式计算,是指通过网络“云”将巨大的数据计算处理程序分解成无数的小程序,然后通过由多个服务器组成的系统进行处理和分析,得到结果并返回给用户。云计算作为一种基于互联网的新型超…...
iOS--通知、代理、单例模式总结
通知 概要 观察者和被观察者都无需知晓对方,只需要通过标记在NSNotificationCenter中找到监听该通知所对应的类,从而调用该类的方法。并且在NSNotificationCenter中,观察者可以只订阅某一特定的通知,并对齐做出相应操作…...
选择最佳安全文件传输方法的重要性
在数字化时代,文件的传输是商务、教育、科研、医学等领域不可或缺的工作流程。为了保障数据安全,选择最佳安全文件传输方法非常关键。在本文中,我们将探讨选择最佳安全文件传输方法的重要性。 第一、最佳安全文件传输方法可以保证文件内容不被…...
IBM LSF 集群虚拟化和工作负载管理解决方案
IBM LSF 集群虚拟化和工作负载管理解决方案 全面综合的工作负载管理解决方案,不仅能够简化 HPC,还能大幅改善用户和管理员体验、可靠性和性能 用途 IBM Spectrum LSF Suites 组合通过为任务关键型 HPC 环境提供集成解决方案,重新定义集群虚…...
C++(14):重载运算与类型转换
当运算符被用于类类型的对象时,允许我们为其指定新的含义;同时,也能自定义类类型之间的转换规则。和内置类型的转换一样,类类型转换隐式地将一种类型的对象转换成另一种我们所需类型的对象。 当运算符作用于类类型的运算对象时&a…...
【深度学习】基于图形的机器学习:概述
一、说明 图神经网络(GNN)在数据科学和机器学习中越来越受到关注,但在专家圈之外仍然知之甚少。为了掌握这种令人兴奋的方法,我们必须从更广泛的图形机器学习(GML)领域开始。许多在线资源谈论GNN和GML&…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...
