public virtual void StudyByGroups(int group) { NeuronGroup currGroup = NeuronGroups[group]; float dE_dOUT = float.MinValue; float dOUT_dNET; float p; for (int i = 0; i < currGroup.Neurons.Count; i++ /*, dE_dOUT = float.MinValue*/) { if (currGroup == LastNeuronGroup) { dE_dOUT = currGroup.Neurons[i].OUT - currGroup.Neurons[i].studyValue; } else { dE_dOUT = currGroup.Neurons[i].dE_dX(); } dOUT_dNET = currGroup.Neurons[i].dOUT_dNET(); for (int j = 0; j < currGroup.Neurons[i].sinapses.Count; j++) { currGroup.Neurons[i].sinapses[j].dE_dx = dE_dOUT * dOUT_dNET * currGroup.Neurons[i].sinapses[j].value; p = -E *dE_dOUT *dNETdw(currGroup.Neurons[i].sinapses[j]) * dOUT_dNET; currGroup.Neurons[i].sinapses[j].value += p + moment * currGroup.Neurons[i].sinapses[j].priv_direction; currGroup.Neurons[i].sinapses[j].priv_direction = p; } p = -E * dE_dOUT * dOUT_dNET; currGroup.Neurons[i].Shift += p + moment * currGroup.Neurons[i].priv_direction; currGroup.Neurons[i].priv_direction = p; } }
public override void StudyByGroups(int group) { float Ew, Ec, Er; Ew = 0.8f; Ec = 0.0001f; Er = E; float dE_dOut; NeuronGroup currGroup = NeuronGroups[group]; if (currGroup == LastNeuronGroup) { for (int i = 0; i < currGroup.Neurons.Count; i++) { dE_dOut = currGroup.Neurons[i].OUT - currGroup.Neurons[i].studyValue; for (int j = 0; j < currGroup.Neurons[i].sinapses.Count; j++) { currGroup.Neurons[i].sinapses[j].dE_dx = dE_dOut; } } } else { float[] dc = new float[InputsCount]; float da, dw; Neuron n; for (int i = 0; i < currGroup.Neurons.Count; i++) { n = currGroup.Neurons[i]; dE_dOut = -n.dE_dX(); dw = n.OUT; da = -n.aksons[0].value * n.OUT * n.NET; for (int j = 0; j < InputsCount; j++) { dc[j] = 2 * n.aksons[0].value * n.OUT * n.A * (Inputs[j].value - n.Centers[j]); } n.A += Er * da * dE_dOut; n.A = Math.Abs(n.A); for (int j = 0; j < InputsCount; j++) { n.Centers[j] += Ec * dc[j] * dE_dOut; if (n.Centers[j] > 1) { n.Centers[j] += 1.2f * (1 - n.Centers[j]); } if (n.Centers[j] < 0) { n.Centers[j] += -1.2f * n.Centers[j]; } } n.aksons[0].value += Ew * dw * dE_dOut; } } }
public Neuron(Neuron obj, NeuronGroup group) { positionChanged = obj.positionChanged; Shift = (float)rand.Next(-500, 500) / 1000; activationFunction = obj.activationFunction; A = obj.A; active = obj.active; wasPainted = obj.wasPainted; NeuronGroup = group; }
public void SetSelection(NeuronGroup group) { for (int i = 0; i < currentSelection.Neurons.Count; i++) { currentSelection.Neurons[i].active = false; } currentSelection = group; for (int i = 0; i < group.Neurons.Count; i++) { group.Neurons[i].active = true; } }
public NeuronGroup GetNeuronsByRectangle(Rectangle rect) { NeuronGroup group = new NeuronGroup(0); for (int i = 0; i < NeuronGroups.Count; i++) { for (int j = 0; j < NeuronGroups[i].Neurons.Count; j++) { if (rect.Contains(new Point((int)NeuronGroups[i].Neurons[j].Position.X, (int)NeuronGroups[i].Neurons[j].Position.Y))) { group.Neurons.Add(NeuronGroups[i].Neurons[j]); } } } return(group); }
public Neuron(Neuron obj, NeuronGroup group) { if (obj != null) { positionChanged = obj.positionChanged; activationFunction = obj.activationFunction; A = obj.A; active = obj.active; wasPainted = obj.wasPainted; } else { activationFunction = DefaultActivationFunction; } Shift = (float)rand.Next(-500, 500) / 1000; NeuronGroup = group; }
public Neuron(NeuronGroup group) { NeuronGroup = group; activationFunction = DefaultActivationFunction; }
private NeuronNet AcceptJson(Root2 root2) { NeuronNet net = new NeuronNet(); for (int i = 0; i < root2.inputss.Count; i++) { PointF pointF = new PointF(); pointF.X = (float)root2.inputss[i].Position.X; pointF.Y = (float)root2.inputss[i].Position.Y; NeuronInput neuron = new NeuronInput((float)root2.inputss[i].value, root2.inputss[i].Name, pointF); neuron.positionChanged = root2.inputss[i].positionChanged; neuron.wasPainted = root2.inputss[i].wasPainted; net.inputss.Add(neuron); } for (int i = 0; i < root2.NeuronGroups.Count; i++) { NeuronGroup neurongroup = new NeuronGroup(); neurongroup.Neurons = root2.NeuronGroups[i].Neurons; neurongroup.SecondActivate = root2.NeuronGroups[i].SecondActivate; neurongroup.SumForSoftMax = (float)root2.NeuronGroups[i].SumForSoftMax; neurongroup.allNeuronsWasPainted = root2.NeuronGroups[i].allNeuronsWasPainted; net.NeuronGroups.Add(neurongroup); } for (int i = 0; i < root2.studyPairss.Count; i++) { StudyPair studyPair = new StudyPair(); for (int j = 0; j < root2.studyPairss[i].inputs.Count; j++) { studyPair.inputs.Add((float)root2.studyPairss[i].inputs[j]); } for (int j = 0; j < root2.studyPairss[i].quits.Count; j++) { studyPair.quits.Add((float)root2.studyPairss[i].quits[j]); } for (int j = 0; j < root2.studyPairss[i].realQuits.Count; j++) { studyPair.realQuits.Add((float)root2.studyPairss[i].realQuits[j]); } net.studyPairss.Add(studyPair); } net.E = (float)root2.E; net.moment = (float)root2.moment; for (int i = 0; i < root2.errors.Count; i++) { PointF pointF = new PointF(); pointF.X = (float)root2.errors[i].X; pointF.Y = (float)root2.errors[i].Y; net.errors.Add(pointF); } for (int i = 0; i < root2.normalizedErrors.Count; i++) { PointF pointF = new PointF(); pointF.X = (float)root2.normalizedErrors[i].X; pointF.Y = (float)root2.normalizedErrors[i].Y; net.normalizedErrors.Add(pointF); } net.EraCount = root2.EraCount; net.currentSelection = new NeuronGroup(0); net.recognitionResults = new List <RecognitionResult>(); net.StudyPairsLoaded = root2.StudyPairsLoaded; net.InputsSum = (float)root2.InputsSum; net.allInputsWasPainted = root2.allInputsWasPainted; net.minError = (float)root2.minError; net.NormalizeOutputValue = (float)root2.NormalizeOutputValue; net.biasX = (float[])root2.biasX; net.biasY = (float[])root2.biasY; net.scaleX = (float[])root2.scaleX; net.scaleY = (float[])root2.scaleY; net.StudyLimit = (float)root2.StudyLimit; net.AccessChangeNet = root2.AccessChangeNet; return(net); }