private void UnitTest1() { OutputText.Text = ""; NetworkDocument doc = new NetworkDocument(); InputNeuron i1 = new InputNeuron() {OutputValue = 0.7}; InputNeuron i2 = new InputNeuron() {OutputValue = 0.1}; InputNeuron i3 = new InputNeuron() {OutputValue = 0.3}; doc.Inputs.Add(i1); doc.Inputs.Add(i2); doc.Inputs.Add(i3); OutputNeuron o = new OutputNeuron(); doc.Outputs.Add(new OutputNeuron()); NeuronHelper.ConnectNodes(i1, o, -0.3); NeuronHelper.ConnectNodes(i2, o, 3.1); NeuronHelper.ConnectNodes(i3, o, 0.5); double expected = 0.25; double answer = o.SumInputs(true); OutputText.Text += "Summation test 3 inputs values 0.7, 0.1,0.3 respective weights 0.3,3.1,0.5" + Environment.NewLine; OutputText.Text += "Expected = " + expected + Environment.NewLine; OutputText.Text += "Actual = " + answer + Environment.NewLine; }
// // apply momentum to help get out of dips // public void AdjustFromWeights(NetworkDocument doc) { foreach (Synapse s in BackwardConnections) { double last = s.Weight; //save the current weight for the momentum calculations //http://www.cheshireeng.com/Neuralyst/nnbg.htm //wij = w'ij + (1 - M).LR.ej.Xj+M.(w'ij - w''ij) s.Weight = s.Weight + ((1 - doc.Momentum) * doc.LearningRate * ErrorValue * s.FromNode.OutputValue) + (doc.Momentum * (s.Weight - s.LastWeight)); s.LastWeight = last; Debug.WriteLine("Adjust from weights : " + s.Weight); } if (doc.UsesBias) BiasValue = BiasValue + (doc.LearningRate * ErrorValue * ErrorValue) * 1; }
public bool WithinTolerance(NetworkDocument doc) { bool ret = false; double lowRange = 0 - doc.Tolerance; double highRange = 0 + doc.Tolerance; if (Math.Abs(ExpectedValue) < 0.1) { if (OutputValue >= lowRange && OutputValue <= highRange) ret = true; } else { lowRange = ExpectedValue - (Math.Abs(ExpectedValue) * doc.Tolerance); highRange = ExpectedValue + (Math.Abs(ExpectedValue) * doc.Tolerance); if (OutputValue >= lowRange && OutputValue <= highRange) ret = true; } return ret; }
protected override void OnNavigatedTo(NavigationEventArgs e) { base.OnNavigatedTo(e); CurrentDocument = (NetworkDocument)e.Parameter; }
// // The calculation for the input neuron is the same as the input - In many ways the code below only illustrates this serving little function // but clarifies the use of activation identity // public override double CalcOutput(NetworkDocument doc) { OutputValue = (NeuronHelper.GetActivation(OutputValue, Enumerations.ActivationFunctions.ActivationIdentity,doc.Threshold)); return OutputValue; }
// // Using the error from the node adjust the weights before (going towards input layer) // public virtual void AdjustFromWeights1(NetworkDocument doc) { foreach (Synapse s in BackwardConnections) { //this has been unit tested and is correct // DiagnosticData.addLogged(new DiagData("AdjustFromWeights", DiagData.DIAG_TYPE_INFO, "Weight before = " + String.valueOf(s.Weight))); s.Weight = s.Weight + (doc.LearningRate*ErrorValue)*s.FromNode.OutputValue; // DiagnosticData.addLogged(new DiagData("AdjustFromWeights", DiagData.DIAG_TYPE_INFO, "Weight after = " + String.valueOf(s.Weight))); } // DiagnosticData.addLogged(new DiagData("AdjustFromWeights", DiagData.DIAG_TYPE_INFO, "Bias before = " + String.valueOf(BiasValue))); if (doc.UsesBias) BiasValue = BiasValue + (doc.LearningRate * ErrorValue) * 1; // DiagnosticData.addLogged(new DiagData("AdjustFromWeights", DiagData.DIAG_TYPE_INFO, "Bias after = " + String.valueOf(BiasValue))); }
public virtual double CalcOutput(NetworkDocument doc) { double sum = SumInputs(doc.UsesBias); OutputValue = (NeuronHelper.GetActivation(sum, doc.ActivationFunction,doc.Bias)); return OutputValue; }
private void UnitTest3() { double output1; double output2; OutputText.Text = ""; NetworkDocument doc = new NetworkDocument() {Bias = -2.0,Momentum = 0.05,LearningRate = 0.5}; doc.ActivationFunction = Enumerations.ActivationFunctions.ActivationSigmoidal; doc.UsesBias = true; InputNeuron i0 = new InputNeuron() { OutputValue = 0.1 }; InputNeuron i1 = new InputNeuron() { OutputValue = 0.9 }; doc.Inputs.Add(i0); doc.Inputs.Add(i1); doc.NumLayers = 2;//this should build the layers HiddenNeuron l00 = new HiddenNeuron(){BiasValue = 2.0}; HiddenNeuron l01 = new HiddenNeuron() { BiasValue = 2.0 }; HiddenNeuron l10 = new HiddenNeuron() { BiasValue = 3.0 }; HiddenNeuron l11 = new HiddenNeuron() { BiasValue = -2.0 }; doc.Hidden[0].Add(l00); doc.Hidden[0].Add(l01); doc.Hidden[1].Add(l10); doc.Hidden[1].Add(l11); OutputNeuron o = new OutputNeuron() {ExpectedValue = 0.9,BiasValue = -2}; doc.Outputs.Add(o); //connect layer 1 NeuronHelper.ConnectNodes(i0, l00, -2); NeuronHelper.ConnectNodes(i0, l01, 3); NeuronHelper.ConnectNodes(i1, l00, -2); NeuronHelper.ConnectNodes(i1, l01, 3); //connect layer 2 NeuronHelper.ConnectNodes(l00, l10, -2); NeuronHelper.ConnectNodes(l00, l11, 2); NeuronHelper.ConnectNodes(l01, l10, -4); NeuronHelper.ConnectNodes(l01, l11, 2); //output layer NeuronHelper.ConnectNodes(l10, o, 3); NeuronHelper.ConnectNodes(l11, o, 1); output1 = l00.SumInputs(true); output2 = l01.SumInputs(true); WriteOutput(0, output1); WriteOutput(5, output2); output1 = l00.CalcOutput(doc); output2 = l01.CalcOutput(doc); WriteOutput(0.5, output1); WriteOutput(0.99, output2); output1 = l10.SumInputs(doc.UsesBias); output2 = l11.SumInputs(doc.UsesBias); WriteOutput(-1.972, output1); WriteOutput(0.98, output2); output1 = l10.CalcOutput(doc); output2 = l11.CalcOutput(doc); WriteOutput(0.122, output1); WriteOutput(0.728, output2); output1 = doc.Outputs[0].SumInputs(doc.UsesBias); output2 = doc.Outputs[0].CalcOutput(doc); WriteOutput(-0.906, output1); WriteOutput(0.288, output2); //backward pass output1 = doc.Outputs[0].CalcError(); WriteOutput(0.125, output1); output1 = l10.CalcError(); WriteOutput(0.040, output1); output1 = l11.CalcError(); WriteOutput(0.025, output1); output1 = l00.CalcError(); WriteOutput(0, output1); output1 = l01.CalcError(); WriteOutput(0, output1); o.AdjustFromWeights(doc); l10.AdjustFromWeights(doc); l11.AdjustFromWeights(doc); l00.AdjustFromWeights(doc); l01.AdjustFromWeights(doc); }
public async void LoadLastDocument() { if (ApplicationData.Current.LocalSettings.Values.ContainsKey("LastDocName")) { _lastDocName = (String)(ApplicationData.Current.LocalSettings.Values["LastDocName"]); StorageFolder localFolder = ApplicationData.Current.LocalFolder; try { StorageFile sampleFile = await localFolder.GetFileAsync(_lastDocName); await FileIO.ReadTextAsync(sampleFile); } catch (Exception) { // No file to load or error loading it } } else { CurrentDocument = new NetworkDocument { NumInput = Defaults.DefaultInputs, NumOutput = Defaults.DefaultOutputs, NumHidden = Defaults.DefaultHidden, NumLayers = Defaults.DefaultLayers, LearningRate = Defaults.DefaultLearningRate, Momentum = Defaults.DefaultMomentum, ActivationFunction = Enumerations.ActivationFunctions.ActivationSigmoidal, Tolerance = Defaults.DefaultTolerance, Threshold = Defaults.DefaultThreshold, NetworkName = Defaults.DefaultName, UsesBias = Defaults.UsesBias }; } SetDataContextsUi(); }