求导的过程可以看做是二叉树的形式的计算图(两个输入得到一个输出,输出在与其他输入得到另一个中间输出,以此类推直到计算结束),从二叉树的根节点开始计算导数/梯度
直接上代码
class Tensor:
__module__ = 'builtins'
def __init__(self, data, left=None, right=None, op = None, name=None, dtype=None):
self.data = data
self.grad = 0
self.left = left
self.right = right
self.op = op
self.name = name
self.dtype = dtype
def __str__(self):
return '{}([{}])'.format(self.__class__.__name__, self.data)
def __repr__(self):
return 'Tensor([{}])'.format(self.data)
def __add__(self, other):
data = self.data + other.data
return Tensor(data, self, other, op='add')
def __sub__(self, other):
data = self.data - other.data
return Tensor(data,left = self,right=other,op = "sub"