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 the incoming and outgoing connections between this neuron and a previous hidden neuron. /// </summary> /// <param name="incomingNeuron">The incoming neuron to connect this neuron to.</param> public void GenerateConnectionsWith(IHiddenNeuron incomingNeuron) { if (incomingNeuron == null) { throw new ArgumentNullException("incomingNeuron"); } // Create connection only if this neuron doesn't already have an incoming connection from the incoming hidden neuron. if (!GetIncomingConnections().Any(c => c.FromNeuron == incomingNeuron)) { Connections.Add(new IncomingConnection(incomingNeuron)); } // Create connection only if the incoming hidden neuron doesn't already have an outgoing connection to this neuron. if (!incomingNeuron.GetOutgoingConnections().Any(c => c.ToNeuron == this)) { incomingNeuron.Connections.Add(new OutgoingConnection(this)); } }
public void Initialize() { _neuron = new HiddenNeuron(); _connection = new IncomingConnection(_neuron); }
public void Initialize() { _inputNeuron = new InputNeuron(); _hiddenNeuron = new HiddenNeuron(); _outputNeuron = new OutputNeuron(); }