From 3cb3dd6c04591580537e70c20c5fc2288f52a7f0 Mon Sep 17 00:00:00 2001 From: lucasdelimanogueira Date: Wed, 1 May 2024 00:49:07 -0300 Subject: [PATCH] pow backward autograd --- norch/__pycache__/tensor.cpython-38.pyc | Bin 8339 -> 8408 bytes .../__pycache__/functions.cpython-38.pyc | Bin 2229 -> 2686 bytes norch/autograd/functions.py | 9 +++++++++ norch/tensor.py | 8 ++++++-- test.py | 9 ++++----- 5 files changed, 19 insertions(+), 7 deletions(-) diff --git a/norch/__pycache__/tensor.cpython-38.pyc b/norch/__pycache__/tensor.cpython-38.pyc index 058017d20cf4c115f058f367b2cd995dc1ff2cbf..e219f48c5e222b7989c0e42f87fdc4e0960b4821 100644 GIT binary patch delta 239 zcmbR2c*Bu5l$V!_0SJ!nG)z0Yk$0zzG%JwD0>sWhT-*jEN*ER})-Wz)tYw<~P{uHb zX(3ZBa|uf`LoG`Ua}7&8XAMIZ*8=W^3_vy)kj(?6d4M!8kmd!_d_WqAv-padO89FS zY8acDfFc4lEWr##5uU+$EcoL!z+lu{%Ql431V0a8({1^MNv zMNvFpDn7ZSvLLm%$Pg$~WHfo5lmusae7rFu(6v&N&&rCkaxk(n@@#%AE5*p@vH72z MHY20xWG#hE0M)}h=Kufz delta 193 zcmccNIN6aml$V!_0SNAGHcV67$h%W!@+lEsz8s)P3Bv-$8pef;wTzP=${5-+E@Y}@ zDq(46sAaBUs$q`jtYOIFTEM-K0m$Y8vUz|s50K^s(m)){P$U5~M3b+G4@eaWOui^5 zIk`nvS5%XwNChYo#afVGo?2972$D6LyiQ6&zC1qOn2~{@SOh4m6S!N{>$Lr#j3(Pgu&r-(a43Renu3quNbGgB063QsVDChz3+ z%(ff1`?E0z&C|2m=5Vmpo$t delta 108 zcmew-vQ>~Tl$V!_0SNTg8K&K1p2#P|=rvK>lP!fSm_d_!@?K`!jYs|2CZFJlXH=N1 z!MTZ1dGc*e>&Yb?0-Vf6l0bcanyi!cxuhmfW)_yd#bJ}1pHiBWYR3qaDdqqYeC$BT H$;S==`_36> diff --git a/norch/autograd/functions.py b/norch/autograd/functions.py index bbd8907..9bbddf5 100644 --- a/norch/autograd/functions.py +++ b/norch/autograd/functions.py @@ -28,6 +28,15 @@ class ElementwiseMulBackward: def backward(self, gradient): return [gradient * self.input[1], gradient * self.input[0]] +class PowBackward: + def __init__(self, x, power): + self.input = [x] + self.power = power + + def backward(self, gradient): + print(self.input[0], "@@@") + return [(gradient * self.power) * (self.input[0]) ** (self.power - 1)] + class SumBackward: def __init__(self, x): self.input = [x] diff --git a/norch/tensor.py b/norch/tensor.py index b615808..3689357 100644 --- a/norch/tensor.py +++ b/norch/tensor.py @@ -306,12 +306,12 @@ class Tensor: def __pow__(self, power): - power = ctypes.c_float(power) + power_ctypes = ctypes.c_float(power) Tensor._C.pow_tensor.argtypes = [ctypes.POINTER(CTensor), ctypes.c_float] Tensor._C.pow_tensor.restype = ctypes.POINTER(CTensor) - result_tensor_ptr = Tensor._C.pow_tensor(self.tensor, power) + result_tensor_ptr = Tensor._C.pow_tensor(self.tensor, power_ctypes) result_data = Tensor() result_data.tensor = result_tensor_ptr @@ -319,6 +319,10 @@ class Tensor: result_data.ndim = self.ndim result_data.device = self.device + result_data.requires_grad = self.requires_grad + if result_data.requires_grad: + result_data.grad_fn = PowBackward(self, power) + return result_data def sum(self): diff --git a/test.py b/test.py index 93aa5c7..be14ac7 100644 --- a/test.py +++ b/test.py @@ -16,8 +16,6 @@ def matrix_sum(matrix1, matrix2): if __name__ == "__main__": import norch - a = norch.Tensor([[1, 2, 3], [1, 2, 3], [1, 2, 3]], requires_grad=True)#.to("cuda") - b = norch.Tensor([[1, 400, 3], [1, 2, 3], [1, 2, 3]], requires_grad=True) import time import random import numpy as np @@ -29,12 +27,13 @@ if __name__ == "__main__": #d = b-c - c = a*b + a = norch.Tensor([[1, 2, 3], [1, 2, 3], [1, 2, 3]], requires_grad=True)#.to("cuda") + b = norch.Tensor([[1, 400, 3], [1, 2, 3], [1, 2, 3]], requires_grad=True) + c = (a ** 3) d = c.sum() d.backward() - print(c.grad) - #print(a ** 2) + print(a.grad) """#print(a) N = 1000