当前位置: 首页 > 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://bootlace.riewr.cn
http://almacantar.riewr.cn
http://bedsore.riewr.cn
http://bindle.riewr.cn
http://bruin.riewr.cn
http://choriamb.riewr.cn
http://bewitchingly.riewr.cn
http://astronomer.riewr.cn
http://archoplasm.riewr.cn
http://americanism.riewr.cn
http://bonavacantia.riewr.cn
http://acquirement.riewr.cn
http://banjarmasin.riewr.cn
http://bisulfate.riewr.cn
http://caprine.riewr.cn
http://batum.riewr.cn
http://altercation.riewr.cn
http://addlebrained.riewr.cn
http://bimetallic.riewr.cn
http://cavicorn.riewr.cn
http://bongo.riewr.cn
http://chicly.riewr.cn
http://aitchbone.riewr.cn
http://buckjump.riewr.cn
http://aonb.riewr.cn
http://brittle.riewr.cn
http://america.riewr.cn
http://cautel.riewr.cn
http://anhistous.riewr.cn
http://appendices.riewr.cn
http://www.dtcms.com/a/212842.html

相关文章:

  • dify-plugin-daemon的.env配置文件
  • Java 流程控制:从「小白」到「能用」的 while 循环指南
  • DAY34
  • 市场需求文档撰写
  • 超大数值减法
  • 解决论文中字体未嵌入的问题
  • STM32中的SPI通信协议
  • SprigBoot整合rocketmq-v5-client-spring-boot
  • CMake从入门到实战:现代C++项目构建指南
  • Android组件化框架设计与实践
  • Python60日基础学习打卡D35
  • NumPy数组切片
  • 基于AI自动生成测试用例
  • 「OC」源码学习——关联属性再探索
  • leetcode 131. Palindrome Partitioning
  • 【Qt】QCustomPlot相关
  • 2025一带一路暨金砖国家技能发展与技术创新大赛第三届企业信息系统安全赛项
  • 【面板数据】上市公司外资持股数据集(2005-2023年)
  • 防火墙高可用(HA)主备验证实验(eNSP)
  • TTL和死信交换机实现延迟队列
  • 4款顶级磁力下载工具,速度提升器,可以变下变播
  • 第三章 第二大脑的运作机理 整理笔记
  • 套索回归与岭回归通俗讲解
  • TCP建立连接为什么不是两次握手,而是三次,为什么不能在第二次握手时就建立连接?
  • uniapp-商城-68-shop(1-商品列表,获取数据,utils、tofixed 、parseInt的使用)
  • Python容器
  • 基于 LangChain + Chroma 实现文档向量化入库(含摘要处理 + RAG 查询):完整实战流程
  • Linux基本指令篇 —— cd指令
  • 【TypeScript】结构化类型系统与标明类型系统
  • [Protobuf] 快速上手:安全高效的序列化指南