当前位置: 首页 > 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、模型并行机制、混合精度支持等等。但是这些又不需要对用户呈现

相关文章:

  • 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和死信交换机实现延迟队列
  • 网站建设it职位/百度seo公司兴田德润
  • 环保设备网站建设模板/企业网站营销的优缺点
  • 招聘网站建设计划书/电商网站建设制作
  • 任丘网站建设/北京seo优化诊断
  • 介绍营销的网站/今日最火的新闻
  • 响应式学校网站模板下载/国内重大新闻十条