public void tf_int_shape()
        {
            using (var K = new TensorFlowBackend())
            {
                #region doc_int_shape
                var input = K.placeholder(shape: new int?[] { 2, 4, 5 });
                var a     = K.int_shape(input); // (2, 4, 5)
                var val   = new[, ] {
                    { 1, 2 }, { 3, 4 }
                };
                var kvar = K.variable(array: val);
                var b    = K.int_shape(kvar); //(2, 2)
                #endregion

                Assert.AreEqual(new[] { 2, 4, 5 }, a);
                Assert.AreEqual(new[] { 2, 2 }, b);
            }
        }
        public void tf_ndim_test()
        {
            // https://github.com/fchollet/keras/blob/f65a56fb65062c8d14d215c9f4b1015b97cc5bf3/keras/backend/tensorflow_backend.py#L508
            using (var K = new TensorFlowBackend())
            {
                #region doc_ndim
                var input = K.placeholder(shape: new int?[] { 2, 4, 5 });
                double[,] val = new double[, ] {
                    { 1, 2 }, { 3, 4 }
                };
                var kvar = K.variable(array: (Array)val);
                int?a    = K.ndim(input); // 3
                int?b    = K.ndim(kvar);  // 2
                #endregion

                Assert.AreEqual(3, a);
                Assert.AreEqual(2, b);
            }
        }
        public void tf_variable_test()
        {
            using (var K = new TensorFlowBackend())
            {
                #region doc_variable
                double[,] val = new double[, ] {
                    { 1, 2 }, { 3, 4 }
                };
                var kvar = K.variable(array: (Array)val, dtype: DataType.Double, name: "example_var");
                var a    = K.dtype(kvar); // 'float64'
                var b    = kvar.eval();   // { { 1, 2 }, { 3, 4 } }
                #endregion

                Assert.AreEqual(DataType.Double, a);
                Assert.AreEqual(new double[, ] {
                    { 1, 2 }, { 3, 4 }
                }, b);
            }
        }
        public void tf_random_uniform()
        {
            using (var K = new TensorFlowBackend())
            {
                #region doc_random_uniform
                var kvar = K.random_uniform(new int[] { 100, 2000 }, minval: -4, maxval: 2, dtype: DataType.Double, seed: 1337, name: "uni");
                var a    = K.dtype(kvar); // float64 (Double)
                var b    = kvar.eval();
                #endregion

                double[,] actual = (double[, ])b;
                Assert.AreEqual(100, actual.Rows());
                Assert.AreEqual(2000, actual.Columns());

                var u = UniformContinuousDistribution.Estimate(actual.Reshape());
                Assert.AreEqual(-4, u.Minimum, 1e-3);
                Assert.AreEqual(+2, u.Maximum, 1e-3);
                Assert.AreEqual(-1, u.Mean, 1e-2);
            }
        }
        public void tf_softmax_test()
        {
            using (var K = new TensorFlowBackend())
            {
                double[,] a = new double[, ] {
                    { -4, 2 }, { 0.02, 0.3 }
                };
                var ta = K.variable(array: (Array)a, name: "example_var", dtype: DataType.Double);

                var tr = K.softmax(ta);
                double[,] r = (double[, ])tr.eval();

                AssertEx.AreEqual(new double[, ] {
                    { 0.0024726231566347748, 0.99752737684336534 },
                    { 0.430453776060771, 0.56954622393922893 }
                }, r, 1e-8);

                AssertEx.AreEqual(r.GetRow(0), Accord.Math.Special.Softmax(a.GetRow(0)), 1e-8);
                AssertEx.AreEqual(r.GetRow(1), Accord.Math.Special.Softmax(a.GetRow(1)), 1e-8);
            }
        }
        public void tf_zeros()
        {
            using (var K = new TensorFlowBackend())
            {
                #region doc_zeros
                var kvar = K.zeros(new int[] { 3, 4 });
                var a    = K.eval(kvar); // new[,] {{ 0.,  0.,  0.,  0.},
                                         //         { 0.,  0.,  0.,  0.},
                                         //         { 0.,  0.,  0.,  0.}}
                #endregion

                float[,] actual = (float[, ])a;
                Assert.AreEqual(3, actual.Rows());
                Assert.AreEqual(4, actual.Columns());

                double[,] expected = new[, ] {
                    { 0.0, 0.0, 0.0, 0.0 },
                    { 0.0, 0.0, 0.0, 0.0 },
                    { 0.0, 0.0, 0.0, 0.0 }
                };

                Assert.AreEqual(expected, actual);
            }
        }