コード例 #1
0
        public void zeros4D()
        {
            var a = alb.zeros(new int[] { 3, 2, 1, 1 });

            AssertTools.ArrayIsEqual(a.Shape, new int[] { 3, 2, 1, 1 });
            AssertTools.ArrayIsEqual(a.dataSync(), new float[] { 0, 0, 0, 0, 0, 0 });
        }
コード例 #2
0
        public void tidyreturntensors()
        {
            ENV.engine = new Engine();
            int current = ENV.engine.memory().numTensors;

            alb.tidy(() =>
            {
                current = ENV.engine.memory().numTensors;
                var a   = alb.tensor1d(alb.data(1, 2, 3));
                var b   = alb.tensor1d(alb.data(0, 0, 0));
                Assert.AreEqual(current + 2, ENV.engine.memory().numTensors);

                alb.tidy(() =>
                {
                    var result = alb.tidy(() =>
                    {
                        b = alb.addStrict(a, b);
                        b = alb.addStrict(a, b);
                        b = alb.addStrict(a, b);
                        return(alb.add(a, b));
                    });

                    // result is new. All intermediates should be disposed.
                    Assert.AreEqual(current + 2 + 1, ENV.engine.memory().numTensors);
                    AssertTools.ArrayIsEqual(result.ToArray(), alb.data(4, 8, 12));
                });

                // a, b are still here, result should be disposed.
                Assert.AreEqual(ENV.engine.memory().numTensors, current + 2);
            });

            Assert.AreEqual(current + 0, ENV.engine.memory().numTensors);
        }
コード例 #3
0
        public void ones4D()
        {
            var a = alb.ones(new int[] { 3, 2, 1, 1 });

            AssertTools.ArrayIsEqual(a.Shape, new int[] { 3, 2, 1, 1 });
            AssertTools.ArrayIsEqual(a.dataSync(), new float[] { 1, 1, 1, 1, 1, 1 });
        }
コード例 #4
0
        public void tilepropagatesNaNs()
        {
            var t  = alb.tensor1d(alb.data(1, 2, float.NaN));
            var t2 = alb.tile(t, alb.shape(2));

            AssertTools.ArrayIsEqual(t2.Shape, alb.shape(6));
            AssertTools.ArrayIsEqual(t2, alb.data(1, 2, float.NaN, 1, 2, float.NaN));
        }
コード例 #5
0
        public void gather1d()
        {
            var t  = alb.tensor1d(alb.data(1, 2, 3));
            var t2 = alb.gather(t, alb.tensor1d(alb.data(0, 2, 0, 1)), 0);

            AssertTools.ArrayIsEqual(t2.Shape, alb.shape(4));
            AssertTools.ArrayIsEqual(t2, alb.data(1, 3, 1, 2));
        }
コード例 #6
0
        public void tile3D()
        {
            var t  = alb.tensor3d(alb.data(1, 2, 3, 4, 5, 6, 7, 8), 2, 2, 2);
            var t2 = alb.tile(t, alb.shape(1, 2, 1));

            AssertTools.ArrayIsEqual(t2.Shape, alb.shape(2, 4, 2));
            AssertTools.ArrayIsEqual(t2, alb.data(1, 2, 3, 4, 1, 2, 3, 4, 5, 6, 7, 8, 5, 6, 7, 8));
        }
コード例 #7
0
        public void onesLike4d()
        {
            var a = alb.tensor4d(new float[] { 1, 2, 3, 4 }, 2, 2, 1, 1);
            var b = alb.onesLike(a);

            AssertTools.ArrayIsEqual(b.Shape, new int[] { 2, 2, 1, 1 });
            AssertTools.ArrayIsEqual(b.dataSync(), new float[] { 1, 1, 1, 1 });
        }
コード例 #8
0
        public void tile1d()
        {
            var t  = alb.tensor1d(alb.data(1, 2, 3));
            var t2 = alb.tile(t, alb.shape(2));

            AssertTools.ArrayIsEqual(t2.Shape, alb.shape(6));
            AssertTools.ArrayIsEqual(t2, alb.data(1, 2, 3, 1, 2, 3));
        }
コード例 #9
0
        public void zeros2D()
        {
            ENV.engine = new Engine();
            var a = alb.zeros(new int[] { 3, 2 });

            AssertTools.ArrayIsEqual(a.Shape, new int[] { 3, 2 });
            AssertTools.ArrayIsEqual(a.dataSync(), new float[] { 0, 0, 0, 0, 0, 0 });
        }
コード例 #10
0
        public void zerosLike2d()
        {
            var a = alb.tensor2d(new float[] { 1, 2, 3, 4 }, 2, 2);
            var b = alb.zerosLike(a);

            AssertTools.ArrayIsEqual(b.Shape, new int[] { 2, 2 });
            AssertTools.ArrayIsEqual(b.dataSync(), new float[] { 0, 0, 0, 0 });
        }
コード例 #11
0
        public void gather3D()
        {
            var t  = alb.tensor3d(alb.data(1, 2, 3, 4, 5, 6, 7, 8), 2, 2, 2);
            var t2 = alb.gather(t, alb.tensor1d(alb.data(1, 0, 0, 1)), 2);

            AssertTools.ArrayIsEqual(t2.Shape, alb.shape(2, 2, 4));
            AssertTools.ArrayIsEqual(t2, alb.data(2, 1, 1, 2, 4, 3, 3, 4, 6, 5, 5, 6, 8, 7, 7, 8));
        }
コード例 #12
0
ファイル: engine_test.cs プロジェクト: mashmawy/AlbiruniML
        public void gradsf()
        {
            ENV.engine = new Engine();
            var grad   = alb.grads(x => x[0].square());
            var result = grad(new Tensor[] { alb.tensor1d(new float[] { .1f, .2f }) }, null);

            AssertTools.ArrayIsEqual(result[0].dataSync(), new float[] { .2f, .4f });
        }
コード例 #13
0
        public void gatherpropagatesNaNs()
        {
            var t  = alb.tensor1d(alb.data(1, 2, float.NaN));
            var t2 = alb.gather(t, alb.tensor1d(alb.data(0, 2, 0, 1)), 0);

            AssertTools.ArrayIsEqual(t2.Shape, alb.shape(4));
            AssertTools.ArrayIsEqual(t2, alb.data(1, float.NaN, 1, 2));
        }
コード例 #14
0
        public void oneHotDepth2onValue3offValue_minus_2()
        {
            var indices = alb.tensor1d(alb.data(0, 1));
            var res     = alb.oneHot(indices, 2, 3, -2);

            AssertTools.ArrayIsEqual(res.Shape, alb.shape(2, 2));

            AssertTools.TensorIsEqual(res, alb.data(3, -2, -2, 3).ToTensor(2, 2));
        }
コード例 #15
0
        public void gatherchaining()
        {
            var x = alb.zeros(alb.shape(2, 4, 6));
            // [0, 2, 4]
            var indices = alb.range(0, 6, 2);
            var axis    = 2;

            AssertTools.ArrayIsEqual(x.gather(indices, axis).Shape, alb.shape(2, 4, 3));
        }
コード例 #16
0
        public void oneHotDepth3events4()
        {
            var indices = alb.tensor1d(alb.data(2, 1, 2, 0));
            var res     = alb.oneHot(indices, 3);

            AssertTools.ArrayIsEqual(res.Shape, alb.shape(4, 3));

            AssertTools.TensorIsEqual(res, alb.data(0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0).ToTensor(4, 3));
        }
コード例 #17
0
        public void oneHotDepth2transposeddiagonal()
        {
            var indices = alb.tensor1d(alb.data(1, 0));
            var res     = alb.oneHot(indices, 2);

            AssertTools.ArrayIsEqual(res.Shape, alb.shape(2, 2));

            AssertTools.TensorIsEqual(res, alb.data(0, 1, 1, 0).ToTensor(2, 2));
        }
コード例 #18
0
        public void oneHotOut_of_range_events_do_not_trigger_onValue()
        {
            ENV.engine = new Engine();
            var indices = alb.tensor1d(alb.data(-1, 5, 12345));
            var res     = alb.oneHot(indices, 5);

            AssertTools.ArrayIsEqual(res.Shape, alb.shape(3, 5));

            AssertTools.TensorIsEqual(res, alb.data(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0).ToTensor(3, 5));
        }
コード例 #19
0
ファイル: engine_test.cs プロジェクト: mashmawy/AlbiruniML
        public void calling_gradf_twice_works()
        {
            ENV.engine = new Engine();
            var grad    = alb.grad(x => x.square());
            var result  = grad(alb.tensor1d(new float[] { .1f, .2f }), null);
            var result2 = grad(alb.tensor1d(new float[] { .1f, .4f }), null);

            AssertTools.ArrayIsEqual(result.dataSync(), new float[] { .2f, .4f });
            AssertTools.ArrayIsEqual(result2.dataSync(), new float[] { .2f, .8f });
        }
コード例 #20
0
        public void tile1dgradient()
        {
            var t  = alb.tensor1d(alb.data(1, 2, 3));
            var dy = alb.tensor1d(alb.data(0.1f, 0.2f, 0.3f, 1, 2, 3, 10, 20, 30));

            var grad = alb.grad((Tensor x) => { return(alb.tile(x, alb.shape(3))); });
            var d    = grad(t, dy);

            AssertTools.ArrayIsEqual(d, alb.data(11.1f, 22.2f, 33.3f));
        }
コード例 #21
0
        public void gather2d()
        {
            var t  = alb.tensor2d(alb.data(1, 11, 2, 22), 2, 2);
            var t2 = alb.gather(t, alb.tensor1d(alb.data(1, 0, 0, 1)), 0);

            AssertTools.ArrayIsEqual(t2.Shape, alb.shape(4, 2));
            AssertTools.ArrayIsEqual(t2, alb.data(2, 22, 1, 11, 1, 11, 2, 22));

            t2 = alb.gather(t, alb.tensor1d(alb.data(1, 0, 0, 1)), 1);
            AssertTools.ArrayIsEqual(t2.Shape, alb.shape(2, 4));
            AssertTools.ArrayIsEqual(t2, alb.data(11, 1, 1, 11, 22, 2, 2, 22));
        }
コード例 #22
0
        public void gather1dgradient()
        {
            var t = alb.tensor1d(alb.data(1, 2, 3));

            var indices = alb.tensor1d(alb.data(0, 2, 0, 1));
            var dy      = alb.tensor1d(alb.data(3, 4, 5, 6));

            var grad = alb.grad((Tensor x) => { return(alb.gather(x, indices)); });
            var d    = grad(t, dy);

            AssertTools.ArrayIsEqual(d, alb.data(8, 6, 4));
        }
コード例 #23
0
ファイル: engine_test.cs プロジェクト: mashmawy/AlbiruniML
        public void grads_grads_f()
        {
            ENV.engine = new Engine();

            var gradgrad = alb.grads((Tensor[] x) =>
            {
                return(alb.grads(x2 => x2[0].mul(x2[0]).mul(x2[0]))(x, null)[0]);
            }
                                     );


            var result = gradgrad(new Tensor[] { alb.tensor1d(new float[] { .1f, .2f }) }, null);

            AssertTools.ArrayIsEqual(result[0].dataSync(), new float[] { .6f, 1.2f });
        }
コード例 #24
0
ファイル: engine_test.cs プロジェクト: mashmawy/AlbiruniML
        public void grad_grad_f()
        {
            ENV.engine = new Engine();

            var gradgrad = alb.grad((Tensor x) =>
            {
                return(alb.grad(x2 => x2.mul(x2).mul(x2))(x, null));
            }
                                    );


            var result = gradgrad(alb.tensor1d(new float[] { .1f, .2f }), null);

            AssertTools.ArrayIsEqual(result.dataSync(), new float[] { .6f, 1.2f });
        }
コード例 #25
0
        public void gather2dgradient4_1()
        {
            var t       = alb.tensor2d(alb.data(1, 11, 2, 22), 4, 1);
            var indices = alb.tensor1d(alb.data(1, 0, 0, 1));
            var dy      = alb.tensor2d(alb.data(23, 7, 19, 13), 4, 1);
            var axis    = 0;

            var grad = alb.grad((Tensor x) => { return(alb.gather(x, indices, axis)); });
            var d    = grad(t, dy);


            AssertTools.ArrayIsEqual(t.Shape, d.Shape);

            AssertTools.TensorIsEqual(d, alb.data(26, 36, 0, 0).ToTensor(4, 1));
        }
コード例 #26
0
        public void gather2dgradient2_2()
        {
            var t       = alb.tensor2d(alb.data(1, 11, 2, 22), 2, 2);
            var indices = alb.tensor1d(alb.data(1, 0, 0, 1));
            var dy      = alb.tensor2d(alb.data(3, 4, 5, 6, 7, 8, 9, 10), 2, 4);
            var axis    = 1;

            var grad = alb.grad((Tensor x) => { return(alb.gather(x, indices, axis)); });
            var d    = grad(t, dy);


            AssertTools.ArrayIsEqual(t.Shape, d.Shape);

            AssertTools.TensorIsEqual(d, alb.data(9, 9, 17, 17).ToTensor(4, 1));
        }
コード例 #27
0
ファイル: engine_test.cs プロジェクト: mashmawy/AlbiruniML
        public void does_not_error_if_irrelevant_pruned_ops_are_missing_grads()
        {
            ENV.engine = new Engine();
            var a = alb.tensor1d(new float[] { 1, 1 });
            var b = alb.tensor1d(new float[] { 0, 1 });


            var da = alb.grad(aI =>
            {
                // Logical has no gradients, but it is irrelevant.
                aI.logicalAnd(b);
                return(aI.sum());
            })(a, null);

            AssertTools.ArrayIsEqual(da.dataSync(), new float[] { 1, 1 });
        }
コード例 #28
0
ファイル: engine_test.cs プロジェクト: mashmawy/AlbiruniML
        public void works_with_reshape()
        {
            ENV.engine = new Engine();
            var a        = alb.data(1, 2, 3, 4).ToTensor(2, 2);
            var exponent = alb.data(2, 2, 2, 2).ToTensor();

            var da = alb.grad(aI =>
            {
                var b = aI.flatten();
                var m = alb.pow(b, exponent);
                return(alb.sum(m));
            })(a, null);

            AssertTools.ArrayIsEqual(da.Shape, new int[] { 2, 2 });
            AssertTools.ArrayIsEqual(da.dataSync(), new float[] { 2, 4, 6, 8 });
        }
コード例 #29
0
        public void tile2d()
        {
            var t  = alb.tensor2d(alb.data(1, 11, 2, 22), 2, 2);
            var t2 = alb.tile(t, alb.shape(1, 2));

            AssertTools.ArrayIsEqual(t2.Shape, alb.shape(2, 4));
            AssertTools.ArrayIsEqual(t2, alb.data(1, 11, 1, 11, 2, 22, 2, 22));

            t2 = alb.tile(t, alb.shape(2, 1));
            AssertTools.ArrayIsEqual(t2.Shape, alb.shape(4, 2));
            AssertTools.ArrayIsEqual(t2, alb.data(1, 11, 2, 22, 1, 11, 2, 22));


            t2 = alb.tile(t, alb.shape(2, 2));
            AssertTools.ArrayIsEqual(t2.Shape, alb.shape(4, 4));
            AssertTools.ArrayIsEqual(t2, alb.data(1, 11, 1, 11, 2, 22, 2, 22, 1, 11, 1, 11, 2, 22, 2, 22));
        }
コード例 #30
0
ファイル: engine_test.cs プロジェクト: mashmawy/AlbiruniML
        public void gradients()
        {
            ENV.engine = new Engine();
            var a = alb.tensor2d(new float[] { -1, 2, -3, 10, -20, 30 }, 2, 3);
            var b = alb.tensor2d(new float[] { 2, -3, 4, -1, 2, -3 }, 3, 2);

            var grads = alb.grads((Tensor[] x) =>
            {
                var aI = x[0];
                var bI = x[1];
                // m = dot(a, b)
                // y = relu(m)
                // e = sum(y)
                var m = alb.matMul(aI, bI);
                var y = alb.relu(m);
                return(alb.sum(y));
            })(new Tensor[] { a, b }, null);

            var da = grads[0];
            var db = grads[1];

            // de/dy = 1
            // dy/dm = step(m)
            // de/dm = de/dy * dy/dm = step(m)
            var dedm = alb.step(alb.matMul(a, b));

            // de/da = dot(de/dy, bT)

            AssertTools.ArrayIsEqual(da.Shape, a.Shape);

            var transposeA = false;
            var transposeB = true;

            AssertTools.TensorIsEqual(da, alb.matMul(dedm, b, transposeA, transposeB));



            AssertTools.ArrayIsEqual(db.Shape, b.Shape);
            transposeA = true;
            transposeB = false;

            AssertTools.TensorIsEqual(db, alb.matMul(a, dedm, transposeA, transposeB));
        }