Exemple #1
0
        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;
            }
        }
Exemple #2
0
        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;
                }
            }
        }
Exemple #3
0
 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;
 }
Exemple #4
0
 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;
     }
 }
Exemple #5
0
        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);
        }
Exemple #6
0
 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;
 }
Exemple #7
0
 public Neuron(NeuronGroup group)
 {
     NeuronGroup        = group;
     activationFunction = DefaultActivationFunction;
 }
Exemple #8
0
        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);
        }