static bool CatTrain()
        {
            BitmapCatEnumerator enums   = new BitmapCatEnumerator("Sorted", new System.Drawing.Size(50, 25));
            Network             network = new Network();

            network.AddLayer(new Conv2D(new Relu(), 7, 7, 32));
            network.AddLayer(new MaxPool2D(new Relu(), 2, 2));

            network.AddLayer(new Conv2D(new Relu(), 5, 5, 64));
            network.AddLayer(new MaxPool2D(new Relu(), 2, 2));


            network.AddLayer(new FullyConnLayar(new Relu(), new Size(1, 1, 256)));
            network.AddLayer(new FullyConnLayar(new Sigmoid(), new Size(1, 1, 2)));

            network.Compile(new Size(3, 25, 50), true);

            network.Normalization();

            var pair = enums.GetRandom(ref network);

            OneEnumerator one = new OneEnumerator();

            one.input  = pair.Key;
            one.output = pair.Value;

            MomentumParallel sgd = new MomentumParallel(network, 0.9, 1e-6);

            double[] errors = sgd.TrainBatch(enums, 32, 1000);

            return(errors[0] > errors.Last());
        }
        static bool ConvLearning()
        {
            int width = 100;

            Random  r       = new Random();
            Network network = new Network();

            network.AddLayer(new Conv2D(new Relu(), 2, 1, 2));
            network.AddLayer(new MaxPool2D(new Relu(), 2, 1));
            network.AddLayer(new FullyConnLayar(new Relu(), new Size(1, 1, 1)));
            network.Compile(new Size(1, 1, width), true);


            double[,,] input = new double[width, width, width];
            double[,,] t     = new double[1, 1, 1];

            for (int i = 0; i < width; i++)
            {
                input[i, i, i] = (double)r.NextDouble();
            }
            t[0, 0, 0] = (double)r.NextDouble();

            double start_error = network.GetError(input, t);
            double last_error  = 0;

            SGD sgd = new SGD(network, 1e-1f);

            OneEnumerator one = new OneEnumerator();

            one.input  = input;
            one.output = t;

            for (int i = 0; i < 20; i++)
            {
                //last_error = network.Learn(input, t, 0.1f);
                last_error = sgd.TrainBatch(one, 1, 1)[0];
                if (i % 4 == 0)
                {
                    Console.WriteLine(last_error);
                }
            }


            return(start_error > last_error);
        }