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 是通过加法操作创建的。 '''