def test_release(): def check(f): n = 0 d = None for i in range(3): f() m = len(gc.get_objects()) d = m - n n = m assert d == 0 x = TensorWrapper([0.0]) dy = TensorWrapper(np.ones_like(x.numpy())) @check def _(): g = Grad().wrt(x) y = x * x g(y, dy) @check def _(): with Grad().wrt(x) as g: pass @check def _(): with Grad().wrt(x) as g: y = x * x
def test_elemwise_add(): x_np = np.random.rand(10).astype("float32") y_np = np.random.rand(10, 10).astype("float32") dz_np = np.random.rand(10, 10).astype("float32") x = TensorWrapper(x_np) y = TensorWrapper(y_np) dz = TensorWrapper(dz_np) refs = {} def f(x, y): x = x * 2 refs["x"] = weakref.ref(x.__wrapped__) refs["y"] = weakref.ref(y.__wrapped__) return x + y grad = Grad().wrt(x, callback=save_to(x)) z = f(x, y) del y for k, r in refs.items(): assert r() is None grad(z, dz) np.testing.assert_almost_equal(x.grad.numpy(), dz_np.sum(0) * 2, decimal=5)
def test_set_subtensor(): x = TensorWrapper([1, 2, 3]) x[:] = [1, 1, 1] np.testing.assert_almost_equal(x.numpy(), [1, 1, 1], decimal=6) x[[0, 2]] = [3, 2] np.testing.assert_almost_equal(x.numpy(), [3, 1, 2], decimal=6) x[1:3] = [4, 5] np.testing.assert_almost_equal(x.numpy(), [3, 4, 5], decimal=6)
def test_reshape(): x_np = np.random.rand(2, 5).astype("float32") x = TensorWrapper(x_np) grad = Grad().wrt(x, callback=save_to(x)) y = x.reshape(5, 2) grad(y, F.ones_like(y)) np.testing.assert_equal(np.ones((2, 5), dtype=np.float32), x.grad.numpy())
def test_Reduce_mean(): x_np = np.random.rand(3, 3).astype("float32") x = TensorWrapper(x_np) grad = Grad().wrt(x, callback=save_to(x)) y = x.mean(axis=0) grad(y, F.ones_like(y)) np.testing.assert_equal(np.ones((3, 3), dtype=np.float32) / 3, x.grad.numpy())
def test_grad_inplace(): x_np = np.random.rand(10).astype("float32") x = TensorWrapper(x_np) grad = Grad().wrt(x, callback=save_to(x)) y = mul(x, x) y *= y grad(y, TensorWrapper(np.ones_like(x_np))) np.testing.assert_almost_equal(x.grad.numpy(), 4 * x_np ** 3, decimal=6)
def test_as_type(): x = TensorWrapper([1, 2, 3], dtype=np.float32) y = x.astype(qint8(0.1)) np.testing.assert_almost_equal(get_scale(y.dtype), 0.1) z = y.astype(qint8(0.2)) np.testing.assert_almost_equal(get_scale(z.dtype), 0.2) a = z.astype(quint8(0.3, 127)) np.testing.assert_almost_equal(get_scale(a.dtype), 0.3) np.testing.assert_equal(get_zero_point(a.dtype), 127) b = a.astype(quint8(0.3, 128)) np.testing.assert_almost_equal(get_scale(b.dtype), 0.3) np.testing.assert_equal(get_zero_point(b.dtype), 128)
def test_x(x_np): for m in ["sum", "prod", "min", "max", "mean"]: x = TensorWrapper(x_np) y = getattr(x, m)(axis=-1, keepdims=True) np.testing.assert_almost_equal(y.numpy(), getattr(x_np, m)(-1), decimal=6)
def test_computing_with_numpy_array(): x = np.array([1, 2, 3], dtype=np.int32) xx = TensorWrapper(x, device="cpu0") y = np.array([1, 0, 3], dtype=np.int32) assert np.add(xx, y).device == xx.device np.testing.assert_equal(np.add(xx, y).numpy(), np.add(x, y)) np.testing.assert_equal(np.equal(xx, y).numpy(), np.equal(x, y)) np.testing.assert_equal(np.equal(xx, xx).numpy(), np.equal(x, x))
def test_Broadcast(): x_np = np.random.rand(3, 3, 1).astype("float32") x = TensorWrapper(x_np) grad = Grad().wrt(x, callback=save_to(x)) y = F.broadcast_to(x, (3, 3, 10)) grad(y, F.ones_like(y)) np.testing.assert_equal(np.ones((3, 3, 1), dtype=np.float32) * 10, x.grad.numpy())
def test_AxisAddRemove(): x_np = np.random.rand(1, 5).astype("float32") x = TensorWrapper(x_np) grad = Grad().wrt(x, callback=save_to(x)) y = F.squeeze(F.expand_dims(x, 2), 0) grad(y, F.ones_like(y)) np.testing.assert_equal(np.array([[1, 1, 1, 1, 1]], dtype=np.float32), x.grad.numpy())
def test_subtensor(): x_np = np.random.rand(3, 3).astype("float32") x = TensorWrapper(x_np) grad = Grad().wrt(x, callback=save_to(x)) y = x[1:-1, :2] grad(y, F.ones_like(y)) np.testing.assert_equal( np.array([[0, 0, 0], [1, 1, 0], [0, 0, 0]], dtype=np.float32), x.grad.numpy() )
def test_IndexingMultiAxisVec(): x_np = np.random.rand(3, 3).astype("float32") x = TensorWrapper(x_np) grad = Grad().wrt(x, callback=save_to(x)) y = x[[0, 2], [0, 2]] grad(y, F.ones_like(y)) np.testing.assert_equal( np.array([[1, 0, 0], [0, 0, 0], [0, 0, 1]], dtype=np.float32), x.grad.numpy() )
def test_elemwise_relu(): x_np = [1.0, -1.0] dz_np = [1.0] x = TensorWrapper(x_np) dz = TensorWrapper(dz_np) refs = {} def f(x): x = x * 2 refs["x"] = weakref.ref(x.__wrapped__) return relu(x) grad = Grad().wrt(x, callback=save_to(x)) z = f(x) assert refs["x"]() is None grad(z, dz) np.testing.assert_almost_equal(x.grad.numpy(), [2.0, 0])
def test_transpose(): x = np.random.rand(2, 5).astype("float32") xx = TensorWrapper(x) np.testing.assert_almost_equal(xx.T.numpy(), x.T)
def test_matmul(): A = TensorWrapper(np.random.rand(5, 7).astype("float32")) B = TensorWrapper(np.random.rand(7, 10).astype("float32")) C = A @ B np.testing.assert_almost_equal(C.numpy(), A.numpy() @ B.numpy(), decimal=6)
def test_literal_arith(): x_np = np.random.rand(10).astype("float32") x = TensorWrapper(x_np) y = x * 2 y_np = y.numpy() np.testing.assert_almost_equal(y_np, x_np * 2)
def test_basic(): x_np = np.random.rand(10).astype("float32") x = TensorWrapper(x_np) y = x * x y_np = y.numpy() np.testing.assert_almost_equal(y_np, x_np * x_np)