예제 #1
0
        static void Main(string[] args)
        {
            NeuralNetwork nn = new NeuralNetwork();

            nn.AddLayer(2, new Sigmoid());
            nn.AddLayer(3, new Sigmoid());
            nn.AddLayer(3, new Sigmoid());
            nn.AddLayer(1, new Sigmoid());

            nn.Build();


            double[][] input = new double[][] {
                new double[] { 0, 0 },
                new double[] { 0, 1 },
                new double[] { 1, 0 },
                new double[] { 1, 1 }
            };

            double[][] and = new double[][] {
                new double[] { 0 },
                new double[] { 0 },
                new double[] { 0 },
                new double[] { 1 },
            };

            double[][] or = new double[][] {
                new double[] { 0 },
                new double[] { 1 },
                new double[] { 1 },
                new double[] { 1 },
            };

            double[][] xor = new double[][] {
                new double[] { 0 },
                new double[] { 1 },
                new double[] { 1 },
                new double[] { 0 },
            };

            nn.Train(input, xor, 10000, 0.25);

            nn.Predict(input[0]);
            nn.Predict(input[1]);
            nn.Predict(input[2]);
            nn.Predict(input[3]);

            Console.ReadLine();
        }
예제 #2
0
파일: Program.cs 프로젝트: darksv/NN
        private static void Main(string[] args)
        {
            Console.WriteLine("Loading samples from files...");

            var inputs  = LoadFromCsv("X.csv").ToArray();
            var outputs = LoadFromCsv("y.csv").Select(ConvertOutput).ToArray();

            if (inputs.Length == 0)
            {
                return;
            }

            var net = new NeuralNetwork(new SigmoidFunction());

            net.AddLayer(400);
            net.AddLayer(25);
            net.AddLayer(10);

            const int    numEpochs     = 100;
            const int    batchSize     = 50;
            const double learningSpeed = 0.21;

            int numSamples = inputs.Length;
            int numBatches = numSamples / batchSize;

            Console.WriteLine($"Started learning network ({numEpochs} epochs, {numBatches} minibatches, {batchSize} samples each)");

            var sw = new Stopwatch();

            for (int i = 0; i < numEpochs; ++i)
            {
                sw.Start();

                var shuffledBatch = inputs
                                    .Zip(outputs, Tuple.Create)
                                    .OrderBy(x => Guid.NewGuid())
                                    .ToArray();

                var shuffledInputs = shuffledBatch
                                     .Select(x => x.Item1)
                                     .ToArray();

                var shuffledOutputs = shuffledBatch
                                      .Select(x => x.Item2)
                                      .ToArray();

                // Perform Stochastic Gradient Descent
                for (int j = 0; j < numBatches; ++j)
                {
                    var batchInputs = shuffledInputs
                                      .Skip(j * batchSize)
                                      .Take(batchSize)
                                      .ToArray();

                    var batchOutputs = shuffledOutputs
                                       .Skip(j * batchSize)
                                       .Take(batchSize)
                                       .ToArray();

                    net.UpdateMultipleSamples(batchInputs, batchOutputs, learningSpeed);

                    Console.Write('.');
                }

                Console.WriteLine();


                int numCorrect = inputs
                                 .Select(input => net.GetOutput(input))
                                 .Where((output, j) => outputs[j][output.MaximumIndex()].Equals(1.0))
                                 .Count();

                int    numInvalid = numSamples - numCorrect;
                double ratio      = (double)numInvalid / numSamples;
                Console.WriteLine($"Epoch: {i + 1} / {numEpochs}; Error: {numInvalid} / {numSamples} [{ratio}]; Time: {sw.Elapsed}");

                sw.Reset();
            }
        }