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