37、深度学习-自学之路-自己搭建深度学习框架-2、自动梯度计算

news/2025/2/23 5:48:23/
import numpy as npclass Tensor(object):'''import numpy as np:导入 numpy 库,用于处理数组相关操作。class Tensor(object):定义了一个名为 Tensor 的类,继承自 object。__init__ 方法是类的构造函数,用于初始化 Tensor 对象:self.data = np.array(data):将传入的 data 转换为 numpy 数组并存储在 self.data 中。self.creation_op = creation_op:记录创建该张量所使用的操作,默认为 None。self.creators = creators:记录创建该张量的其他张量,默认为 None。self.grad = None:用于存储该张量的梯度,初始化为 None。'''def __init__(self, data, creators=None, creation_op=None):self.data = np.array(data)self.creation_op = creation_opself.creators = creatorsself.grad = None'''backward 方法用于执行反向传播,计算梯度:self.grad = grad:将传入的梯度 grad 赋值给当前张量的 self.grad。if (self.creation_op == "add"):如果该张量是通过加法操作创建的:self.creators[0].backward(grad) 和 self.creators[1].backward(grad):将梯度 grad 传递给创建该张量的两个父张量,继续进行反向传播。'''def backward(self, grad):self.grad = gradif (self.creation_op == "add"):self.creators[0].backward(grad)self.creators[1].backward(grad)'''__add__ 方法重载了加法运算符 +:创建一个新的 Tensor 对象,其数据为当前张量和 other 张量的数据之和。creators=[self, other]:记录创建新张量的两个父张量。creation_op="add":记录创建新张量使用的操作是加法。'''def __add__(self, other):return Tensor(self.data + other.data, creators=[self, other], creation_op="add")'''__repr__ 和 __str__ 方法分别定义了对象的字符串表示形式,用于方便打印和调试。'''def __repr__(self):return str(self.data.__repr__())def __str__(self):return str(self.data.__str__())#创建两个 Tensor 对象 x 和 y。
x = Tensor([1,2,3,4,5])
y = Tensor([2,2,2,2,2])#z = x + y:对 x 和 y 进行加法运算,得到新的 Tensor 对象 z。
z = x + y#z.backward(Tensor(np.array([1,1,1,1,1]))):从 z 开始进行反向传播,传入初始梯度 [1, 1, 1, 1, 1]。
z.backward(Tensor(np.array([1,1,1,1,1])))#最后打印出 x 和 y 的梯度,以及 z 的创建者和创建操作。
print(x.grad)
print(y.grad)
print(z.creators)
print(z.creation_op)'''运行结果:
[1 1 1 1 1]
[1 1 1 1 1]
[array([1, 2, 3, 4, 5]), array([2, 2, 2, 2, 2])]
add
''''''
代码运行结果分析
x.grad 和 y.grad 的输出都会是 [1 1 1 1 1]。因为在加法操作的反向传播中,梯度会原封不动地传递给参与加法的两个父张量。
也就是说,z 的梯度会直接传递给 x 和 y。z.creators 会输出 [<__main__.Tensor object at 0x...>, <__main__.Tensor object at 0x...>],
显示创建 z 的两个父张量对象。z.creation_op 会输出 add,表明 z 是通过加法操作创建的。
'''

http://www.ppmy.cn/news/1574355.html

相关文章

哈希表(C语言版)

文章目录 哈希表原理实现(无自动扩容功能)代码运行结果 分析应用 哈希表 如何统计一段文本中&#xff0c;小写字母出现的次数? 显然&#xff0c;我们可以用数组 int table[26] 来存储每个小写字母出现的次数&#xff0c;而且这样处理&#xff0c;效率奇高。假如我们想知道字…

遗传算法(GA)是一种基于自然选择和遗传学原理的搜索和优化技术,可以用于调整条件生成对抗网络(cGAN)的参数。

遗传算法&#xff08;GA&#xff09;是一种基于自然选择和遗传学原理的搜索和优化技术&#xff0c;可以用于调整条件生成对抗网络&#xff08;cGAN&#xff09;的参数。以下是使用遗传算法为cGAN调参的步骤&#xff1a; 1. 定义适应度函数 适应度函数是遗传算法的核心&#x…

MySQL登录问题总结

不管何种数据库&#xff0c;使用的第一步都是先登录。 MySQL命令行登录语句&#xff1a;mysql -u username -P port -p -D database_name 登录MySQL的报错一般从报错信息都能得到反馈&#xff0c;常见报错原因分析如下&#xff0c;实例中的以test用户为例&#xff0c;登录环境为…

Flask flash() 消息示例

目录 安装 Flask 入门:Flask flash() 基本示例 进阶:使用 Flask-WTF Flash 登录结果消息 详解:get_flashed_messages() 详解:flash() 消息的完整生命周期 Flask 提供 flash() 用于向 用户传递临时消息,通常用于: • 表单提交成功或失败 • 用户登录、注册、退出提…

23种设计模式之《组合模式(Composite)》在c#中的应用及理解

程序设计中的主要设计模式通常分为三大类&#xff0c;共23种&#xff1a; 1. 创建型模式&#xff08;Creational Patterns&#xff09; 单例模式&#xff08;Singleton&#xff09;&#xff1a;确保一个类只有一个实例&#xff0c;并提供全局访问点。 工厂方法模式&#xff0…

TIP: Flex-DLD

Article: Flex-DLD: Deep Low-Rank Decomposition Model With Flexible Priors for Hyperspectral Image Denoising and Restoration, 2024 TIP. 文章的主要思想是用network来学low-rank decomposition的两个matrix&#xff08;input是random input&#xff09;. 文章的framew…

Perl 面向对象编程指南

Perl 面向对象编程指南 引言 Perl 是一种强大的编程语言&#xff0c;以其灵活性和强大的文本处理能力而闻名。随着软件工程的发展&#xff0c;面向对象编程&#xff08;OOP&#xff09;已经成为现代编程的主流。本文将深入探讨 Perl 的面向对象编程&#xff0c;包括其基本概念…

Vue3+element UI:使用el-dialog时,对话框不出现解决方案

​​​​ 解决方案&#xff1a;在<el-dialog>标签中&#xff0c;添加:append-to-body“true”*&#xff0c;对话框即可弹出。*