void RunNetworkTraining(ITrainableNetwork network, TestConfiguration config, double learningParam, double numEpochs)
        {
            double err;

            for (int i = 0; i < numEpochs; i++)
            {
                // measure the error before the learning, on the whole training set
                err = 0.0;

                // TODO randomize the order of training samples
                foreach (var trainSample in config.TrainingSet)
                {
                    err += network.GetNetworkTotalError(trainSample.Item1, trainSample.Item2);
                }
                Console.WriteLine("Step {0}, total network error: {1}", i, err);

                // train all samples
                foreach (var trainSample in config.TrainingSet)
                {
                    network.Train(trainSample.Item1, trainSample.Item2, learningParam);
                }
            }

            // measure final error of the network
            err = 0.0;
            foreach (var trainSample in config.TrainingSet)
            {
                err += network.GetNetworkTotalError(trainSample.Item1, trainSample.Item2);
            }
            Console.WriteLine("Final total network error: {0}", err);
        }
Exemplo n.º 2
0
        //for the sake of simplicity we crossover two NNs with identical structure and only adjust the weights and biases
        public ITrainableNetwork Crossover(ITrainableNetwork other)
        {
            var network = new TrainableNetwork(this.InputsCount, this.HiddenLayersCounts, this.OutputsCount);

            for (int layerIndex = 0; layerIndex < this.HiddenLayersCount + 1; layerIndex++)
            {
                for (int neuronIndex = 0; neuronIndex < this.Weights[layerIndex].Count; neuronIndex++)
                {
                    for (int weightIndex = 0; weightIndex < this.Weights[layerIndex][neuronIndex].Count; weightIndex++)
                    {
                        var copyWeights = Network.Random.NextBool() ? this.Weights : other.Weights;

                        network.Weights[layerIndex][neuronIndex][weightIndex] = copyWeights[layerIndex][neuronIndex][weightIndex];
                    }

                    var copyBiases = Network.Random.NextBool() ? this.Biases : other.Biases;

                    network.Biases[layerIndex][neuronIndex] = copyBiases[layerIndex][neuronIndex];
                }
            }

            return(network);
        }