public void ApplyInputs_WithValidNetwork_PropogatesNetworkInputs() { // Arrange var network = new DFFNeuralNetwork(1, 1, 2, 2); var inputs = new List <INetworkInput>() { new NetworkInput() { ActivationLevel = .75 } }; network.RandomizeNetwork(); IInputNeuron input1 = network.Layers.OfType <IInputLayer>().First().Neurons.First() as IInputNeuron; IOutgoingConnection input1Hidden1Conn = input1.Connections.OfType <IOutgoingConnection>().First(); IOutgoingConnection input1Hidden2Conn = input1.Connections.OfType <IOutgoingConnection>().ToList()[1]; IHiddenNeuron hidden1 = input1Hidden1Conn.ToNeuron as IHiddenNeuron; IOutgoingConnection hidden1Output1Conn = hidden1.Connections.OfType <IOutgoingConnection>().First(); IOutgoingConnection hidden1Output2Conn = hidden1.Connections.OfType <IOutgoingConnection>().ToList()[1]; IHiddenNeuron hidden2 = input1Hidden2Conn.ToNeuron as IHiddenNeuron; IOutgoingConnection hidden2Output1Conn = hidden2.Connections.OfType <IOutgoingConnection>().First(); IOutgoingConnection hidden2Output2Conn = hidden2.Connections.OfType <IOutgoingConnection>().ToList()[1]; IOutputNeuron output1 = hidden1Output1Conn.ToNeuron as IOutputNeuron; IOutputNeuron output2 = hidden1Output2Conn.ToNeuron as IOutputNeuron; // Act network.ApplyInputs(inputs); var outputLayer = network.Layers.OfType <IOutputLayer>().First(); IOutputNeuron output1After = outputLayer.Neurons.First() as IOutputNeuron; IOutputNeuron output2After = outputLayer.Neurons.ToList()[1] as IOutputNeuron; // sigmoid function : (1.0 / (1 + Math.Exp(-1.0 * value))); var h1Activation = ApplyActivationFunction((.75 * input1Hidden1Conn.Weight) + hidden1.Bias); var h2Activation = ApplyActivationFunction((.75 * input1Hidden2Conn.Weight) + hidden2.Bias); var o1Activation = ApplyActivationFunction((h1Activation * hidden1Output1Conn.Weight) + (h2Activation * hidden2Output1Conn.Weight) + output1.Bias); var o2Activation = ApplyActivationFunction((h1Activation * hidden1Output2Conn.Weight) + (h2Activation * hidden2Output2Conn.Weight) + output2.Bias); // Assert Assert.IsTrue(o1Activation == output1After.ActivationLevel); Assert.IsTrue(o2Activation == output2After.ActivationLevel); }
/// <summary> /// Creates and returns a neural network using configuration settings in the <paramref name="networkConfiguration"/> and the <paramref name="trainingEntry"/>. /// </summary> /// <param name="networkConfiguration"></param> /// <param name="trainingDatasetEntries"></param> /// <returns>Returns a neural network using configuration settings in the <paramref name="networkConfiguration"/> and the <paramref name="trainingEntry"/>.</returns> private IDFFNeuralNetwork CreateNetwork(N networkConfiguration, INetworkTrainingIteration trainingEntry) { if (trainingEntry == null || trainingEntry.Inputs == null || trainingEntry.Outputs == null) { throw new ArgumentNullException("trainingEntry"); } var numInputs = trainingEntry.Inputs.Count(); var numOutputs = trainingEntry.Outputs.Count(); var numHiddenLayers = networkConfiguration.NumHiddenLayers; var numHiddenLayerNeurons = networkConfiguration.NumHiddenLayerNeurons; // Setup and randomize network. var network = new DFFNeuralNetwork(numInputs, numHiddenLayers, numHiddenLayerNeurons, numOutputs); network.RandomizeNetwork(); return(network); }