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

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

import numpy as np

class 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_op
        self.creators = creators
        self.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 = grad

        if (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.kler.cn/a/559095.html

相关文章:

  • Seata 分布式事务框架:从下载到实战配置全解析
  • 网页制作07-html,css,javascript初认识のhtml添加多媒体
  • 【Linux网络】认识协议(TCP/UDP)、Mac/IP地址和端口号、网络字节序、socket套接字
  • Blaze RangePartitioning 算子Native实现全解析
  • 现场可以通过手机或者pad实时拍照上传到大屏幕的照片墙现场大屏电子照片墙功能
  • Lua | 每日一练 (3)
  • vue文件没有name属性怎么被调用
  • 游戏开发 游戏开始界面
  • 【Blender】二、建模篇--06,曲线建模/父子级和蒙皮修改器
  • 简识MQ之Kafka、ActiveMQ、RabbitMQ、RocketMQ传递机制
  • MQTT实现智能家居------3、源码分析(超详细)
  • AI性能极致体验:通过阿里云平台高效调用满血版DeepSeek-R1模型
  • 浏览器下载vue.js.devtools,谷歌浏览器和edg浏览器
  • 什么是HTTP/2协议?NGINX如何支持HTTP/2并提升网站性能?
  • 使用 AndroidNativeEmu 调用 JNI 函数
  • Python爬虫处理网页中的动态内容
  • 嵌入式硬件篇---数字电子技术中的时序逻辑
  • GeoHD - 一种用于智慧城市热点探测的Python工具箱
  • GPU和FPGA的区别
  • opencv 自适应阈值