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