public void TestBias() { double input = 0.3; double inpToOutWeight = 0.4; double biasToOutWeight = 0.5; var sigmoid = new SigmoidFunction(); var nw = new Network(sigmoid, false); var inputNode = new Input(input); var bias = new Bias(); var outputNode = new Perceptron(sigmoid, "Output"); Connection.Create(inpToOutWeight, inputNode, outputNode); Connection.Create(biasToOutWeight, bias, outputNode); nw.Nodes = new Node[][] { new Node[] { inputNode }, new Node[] { outputNode } }; var nwOut = nw.Nodes[1][0].Output; //Output // = Sig(inpToOut.Output + biasToOut.Output) // = Sig((inpToOut.Weight * inpToOut.GetInput()) + (biasToOutWeight * 1)) // = Sig((inpToOut.Weight * inputNode.Output) + (biasToOutWeight)) // = Sig((this.weight * this.input) + (biasToOutWeight)) var expOut = sigmoid.Calculate((inpToOutWeight * input) + biasToOutWeight); Assert.AreEqual(nwOut, expOut); }
public void TestConnection() { double weight = 2; double input = 5; var inp = new Input(input); var outp = new Perceptron(new SigmoidFunction(), "Output"); var wc = Connection.Create(weight, inp, outp); Assert.AreEqual(wc.Output, weight * input); Assert.AreEqual(inp.GetOutgoingConnections()[0], outp.GetIncommingConnections()[0]); }
public void TestDelConnection() { var inp = new Input(5); var outp = new Perceptron(new SigmoidFunction()); var beforeConnect = outp.Output; var con = Connection.Create(1, inp, outp); outp.ResetCache(); var afterConnect = outp.Output; Assert.AreNotEqual(beforeConnect, afterConnect); con.Delete(); outp.ResetCache(); Assert.AreEqual(beforeConnect, outp.Output); }
public void FillNetwork(int nrInputs, int nrOutputs, params int[] hiddenLayerHeights) { //Creation of outputs is similar to creating hidden layers var nonInputLayers = hiddenLayerHeights.ToList(); nonInputLayers.Add(nrOutputs); //Init array Nodes = new Node[nonInputLayers.Count + 1][]; //Inputs Nodes[0] = CreateInputs(nrInputs).ToArray(); //Hidden & out for(int layerIndex = 1; layerIndex <= nonInputLayers.Count; layerIndex++) { int height = nonInputLayers[layerIndex - 1]; var curLayer = new List<Perceptron>(height); for(int percNr = 0; percNr < height; percNr++) { //Create perceptron string name = layerIndex == Nodes.Length - 1 ? $"Output {percNr}" : $"Hidden #{layerIndex - 1}.{percNr}"; var newPerceptron = new Perceptron(TransferFunction, name); //Create input connections foreach(var inp in Nodes[layerIndex - 1]) { double weight = 0; if(layerIndex - 1 == 0) { //Input --> 1st hidden weight = MathHelper.GuassianRandom(Math.Sqrt(1.0 / 3.0), 0); } Connection.Create(weight, inp, newPerceptron); } if(Bias != null) { Connection.Create(0.5, Bias, newPerceptron); } curLayer.Add(newPerceptron); } Nodes[layerIndex] = curLayer.ToArray(); } }
public void TestPerceptronCaching() { double local1 = -10; double local2 = -5; var in1 = new Input(local1, "Input1"); var in2 = new Input(local2, "Input2"); var p = new Perceptron(new SigmoidFunction()); Connection.Create(0.5, in1, p); Connection.Create(1, in2, p); Assert.IsTrue(p.Output < 0.1); in1.Value = 10; in2.Value = 5; Assert.IsTrue(p.Output < 0.1); p.ResetCache(); Assert.IsFalse(p.Output < 0.1); }
public void TestNetworkOutput() { var rand = new Random(); double input = (double)(rand.NextDouble()); double weight = (double)(rand.NextDouble()); var sigmoid = new SigmoidFunction(); var nw = new Network(sigmoid, false); var inputNode = new Input(input); var outputNode = new Perceptron(sigmoid, "Output"); Connection.Create(weight, inputNode, outputNode); nw.Nodes = new Node[][] { new Node[] { inputNode }, new Node[] { outputNode } }; var nwOut = nw.CurOutput()[0]; Assert.AreEqual(outputNode.Output, nwOut); var expOut = sigmoid.Calculate(input * weight); Assert.AreEqual(nwOut, expOut); }
public void TestGetInputResult() { var rand = new Random(); double input = (double)(rand.NextDouble() * 100 + 1); double weight = (double)(rand.NextDouble() * 2); var sigmoid = new SigmoidFunction(); var nw = new Network(sigmoid, false); var inputNode = new Input(input); var outputNode = new Perceptron(sigmoid, "Output"); Connection.Create(weight, inputNode, outputNode); nw.Nodes = new Node[][] { new Node[] { inputNode }, new Node[] { outputNode } }; var nwOut = nw.GetInputResult(input)[0]; //Output // = Sig(inpToOut.Output) // = Sig(inpToOut.Weight * inpToOut.GetInput()) // = Sig(inpToOut.Weight * inputNode.Output) // = Sig(this.weight * this.input) var expOut = sigmoid.Calculate(weight * input); Assert.AreEqual(nwOut, expOut); }