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

Pytorch中关于forward函数的理解与用法

目录

  • 前言
  • 1. 问题所示
  • 2. 原理分析
    • 2.1 forward函数理解
    • 2.2 forward函数用法

前言

深入深度学习框架的代码,发现forward函数没有被显示调用

但代码确重写了forward函数,于是好奇是不是python的魔术方法作用

1. 问题所示

代码如下所示:

class Module(nn.Module):# 初始化def __init__(self):super(Module, self).__init__()# ......# 前向传播def forward(self, x):# ......return x# 输入数据
data = .....  # 实例化
module = Module()# 前向传播
module(data)  

整个代码串没有显示调用forward函数
由此引发疑问:

  1. 谁去调用forward函数?
  2. 什么时候调用forward函数?

2. 原理分析

回顾python的基础知识:python 类和对象的详细分析
可以清楚知道对象需要执行方法,在方法中传入参数即可,类似 module.forward(data),但是执行对象(参数)就可成功。

这也说明:module(data) 等价于 module.forward(data)
即该代码块调用了forward函数(那他是怎样实现什么时候调用的呢)

本身Pytorch大部分操作都是通过继承nn.Module类实现,查看其源代码:

class Module(object):def __init__(self):def forward(self, *input):def add_module(self, name, module):def cuda(self, device=None):def cpu(self):def __call__(self, *input, **kwargs):def parameters(self, recurse=True):def named_parameters(self, prefix='', recurse=True):def children(self):def named_children(self):def modules(self):  def named_modules(self, memo=None, prefix=''):def train(self, mode=True):def eval(self):def zero_grad(self):def __repr__(self):def __dir__(self):

内部中有个def __call__(self, *input, **kwargs):函数,默认父类会执行该函数

大致如下:

class Module():def __call__(self, data):        print(data)module = Module()# 输出 1
module(1)

这正说明,深度学习的模型继承了nn.Module类,内部的__call__方法有对forward方法的调用,才不用显式地调用forward方法。
对此,深度学习的模型框架需要重写构造函数中的__init__函数和forward函数。

2.1 forward函数理解

  1. 通过module中的__call__方法
  2. __call__方法调用module中的forward方法
  3. forward方法
    —若碰到Module子类,则迭代回馈第一步;
    —若碰到Function子类,则执行第四步;
  4. 调用Function子类中的call方法
  5. __call__方法调用Function中的forward方法
  6. 由于层层嵌套,现在只需回馈上一层的值即可
    ( Function中的forward返回值 ->
    module中的forward返回值 ->
    module中的__call__进行forward_hook返回值)

代码逻辑如下:

def __call__(self, *input, **kwargs):# 此处执行forward函数result = self.forward(*input, **kwargs)for hook in self._forward_hooks.values():#将注册的hook拿出来用hook_result = hook(self, input, result)return result
  • 围观角度:所谓的__call__为函数调用,只需要将该类型的对象当做函数使用即可,即 module(data) 等价于 module.forward(data)

  • 宏观角度:当一个类默认实现特殊方法__call__,该类的实例就变成可调用的类型,即对象名() 等价于 对象名.__call__()

2.2 forward函数用法

CNN可学习的参数层和不可学习的参数层,大致如下:

  • 可学习的参数:卷积层和全连接层的权重、bias、BatchNorm的β和γ等。
  • 不可学习的参数(超参数):学习率、batch size、weight decay、模型的深度宽度分辨率等。
  • Module类中的init构造函数一般放置可学习的参数,其不可学习的参数如果不放置在init层,则在forward函数中可用nn.functional来代替。
  • forward函数必须重写(实现模型功能,链接各层之间的功能)

相关文章:

Pytorch中关于forward函数的理解与用法

目录 前言1. 问题所示2. 原理分析2.1 forward函数理解2.2 forward函数用法 前言 深入深度学习框架的代码,发现forward函数没有被显示调用 但代码确重写了forward函数,于是好奇是不是python的魔术方法作用 1. 问题所示 代码如下所示: cla…...

vite跨域proxy设置与开发、生产环境的接口配置,接口在生产环境下,还能使用proxy代理地址吗

文章目录 vite的proxy开发环境设置如果后端没有提供可以替换的/mis等可替换的后缀的处理办法接口如何区分.env.development开发和.env.production生产环境接口在生产环境下,还能使用proxy代理地址吗? vite的proxy开发环境设置 环境: vite 4…...

【嵌入式】使用MultiButton开源库驱动按键并控制多级界面切换

目录 一 背景说明 二 参考资料 三 MultiButton开源库移植 四 设计实现--驱动按键 五 设计实现--界面处理 一 背景说明 需要做一个通过不同按键控制多级界面切换以及界面动作的程序。 查阅相关资料,发现网上大多数的应用都比较繁琐,且对于多级界面的…...

【数据结构】树的概念理解和性质推导(保姆级详解,小白必看系列)

目录 一、前言 🍎 为什么要学习非线性结构 ---- 树(Tree) 💦 线性结构的优缺点 💦 优化方案 ----- 树(Tree) 💦 树的讲解流程 二、树的概念及结构 🍐 树的概念 &…...

融合之力:数字孪生、人工智能和数据分析的创新驱动

数字孪生、人工智能(AI)和数据分析是当今科技领域中的三个重要概念,它们之间存在着紧密的关联和互动,共同推动了许多领域的创新和发展。 一、概念 数字孪生是一种数字化的模拟技术,它通过复制现实世界中的物理实体、…...

Spring的注解开发-Spring配置类的开发

Bean配置类的注解开发 Component等注解替代了<bean>标签&#xff0c;但像<import>、<context:componentScan>等非<bean>标签怎样去使用注解去替代呢&#xff1f;定义一个配置类替代原有的xml配置文件&#xff0c;<bean>标签以外的标签&#xff…...

Linux系统编程系列之进程间通信-信号量组

一、什么是信号量组 信号量组是信号量的一种&#xff0c; 是system-V三种IPC对象之一&#xff0c;是进程间通信的一种方式。 二、信号量组的特性 信号量组不是用来传输数据的&#xff0c;而是作为“旗语”&#xff0c;用来协调各进程或者线程工作的。信号量组可以一次性在其内…...

centos 6使用yum安装软件

1. 执行以下命令&#xff0c;查看当前操作系统 CentOS 版本。 cat /etc/centos-release返回结果如下图所示&#xff0c;则说明当前操作系统版本为 CentOS 6.9。 2. 执行以下命令&#xff0c;编辑 CentOS-Base.repo 和CentOS-Epel.repo文件。 vim /etc/yum.repos.d/CentOS-Bas…...

maven无法下载时的解决方法——笔记

右键项目然后点击创建setting.xml&#xff08;因为现在创建了&#xff0c;所以没显示了&#xff0c;可以直接点击打开setting.xml&#xff09; 然后添加 <mirror><id>nexus-aliyun</id><mirrorOf>*,!jeecg,!jeecg-snapshots</mirrorOf><name…...

Java Spring Boot 开发框架

Spring Boot是一种基于Java编程语言的开发框架&#xff0c;它的目标是简化Java应用程序的开发过程。Spring Boot提供了一种快速、易于使用的方式来创建独立的、生产级别的Java应用程序。本文将介绍Spring Boot的特性、优势以及如何使用它来开发高效、可靠的应用程序。 一、简介…...

Pytorch学习记录-1-张量

1. 张量 (Tensor): 数学中指的是多维数组&#xff1b; torch.Tensor data: 被封装的 Tensor dtype: 张量的数据类型 shape: 张量的形状 device: 张量所在的设备&#xff0c;GPU/CPU requires_grad: 指示是否需要计算梯度 grad: data 的梯度 grad_fn: 创建 Tensor 的 Functio…...

paddle2.3-基于联邦学习实现FedAVg算法-CNN

目录 1. 联邦学习介绍 2. 实验流程 3. 数据加载 4. 模型构建 5. 数据采样函数 6. 模型训练 1. 联邦学习介绍 联邦学习是一种分布式机器学习方法&#xff0c;中心节点为server&#xff08;服务器&#xff09;&#xff0c;各分支节点为本地的client&#xff08;设备&#…...

nuiapp保存canvas绘图

要保存一个 Canvas 绘图&#xff0c;可以使用以下步骤&#xff1a; 获取 Canvas 元素和其绘图上下文&#xff1a; var canvas document.getElementById("myCanvas"); var ctx canvas.getContext("2d");使用 Canvas 绘图 API 绘制图形。 使用 toDataUR…...

Object.defineProperty()方法详解,了解vue2的数据代理

假期第一篇&#xff0c;对于基础的知识点&#xff0c;我感觉自己还是很薄弱的。 趁着假期&#xff0c;再去复习一遍 Object.defineProperty(),对于这个方法&#xff0c;更多的还是停留在面试的时候&#xff0c;面试官问你vue2和vue3区别的时候&#xff0c;不免要提一提这个方法…...

Linux 磁盘管理

Linux 系统的磁盘管理直接关系到整个系统的性能表现。磁盘管理常用三个命令为&#xff1a; df、du 和 fdisk。 df df&#xff08;英文全称&#xff1a;disk free&#xff09;。df 命令用于显示磁盘空间的使用情况&#xff0c;包括文件系统的挂载点、总容量、已用空间、可用空间…...

大数据与人工智能的未来已来

大数据与人工智能的定义 大数据&#xff1a; 大数据指的是规模庞大、复杂性高、多样性丰富的数据集合。这些数据通常无法通过传统的数据库管理工具来捕获、存储、管理和处理。大数据的特点包括"3V"&#xff1a; 大量&#xff08;Volume&#xff09;&#xff1a;大数…...

【AI视野·今日Robot 机器人论文速览 第四十一期】Tue, 26 Sep 2023

AI视野今日CS.Robotics 机器人学论文速览 Tue, 26 Sep 2023 Totally 73 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers Extreme Parkour with Legged Robots Authors Xuxin Cheng, Kexin Shi, Ananye Agarwal, Deepak Pathak人类可以通过以高度动态…...

[NOIP2012 提高组] 开车旅行

[NOIP2012 提高组] 开车旅行 题目描述 小 A \text{A} A 和小 B \text{B} B 决定利用假期外出旅行&#xff0c;他们将想去的城市从 $1 $ 到 n n n 编号&#xff0c;且编号较小的城市在编号较大的城市的西边&#xff0c;已知各个城市的海拔高度互不相同&#xff0c;记城市 …...

数据库设计流程---以案例熟悉

案例名字&#xff1a;宠物商店系统 课程来源&#xff1a;点击跳转 信息->概念模型->数据模型->数据库结构模型 将现实世界中的信息转换为信息世界的概念模型&#xff08;E-R模型&#xff09; 业务逻辑 构建 E-R 图 确定三个实体&#xff1a;用户、商品、订单...

Miniconda创建paddlepaddle环境

1、conda env list 2、conda create --name paddle_env python3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ 3、activate paddle_env 4、python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple 5、pip install "p…...

告别鼠标!用Vim打造你的极速编程工作流(含常用脚本编辑配置)

用Vim打造无鼠标编程工作流&#xff1a;从入门到精通的完整指南 作为一名开发者&#xff0c;你是否厌倦了在键盘和鼠标之间来回切换的低效操作&#xff1f;Vim这款诞生于1991年的文本编辑器&#xff0c;凭借其独特的模态编辑理念和全键盘操作方式&#xff0c;至今仍是提升编程…...

C语言完美演绎6-17

/* 范例&#xff1a;6-17 */#include <stdio.h>#include <conio.h>int main(){int a;printf("请输入你的分数(0-100)");scanf("%d",&a);if(a>0) if(a<100) printf("你输入的分数…...

如何快速搭建你的专属Galgame社区:TouchGal一站式解决方案完整指南

如何快速搭建你的专属Galgame社区&#xff1a;TouchGal一站式解决方案完整指南 【免费下载链接】kun-touchgal-next TouchGAL是立足于分享快乐的一站式Galgame文化社区, 为Gal爱好者提供一片净土! 项目地址: https://gitcode.com/gh_mirrors/ku/kun-touchgal-next 你是否…...

【微知】Mellanox网卡配置异常?mlxconfig reset全解与实战场景指南

1. Mellanox网卡配置异常&#xff1f;先别慌 遇到Mellanox网卡配置异常时&#xff0c;很多工程师第一反应是重装驱动或者更换硬件。其实在大多数情况下&#xff0c;用对mlxconfig reset这个神器就能快速解决问题。我处理过上百台配备Mellanox网卡的服务器&#xff0c;发现80%的…...

AIGC技术实操:AI生图、AI视频开发与工具集成

2026年&#xff0c;AIGC技术已从“玩具级应用”走向“产业级工具”&#xff0c;其中AI生图、AI视频成为开发者的热门布局领域&#xff0c;据统计&#xff0c;AIGC/传媒领域商业化进程最快&#xff0c;MCN行业人工智能渗透率超60%&#xff0c;广告行业渗透率达55%。对于开发者而…...

终极指南:如何为Figma安装中文界面插件,让设计工作更高效

终极指南&#xff1a;如何为Figma安装中文界面插件&#xff0c;让设计工作更高效 【免费下载链接】figmaCN 中文 Figma 插件&#xff0c;设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN FigmaCN是一款专为中文用户设计的Figma界面汉化插件&am…...

L-SHADE算法实战:如何用线性种群缩减提升优化性能(附Python代码)

L-SHADE算法实战&#xff1a;如何用线性种群缩减提升优化性能&#xff08;附Python代码&#xff09; 在优化算法的世界里&#xff0c;差分进化&#xff08;Differential Evolution, DE&#xff09;一直以其简单高效著称。但传统DE算法在面对高维复杂问题时&#xff0c;常常陷入…...

新零售系统开发的关键要素

新零售系统开发需要整合线上线下资源&#xff0c;实现数据驱动的智能化运营。以下是核心开发要点&#xff1a;技术架构设计采用微服务架构实现系统模块化&#xff0c;支持高并发场景。前端可选用React/Vue构建跨平台应用&#xff0c;后端推荐Spring Cloud或Node.js。数据库根据…...

告别繁琐配置:用快马AI一键生成企业级gstack项目脚手架,效率提升300%

最近在帮公司搭建一个内部任务管理后台&#xff0c;技术选型上我们决定采用gstack&#xff08;Next.js 14 TypeScript Tailwind CSS Prisma NextAuth&#xff09;。本以为是个简单的初始化工作&#xff0c;结果光是配置各种工具和依赖就花了大半天时间。直到发现了InsCode(…...

G-Helper终极指南:华硕笔记本轻量级性能控制工具完全解析

G-Helper终极指南&#xff1a;华硕笔记本轻量级性能控制工具完全解析 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix,…...