当前位置: 首页 > news >正文

如何理解Pytorch中前向传播的计算过程

我们经常在进行编写训练过程的时候,直接利用model(data)来计算预测结果,形式很方便简介,一个例子如下:

model = Simple_Module()
# 训练过程
for epoch in range(num_epochs):  # 训练 100 轮model.train()  # 训练模式optimizer.zero_grad()  # 清除梯度Y_pred = model(X)  # 前向传播loss = criterion(Y_pred, Y)  # 计算损失loss.backward()  # 反向传播optimizer.step()  # 更新权重

但是,实际上还是走了一段“路程”。我们在使用model(X)来计算预测结果的时候,看上去很像是把model当一个函数取调用,那X是导入的数据参数。实际上,model(X)的实现靠的是model.forward(X),当然Python屏蔽了其中的过程。

那如何做到向使用函数一样计算出预测结果呢?答案是__call__方法

任何一个深度学习模块都是基于父类nn.Module实现的,上文中Simple_Module也不例外。所以应该看看nn.Module

class Module:def __call__(self, *input, **kwargs):# 1. 前向传播前的钩子(Pre-Forward Hooks)pass# 2. 执行用户定义的 forward 方法result = self.forward(*input, **kwargs)# 3. 前向传播后的钩子(Post-Forward Hooks)pass# 4. 返回结果return result

显然,nn.Module中定义了 __call__() 方法,那么它的实例就可以被当作函数使用。
那为什么需要用__call__()?
1 就是让用户向使用函数一样,来获取到预测结果,譬如Y_pred = model(X)
2 __call__() 是 PyTorch 控制模型执行流程的关键钩子点
因为,我们不仅仅是需要让模型像函数一样来计算预测结果,我们还需要考虑到整个训练和推理的需求,例如自动求导、前向/后向 hook、模型并行机制、混合精度支持等等。但是这些又不需要对用户呈现

http://www.xdnf.cn/news/634591.html

相关文章:

  • 小土堆pytorch--神经网络搭建小实战Sequential的使用
  • 高可用 Redis 服务架构分析与搭建
  • 【C/C++】从零开始掌握Kafka
  • P2676 [USACO07DEC] Bookshelf B
  • 电商小程序店铺详情页:头部无限分类与筛选功能实现
  • LabVIEW实战项目推荐与学习建议
  • 打卡第28天:装饰器
  • 【HarmonyOS5】DevEco Studio 预览器与模拟工具详解
  • 掌握聚合函数:COUNT,MAX,MIN,SUM,AVG,GROUP BY和HAVING子句的用法,Where和HAVING的区别
  • TIGER - 一个轻量高效的语音分离模型,支持人声伴奏分离、音频说话人分离等 支持50系显卡 本地一键整合包下载
  • 【Android】非System用户下Persist应用不自动拉起
  • 破解C/C++内存分配与管理:内存对象模型硬核剖析
  • LeetCode-图论-岛屿数量+腐烂的橘子
  • Leetcode 3103. 查找热门话题标签 II
  • 仓鼠找sugar--lca+图论判断点在路径
  • LangChain02-Agent与Memory模块
  • git子模块--命令--列表版
  • 机器学习——支持向量机SVM
  • 类欧几里得算法(floor_sum)
  • uni-app学习笔记十四-vue3中emit的使用
  • Lua 脚本在 Redis 中的运用-23(Lua 脚本语法教程)
  • 计算机视觉中的可重复性:深入案例分析与Python代码实现
  • 【MySQL成神之路】MySQL函数总结
  • 【寻找Linux的奥秘】第八章:进程控制
  • 我的第1个爬虫程序——豆瓣Top250爬虫的详细步骤指南
  • 云原生安全:网络协议TCP详解
  • GO 语言进阶之 时间处理和Json 处理
  • 2025.05.23 Axure 动态面板学习笔记
  • Python经典算法实战
  • 股票程序化交易-使用python获取新浪财经期货行情数据