private void btnProcess_Click(object sender, EventArgs e) { NeuronNet net = new NeuronNet(new int[] { 4096, 4096, 4 }); Bitmap bmp = new Bitmap(picboxReferenceImage.Image); float[] inputArray = new float[4096]; int i = 0; for (int x = 0; x < bmp.Width; x++) { for (int y = 0; y < bmp.Height; y++) { inputArray[i] = bmp.GetPixel(x,y).GetBrightness(); i++; } } float[] resultArray = net.Process(inputArray); picboxLayer0.Image = (Image)net.bmps[0]; picboxLayer1.Image = (Image)net.bmps[1]; picboxLayer2.Image = (Image)net.bmps[2]; textBoxQuad.Text = resultArray[0].ToString(); textBoxCircle.Text = resultArray[1].ToString(); textBoxTriangle.Text = resultArray[2].ToString(); textBoxStar.Text = resultArray[3].ToString(); }
private void FastCrossIndividuals(NeuronNet individualA, NeuronNet individualB) { if (individualA.Layers.Count != individualB.Layers.Count) { throw new Exception("Different layer size. Can not cross"); } for (int i = 0; i < individualA.Layers.Count; i++) { if (individualA.Layers[i].Neurons.Count != individualB.Layers[i].Neurons.Count) { throw new Exception("Different neuron size. Can not cross"); } for (int j = 0; j < individualA.Layers[i].Neurons.Count; j++) { if (individualA.Layers[i].Neurons[j].Dendrites.Count != individualB.Layers[i].Neurons[j].Dendrites.Count) { throw new Exception("Different dendrite count. Can not cross"); } for (int k = 0; k < individualA.Layers[i].Neurons[j].Dendrites.Count; k++) { double auxDendriteWeightA = individualA.Layers[i].Neurons[j].Dendrites[k].Weight; double auxDendriteWeightB = individualB.Layers[i].Neurons[j].Dendrites[k].Weight; individualA.Layers[i].Neurons[j].Dendrites[k].Weight = auxDendriteWeightB; individualB.Layers[i].Neurons[j].Dendrites[k].Weight = auxDendriteWeightA; } } } }
private void DieOfAge(int maxAge) { if (PopulationList.Exists(x => x.Age > maxAge)) { PopulationList = PopulationList.OrderBy(x => x.Age).ToList(); NeuronNet firstOld = PopulationList.First(x => x.Age > maxAge); int index = PopulationList.IndexOf(firstOld); PopulationList.RemoveRange(index, PopulationList.Count - index); PopulationList = PopulationList.OrderBy(x => x.Error).ToList(); } }
public void Init(GenomeFloatString genome) { neuronNet = new NeuronNet(new int[]{5, 8, 3}, genome.GetArray()); sensors = new float[5+1]; for (int i = 0; i < directions.Length; i++) { directions[i].Normalize(); } sensors[5] = 0; totalDistance = 0; Duration = 0; isDone = false; initialized = true; }
private void learnNN(NeuronNet pNN, List <double> inputs, List <double> expected) { pNN.Update(inputs); var outputs = pNN.Outputs; Debug.Assert(outputs.Count == expected.Count); double tempFitness = pNN.Fitness; for (int ipOutput = 0; ipOutput < outputs.Count; ipOutput++) { tempFitness += calculateFitness(outputs[ipOutput], expected[ipOutput]); } pNN.Fitness = tempFitness; }
public void Init(GenomeFloatString genome) { neuronNet = new NeuronNet(new int[] { 5, 8, 3 }, genome.GetArray()); sensors = new float[5 + 1]; for (int i = 0; i < directions.Length; i++) { directions[i].Normalize(); } sensors[5] = 0; totalDistance = 0; Duration = 0; isDone = false; initialized = true; }
private void NearGenesCrossNoOffspring(NeuronNet individualA, NeuronNet individualB) { if (individualA.Layers.Count != individualB.Layers.Count) { throw new Exception("Different layer size. Can not cross"); } for (int i = 0; i < individualA.Layers.Count; i++) { if (individualA.Layers[i].Neurons.Count != individualB.Layers[i].Neurons.Count) { throw new Exception("Different neuron size. Can not cross"); } for (int j = 0; j < individualA.Layers[i].Neurons.Count; j++) { if (individualA.Layers[i].Neurons[j].Dendrites.Count != individualB.Layers[i].Neurons[j].Dendrites.Count) { throw new Exception("Different dendrite count. Can not cross"); } for (int k = 0; k < individualA.Layers[i].Neurons[j].Dendrites.Count; k++) { double auxDendriteWeightA = individualA.Layers[i].Neurons[j].Dendrites[k].Weight; double auxDendriteWeightB = individualB.Layers[i].Neurons[j].Dendrites[k].Weight; double maximum; double minimum; if (auxDendriteWeightA > auxDendriteWeightB) { maximum = auxDendriteWeightA; minimum = auxDendriteWeightB; } else { maximum = auxDendriteWeightB; minimum = auxDendriteWeightA; } individualA.Layers[i].Neurons[j].Dendrites[k].Weight = Rnd.NextDouble() * (maximum - minimum) + minimum; individualB.Layers[i].Neurons[j].Dendrites[k].Weight = Rnd.NextDouble() * (maximum - minimum) + minimum; } } } }
static void Main(string[] args) { _network = new NeuronNet(2, 3, 1); var learning = new BackPropLearning(_network); var param = new BackPropParams() { CallBack = cb, Eta = 0.9, Alpha = 0.05, ErrorStopValue = 0.05 }; learning.TrainNetworkBySample(XorSamples, XorSamples, param); //learning.TrainNetworkByBatch(XorSamples, XorSamples, param); //var param2 = new RPropParams(); //var learning2 = new RPropLearning(_network); //learning2.Train(XorSamples, XorSamples, param2); Console.WriteLine("press enter..."); Console.ReadLine(); }
public NaturalDescent(NeuronNet network) { _network = network; }
public void TrainGenetic(int iterationsNumber, int populationSize, int[] shape) { _geneticAlgorithm = new GeneticAlgorithm(shape, populationSize, Rnd, -1, 1, _inputTrainSet.First()); _geneticAlgorithm.RunGenerations(iterationsNumber, _inputTrainSet, _outputTrainSet, 4); _network = _geneticAlgorithm.PopulationList.First(); }
public void TrainGenetic(List <double[]> inputTrainSet, List <double[]> outputTarget, int iterationsNumber, int populationSize, int[] shape) { _geneticAlgorithm = new GeneticAlgorithm(shape, populationSize, Rnd, -1, 1, inputTrainSet[0]); _geneticAlgorithm.RunGenerations(iterationsNumber, inputTrainSet, outputTarget, 4); _network = _geneticAlgorithm.PopulationList.First(); }
public void CreateNetwork(int[] shape) { _network = new NeuronNet(shape, Rnd); _naturalDescent = new NaturalDescent(_network); }
private void NearGenesCrossWithOffspring(NeuronNet individualA, NeuronNet individualB) { NeuronNet offspring = new NeuronNet(Shape, Rnd); double extraRange = 0.1; offspring.SetInputLayer(InputExample); if (individualA.Layers.Count != individualB.Layers.Count) { throw new Exception("Different layer size. Can not cross"); } for (int i = 0; i < individualA.Layers.Count; i++) { if (individualA.Layers[i].Neurons.Count != individualB.Layers[i].Neurons.Count) { throw new Exception("Different neuron size. Can not cross"); } for (int j = 0; j < individualA.Layers[i].Neurons.Count; j++) { double auxBiasA = individualA.Layers[i].Neurons[j].Bias; double auxBiasB = individualB.Layers[i].Neurons[j].Bias; double maximumBias; double minimumBias; if (auxBiasA > auxBiasB) { maximumBias = auxBiasA + (auxBiasA * extraRange); minimumBias = auxBiasB - (auxBiasA * extraRange); } else { maximumBias = auxBiasB + (auxBiasA * extraRange); minimumBias = auxBiasA - (auxBiasA * extraRange); } offspring.Layers[i].Neurons[j].Bias = Rnd.NextDouble() * (maximumBias - minimumBias) + minimumBias; if (individualA.Layers[i].Neurons[j].Dendrites.Count != individualB.Layers[i].Neurons[j].Dendrites.Count) { throw new Exception("Different dendrite count. Can not cross"); } for (int k = 0; k < individualA.Layers[i].Neurons[j].Dendrites.Count; k++) { double auxDendriteWeightA = individualA.Layers[i].Neurons[j].Dendrites[k].Weight; double auxDendriteWeightB = individualB.Layers[i].Neurons[j].Dendrites[k].Weight; double maximum; double minimum; if (auxDendriteWeightA > auxDendriteWeightB) { maximum = auxDendriteWeightA + (auxDendriteWeightA * extraRange); minimum = auxDendriteWeightB - (auxDendriteWeightA * extraRange); } else { maximum = auxDendriteWeightB + (auxDendriteWeightA * extraRange); minimum = auxDendriteWeightA - (auxDendriteWeightA * extraRange); } offspring.Layers[i].Neurons[j].Dendrites[k].Weight = Rnd.NextDouble() * (maximum - minimum) + minimum; } } } PopulationList.Add(offspring); }
public void PaintOutput(NeuronNet network) { throw new NotImplementedException(); }