Пример #1
0
        public void Train_WithoutInvalidOutputNeuronIds_ThrowsException()
        {
            // Arrange
            var trainingIteration = new NetworkTrainingIteration();

            trainingIteration.Inputs.Add(new NetworkTrainingInput()
            {
                NeuronId = 0
            });
            trainingIteration.Inputs.Add(new NetworkTrainingInput()
            {
                NeuronId = 1
            });
            trainingIteration.Inputs.Add(new NetworkTrainingInput()
            {
                NeuronId = 2
            });

            // 2 output neurons
            trainingIteration.Outputs.Add(new NetworkTrainingOutput()
            {
                NeuronId = 8
            });
            trainingIteration.Outputs.Add(new NetworkTrainingOutput()
            {
                NeuronId = -1
            });

            _trainingIterations.Add(trainingIteration);
            _trainingIterations.Add(trainingIteration);

            // Act
            _network.Train(_trainingIterations);
        }
Пример #2
0
        public void Train_WithoutOutputsForEachOutputNeuron_ThrowsException()
        {
            // Arrange
            var trainingIteration = new NetworkTrainingIteration();

            trainingIteration.Inputs.Add(new NetworkTrainingInput()
            {
                NeuronId = 0
            });
            trainingIteration.Inputs.Add(new NetworkTrainingInput()
            {
                NeuronId = 1
            });
            trainingIteration.Inputs.Add(new NetworkTrainingInput()
            {
                NeuronId = 2
            });

            trainingIteration.Outputs.Add(new NetworkTrainingOutput());

            _trainingIterations.Add(trainingIteration);

            // Act
            _network.Train(_trainingIterations);
        }
Пример #3
0
        public void Train_WithNullDatasetOutputs_ThrowsException()
        {
            // Arrange
            var trainingIteration = new NetworkTrainingIteration
            {
                Outputs = null
            };

            trainingIteration.Inputs.Add(new NetworkTrainingInput()
            {
                NeuronId = 0
            });
            trainingIteration.Inputs.Add(new NetworkTrainingInput()
            {
                NeuronId = 1
            });
            trainingIteration.Inputs.Add(new NetworkTrainingInput()
            {
                NeuronId = 2
            });

            _trainingIterations.Add(trainingIteration);

            // Act
            _network.Train(_trainingIterations);
        }
Пример #4
0
        public void Train_WithEmptyDatasetInputs_ThrowsException()
        {
            // Arrange
            var trainingIteration = new NetworkTrainingIteration();

            _trainingIterations.Add(trainingIteration);

            // Act
            _network.Train(_trainingIterations);
        }
Пример #5
0
        public void Train_WithValidDataset_ReturnsImprovingCosts()
        {
            //for (int i = 0; i < 1000; i++)
            //{
            // Arrange
            var trainingIteration = new NetworkTrainingIteration();

            trainingIteration.Inputs.Add(new NetworkTrainingInput()
            {
                NeuronId = 0, ActivationLevel = .75
            });
            trainingIteration.Inputs.Add(new NetworkTrainingInput()
            {
                NeuronId = 1, ActivationLevel = .75
            });
            trainingIteration.Inputs.Add(new NetworkTrainingInput()
            {
                NeuronId = 2, ActivationLevel = .75
            });

            // 2 output neurons
            trainingIteration.Outputs.Add(new NetworkTrainingOutput()
            {
                NeuronId = 8, ExpectedActivationLevel = .25
            });
            trainingIteration.Outputs.Add(new NetworkTrainingOutput()
            {
                NeuronId = 9, ExpectedActivationLevel = .25
            });

            _trainingIterations.Add(trainingIteration);
            _trainingIterations.Add(trainingIteration);
            _trainingIterations.Add(trainingIteration);
            _trainingIterations.Add(trainingIteration);
            _trainingIterations.Add(trainingIteration);

            // Act
            _network.RandomizeNetwork();
            var trainingIterations = _network.Train(_trainingIterations).ToList();

            // Assert
            var lastTrainingSet = trainingIterations.First();

            foreach (var trainingSet in trainingIterations)
            {
                Assert.IsTrue(trainingSet.TrainingCost <= lastTrainingSet.TrainingCost);
                lastTrainingSet = trainingSet;
            }
            //}
        }
Пример #6
0
        public void Train_WithValidDataset_UpdatesWeightsAndBiases()
        {
            // Arrange
            var trainingIteration = new NetworkTrainingIteration();

            trainingIteration.Inputs.Add(new NetworkTrainingInput()
            {
                NeuronId = 0, ActivationLevel = .75
            });
            trainingIteration.Inputs.Add(new NetworkTrainingInput()
            {
                NeuronId = 1, ActivationLevel = .75
            });
            trainingIteration.Inputs.Add(new NetworkTrainingInput()
            {
                NeuronId = 2, ActivationLevel = .75
            });

            // 2 output neurons
            trainingIteration.Outputs.Add(new NetworkTrainingOutput()
            {
                NeuronId = 8, ExpectedActivationLevel = .25
            });
            trainingIteration.Outputs.Add(new NetworkTrainingOutput()
            {
                NeuronId = 9, ExpectedActivationLevel = .25
            });

            _trainingIterations.Add(trainingIteration);
            _trainingIterations.Add(trainingIteration);

            var inputNeuron = _network.Layers.First().Neurons.First();
            var inputNeuronOutgoingConnection = inputNeuron.Connections.OfType <IOutgoingConnection>().First();
            var neuronBiasBefore       = inputNeuron.Bias;
            var connectionWeightBefore = inputNeuronOutgoingConnection.Weight;

            // Act
            _network.RandomizeNetwork();
            _network.Train(_trainingIterations);

            // Assert
            Assert.IsTrue(neuronBiasBefore != inputNeuron.Bias);
            Assert.IsTrue(connectionWeightBefore != inputNeuronOutgoingConnection.Weight);
        }
Пример #7
0
        public void Train_WithValidDataset_ReturnsIterationCosts()
        {
            // Arrange
            var trainingIteration = new NetworkTrainingIteration();

            trainingIteration.Inputs.Add(new NetworkTrainingInput()
            {
                NeuronId = 0, ActivationLevel = .75
            });
            trainingIteration.Inputs.Add(new NetworkTrainingInput()
            {
                NeuronId = 1, ActivationLevel = .75
            });
            trainingIteration.Inputs.Add(new NetworkTrainingInput()
            {
                NeuronId = 2, ActivationLevel = .75
            });

            // 2 output neurons
            trainingIteration.Outputs.Add(new NetworkTrainingOutput()
            {
                NeuronId = 8, ExpectedActivationLevel = .25
            });
            trainingIteration.Outputs.Add(new NetworkTrainingOutput()
            {
                NeuronId = 9, ExpectedActivationLevel = .25
            });

            _trainingIterations.Add(trainingIteration);
            _trainingIterations.Add(trainingIteration);
            _trainingIterations.Add(trainingIteration);
            _trainingIterations.Add(trainingIteration);
            _trainingIterations.Add(trainingIteration);

            // Act
            _network.RandomizeNetwork();
            var costs = _network.Train(_trainingIterations);

            // Assert
            Assert.IsNotNull(costs);
            Assert.IsTrue(costs.Count() == 5);
        }
Пример #8
0
        /// <summary>
        /// Converts each of the <paramref name="source"/> items to a trainingIteration.
        /// </summary>
        /// <param name="source">The source dataset that is to be converted to training iterations.</param>
        /// <returns>Returns the converted <paramref name="source"/> items as trainingIterations.</returns>
        private IEnumerable <INetworkTrainingIteration> ConvertToTrainingIterations(IEnumerable <GetTrainingDataset_Result> source)
        {
            var trainingIterations = new List <INetworkTrainingIteration>();

            if (source != null && source.Count() >= 1)
            {
                var properties       = source.First().GetType().GetProperties();
                var inputProperties  = properties.Where(p => p.Name.StartsWith("I_"));
                var outputProperties = properties.Where(p => p.Name.StartsWith("O_"));

                // Convert each dataset entry into a network training iteration
                foreach (var entry in source)
                {
                    var trainingIteration = new NetworkTrainingIteration();

                    // Dynamically add all inputs
                    foreach (var inputProperty in inputProperties)
                    {
                        trainingIteration.Inputs.Add(new NetworkTrainingInput()
                        {
                            ActivationLevel = (bool)inputProperty.GetValue(entry) ? 1.0 : 0.0, Description = inputProperty.Name
                        });
                    }

                    // Dynamically add all outputs
                    foreach (var outputProperty in outputProperties)
                    {
                        trainingIteration.Outputs.Add(new NetworkTrainingOutput()
                        {
                            ExpectedActivationLevel = (bool)outputProperty.GetValue(entry) ? 1.0 : 0.0, Description = outputProperty.Name
                        });
                    }

                    trainingIterations.Add(trainingIteration);
                }
            }

            return(trainingIterations);
        }