def test_mul(): """Tests that mytorch's elementwise multiplication matches torch's""" # shape of tensor to test shape = (1, 2, 3) # get mytorch and torch tensor: 'a' a = Tensor.randn(*shape) a.requires_grad = True a_torch = get_same_torch_tensor(a) # get mytorch and torch tensor: 'b' b = Tensor.randn(*shape) b.requires_grad = True b_torch = get_same_torch_tensor(b) # run mytorch and torch forward: 'c = a * b' ctx = ContextManager() c = Mul.forward(ctx, a, b) c_torch = a_torch * b_torch # run mytorch and torch multiplication backward back = Mul.backward(ctx, Tensor.ones(*shape)) c_torch.sum().backward() # check that c matches assert check_val_and_grad(c, c_torch) # check that dc/da and dc/db respectively match assert check_val(back[0], a_torch.grad) assert check_val(back[1], b_torch.grad) # ensure * is overridden c_using_override = a * b assert check_val(c_using_override, c_torch) return True
def test_matmul(): """Tests that mytorch's matmul multiplication matches torch's""" # shape of tensor to test shape1 = (3, 4) shape2 = (4, 5) shape = (3, 5) # get mytorch and torch tensor: 'a' a = Tensor.randn(*shape1) a.requires_grad = True a_torch = get_same_torch_tensor(a) # get mytorch and torch tensor: 'b' b = Tensor.randn(*shape2) b.requires_grad = True b_torch = get_same_torch_tensor(b) # run mytorch and torch forward: 'c = a * b' ctx = ContextManager() c = matmul.forward(ctx, a, b) c_torch = torch.matmul(a_torch, b_torch) # run mytorch and torch multiplication backward back = matmul.backward(ctx, Tensor.ones(*shape)) c_torch.sum().backward() # check that c matches assert check_val_and_grad(c, c_torch) # check that dc/da and dc/db respectively match assert check_val(back[0], a_torch.grad) assert check_val(back[1], b_torch.grad) return True
def test_sub(): """Tests that mytorch subtraction matches torch's subtraction""" # shape of tensor to test shape = (1, 2, 3) # get mytorch and torch tensor: 'a' a = Tensor.randn(*shape) a.requires_grad = True a_torch = get_same_torch_tensor(a) # get mytorch and torch tensor: 'b' b = Tensor.randn(*shape) b.requires_grad = True b_torch = get_same_torch_tensor(b) # run mytorch and torch forward: 'c = a - b' ctx = ContextManager() c = Sub.forward(ctx, a, b) c_torch = a_torch - b_torch # run mytorch and torch subtraction backward back = Sub.backward(ctx, Tensor.ones(*shape)) c_torch.sum().backward() # check that c matches assert check_val_and_grad(c, c_torch) # check that dc/da and dc/db respectively match assert check_val(back[0], a_torch.grad) # print(f'Sub back[1] == {back[1]} and back[0] == {back[0]} and b_torch.grad == {b_torch.grad}') assert check_val(back[1], b_torch.grad) # ensure - is overridden c_using_override = a - b assert check_val(c_using_override, c_torch) return True