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)); }
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)); }
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)); }
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)); }
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)); }
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)); }
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)); }
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)); }
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); }