예제 #1
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));
        }
예제 #2
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));
        }
예제 #3
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));
        }
예제 #4
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));
        }
예제 #5
0
        public void tile2dgradient()
        {
            var t  = alb.tensor2d(alb.data(1, 2, 3, 4), 2, 2);
            var dy = alb.tensor2d(alb.data(1, 2, 10, 20, 3, 4, 30, 40), 2, 4);

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

            AssertTools.TensorIsEqual(d, alb.data(11, 22, 33, 44).ToTensor(2, 2));
        }
예제 #6
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));
        }
예제 #7
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));
        }
예제 #8
0
        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));
        }
예제 #9
0
        public void second_order_derivative_through_customGradient()
        {
            ENV.engine = new Engine();
            var a = alb.scalar(3);
            var b = alb.scalar(2);

            var dy = alb.scalar(5);

            var customPow = alb.customGrad(aI =>
            {
                var value = alb.pow(a, b);
                Func <Tensor, List <Tensor> > gradFunc =
                    (Tensor dyI) =>
                {
                    return(new List <Tensor>()
                    {
                        dyI.mul(aI[0])
                    });
                };
                return(new CustomGradientResults()
                {
                    gradFunc = gradFunc,
                    value = value
                });
            });

            var dda = alb.grad((Tensor xI) =>
            {
                return(alb.grad(xI2 => customPow(new Tensor[] { xI2 }))(xI, null));
            })(a, dy);

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

            // First order: dy * a. Second order: dy.
            AssertTools.TensorIsEqual(dda, dy);
        }