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

server/2025/2/25 21:30:04/
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/server/170612.html

相关文章

AI时代医疗大健康微服务编程提升路径和具体架构设计

一、引言 1.1 研究背景与意义 随着科技的飞速发展,人工智能(Artificial Intelligence,AI)已逐渐渗透至各个领域,医疗大健康领域亦不例外。人工智能与医疗大健康的融合,正引领着医疗行业迈向智能化、精准化、个性化的新时代,为解决医疗资源分布不均、提升医疗服务效率和…

C++程序员内功修炼——Linux C/C++编程技术汇总

在软件开发的宏大版图中&#xff0c;C 语言宛如一座巍峨的高山&#xff0c;吸引着无数开发者攀登探索。而 Linux 操作系统&#xff0c;以其开源、稳定、高效的特性&#xff0c;成为了众多开发者钟爱的开发平台。将 C 与 Linux 相结合&#xff0c;就如同为开发者配备了一把无坚不…

基于级联前向反向传播神经网络(FCBP)的数据回归预测【MATLAB】

级联前向反向传播神经网络&#xff08;Feedforward and Cascade Backpropagation Propagation Neural Network, FCBP&#xff09;是一种针对传统BP神经网络缺陷改进的深度学习模型。其核心通过级联连接结构和动态传播机制&#xff0c;显著提升了非线性建模能力与训练效率。 一…

TCP fast open

TCP Fast Open 复用 Cookie 快速恢复会话&#xff0c;减少 1 个 RTT 的延迟 传统 TCP 三次握手需 1.5 RTT才能传输应用数据&#xff0c;导致 HTTP 请求延迟较高 TCP Fast Open&#xff1a;为了解决传统 TCP 握手中的延迟问题&#xff0c;通过允许在首次 SYN 握手阶段携带应用数…

【C】堆的应用1 -- 堆排序

之前学习了堆&#xff0c;堆的一棵以顺序结构存储的完全二叉树&#xff0c;堆本身又氛围大根堆和小根堆&#xff0c;假设以大根堆为例&#xff0c;由于堆顶部元素是一棵二叉树里面最大的元素&#xff0c;所以如果每次都取堆顶的元素&#xff0c;那么取出的元素就是一个降序排列…

前端Sass面试题及参考答案

目录 什么是 Sass? Sass 和 CSS 的主要区别是什么? Sass 中如何处理列表? Sass 中如何处理映射(map)? Sass 中如何使用函数? Sass 中如何使用内置函数? Sass 中如何设置默认值? Sass 中的 @function 和 @mixin 有什么区别? Sass 中如何实现模块化? Sass 中…

深度学习之图像分类(二)

前言 文章主要是通过实战项目——食品分类来理解分类项目的整体流程。除此之外&#xff0c;还需要对半监督学习&#xff0c;迁移学习&#xff0c;数据增广&#xff0c;Adam和AdamW进行了解。 数据增广 图片增广&#xff08;Image Data Augmentation&#xff09;是深度学习中一种…

STM32CUBEIDE FreeRTOS操作教程(十三):task api 任务访问函数

STM32CUBEIDE FreeRTOS操作教程&#xff08;十三&#xff09;&#xff1a;task api 任务访问函数 STM32CUBE开发环境集成了STM32 HAL库进行FreeRTOS配置和开发的组件&#xff0c;不需要用户自己进行FreeRTOS的移植。这里介绍最简化的用户操作类应用教程。以STM32F401RCT6开发板…