public NetworkHelper(IList<Minutia> features, SOMParams somParams) { var trainingFeaturesCount = features.Count; var inputs = new double[trainingFeaturesCount][]; var featureCharacteristicsCount = somParams.CharacteristicsCount; for (var i = 0; i < trainingFeaturesCount; i++) { var feature = features[i]; inputs[i] = new double[featureCharacteristicsCount]; inputs[i][0] = feature.Angle * somParams.AngleMultiplier; inputs[i][1] = (double)feature.MinutiaType * somParams.TypeMultiplier; inputs[i][2] = feature.X * somParams.CoordsMultiplier; inputs[i][3] = feature.Y * somParams.CoordsMultiplier; inputs[i][4] = feature.GetHashCode()*somParams.HashCodeMultiplier; } _networkSize = CreateRectangleFromFeatures(trainingFeaturesCount); _som = new DistanceNetwork(featureCharacteristicsCount, trainingFeaturesCount); _teacher = new SOMLearning(_som, _networkSize[0], _networkSize[1]); _inputs = inputs; _learningRadius = somParams.LearningRadius; _fixedLearningRate = somParams.LearningRate / 10; _driftingLearningRate = _fixedLearningRate * 9; }
/// <summary> /// Crea la red neuronal artificial. /// </summary> public override void CreateANN() { base.CreateANN(); // Crea un diccionario vacio this.learnedKanjis = new Dictionary<string, Kanji>(); // Crea la red somNN = new DistanceNetwork(InputSize, OutputSize); }
public NetworkHelper(double[][] features, SOMParams somParams) { var trainingFeaturesCount = features.GetLength(0); var featureCharacteristicsCount = somParams.CharacteristicsCount; _networkSize = CreateRectangleFromFeatures(trainingFeaturesCount); _som = new DistanceNetwork(featureCharacteristicsCount, trainingFeaturesCount); _teacher = new SOMLearning(_som, _networkSize[0], _networkSize[1]); _inputs = features; _learningRadius = somParams.LearningRadius; _fixedLearningRate = somParams.LearningRate / 10; _driftingLearningRate = _fixedLearningRate * 9; }
// Constructor public MainForm() { InitializeComponent(); // Create network network = new DistanceNetwork(3, 100 * 100); // Create map bitmap mapBitmap = new Bitmap(200, 200, PixelFormat.Format24bppRgb); // RandomizeNetwork(); UpdateSettings(); }
// Constructor public MainForm( ) { // // Required for Windows Form Designer support // InitializeComponent( ); // Create network network = new DistanceNetwork( 3, 100 * 100 ); // Create map bitmap mapBitmap = new Bitmap( 200, 200, PixelFormat.Format24bppRgb ); // RandomizeNetwork( ); UpdateSettings( ); }
static void Main() { network = new DistanceNetwork(2, task.NetworkWidth * task.NetworkHeight); for (int x=0;x<task.NetworkWidth;x++) for (int y = 0; y < task.NetworkHeight; y++) { var n = network.Layers[0].Neurons[x * task.NetworkHeight + y]; n.Weights[0] = rnd.NextDouble() * 0.2 + 0.4; n.Weights[1] = rnd.NextDouble() * 0.2 + 0.4; } learning = new SOMLearning(network, task.NetworkWidth, task.NetworkHeight); learning.LearningRadius = task.LearningRadius; learning.LearningRate = task.LearningRate; Inputs = task.GenerateInputs().ToArray(); pointsPanel = new MyUserControl() { Dock= DockStyle.Fill}; pointsPanel.Paint += DrawPoints; networkPanel = new MyUserControl() { Dock = DockStyle.Fill }; networkPanel.Paint += DrawNetwork; networkGraphControl = new MyUserControl { Dock = DockStyle.Fill }; networkGraphControl.Paint += DrawGraph; var pauseButton = new Button { Text = "Pause/Resume" }; pauseButton.Click+=PauseResume; var table = new TableLayoutPanel() { Dock = DockStyle.Fill, RowCount=2, ColumnCount=2 }; table.Controls.Add(pointsPanel, 0, 0); table.Controls.Add(networkPanel, 0, 1); table.Controls.Add(networkGraphControl, 1, 0); table.Controls.Add(pauseButton,1,1); // table.Controls.Add(pause, 1, 1); table.RowStyles.Add(new RowStyle(SizeType.Percent, 50f)); table.RowStyles.Add(new RowStyle(SizeType.Percent, 50f)); table.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50f)); table.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50f)); form = new Form() { ClientSize = new Size(600, 600), Controls = { table } }; timer = new System.Windows.Forms.Timer(); timer.Tick += (sender, args) => { Learning(); form.Invalidate(true); }; timer.Interval = 100; timer.Start(); Application.Run(form); }
// Update map private void UpdateMap( DistanceNetwork network ) { // get first layer Layer layer = network[0]; // lock Monitor.Enter( this ); // run through all neurons for ( int i = 0, n = layer.NeuronsCount; i < n; i++ ) { Neuron neuron = layer[i]; int x = i % networkSize; int y = i / networkSize; map[y, x, 0] = (int) neuron[0]; map[y, x, 1] = (int) neuron[1]; map[y, x, 2] = 0; } // collect active neurons for ( int i = 0; i < pointsCount; i++ ) { network.Compute( trainingSet[i] ); int w = network.GetWinner( ); map[w / networkSize, w % networkSize, 2] = 1; } // unlock Monitor.Exit( this ); // mapPanel.Invalidate( ); }
// Worker thread void SearchSolution( ) { // set random generators range Neuron.RandRange = new DoubleRange( 0, Math.Max( pointsPanel.ClientRectangle.Width, pointsPanel.ClientRectangle.Height ) ); // create network DistanceNetwork network = new DistanceNetwork( 2, networkSize * networkSize ); // create learning algorithm SOMLearning trainer = new SOMLearning( network, networkSize, networkSize ); // create map map = new int[networkSize, networkSize, 3]; double fixedLearningRate = learningRate / 10; double driftingLearningRate = fixedLearningRate * 9; // iterations int i = 0; RefreshDelegate refreshIterationsBox = delegate () { currentIterationBox.Text = i.ToString( ); }; RefreshDelegate enableControls = delegate () { EnableControls( true ); }; // loop while ( !needToStop ) { trainer.LearningRate = driftingLearningRate * ( iterations - i ) / iterations + fixedLearningRate; trainer.LearningRadius = (double) learningRadius * ( iterations - i ) / iterations; // run training epoch trainer.RunEpoch( trainingSet ); // update map UpdateMap( network ); // increase current iteration i++; // set current iteration's info this.Invoke(refreshIterationsBox); // stop ? if ( i >= iterations ) break; } // enable settings controls this.Invoke(enableControls); }
// Worker thread void SearchSolution() { // set random generators range Neuron.RandRange = new DoubleRange(0, 1000); // create network DistanceNetwork network = new DistanceNetwork(2, neurons); // create learning algorithm ElasticNetworkLearning trainer = new ElasticNetworkLearning(network); double fixedLearningRate = learningRate / 20; double driftingLearningRate = fixedLearningRate * 19; // path double[,] path = new double[neurons + 1, 2]; // input double[] input = new double[2]; // iterations int i = 0; // loop while (!needToStop) { // update learning speed & radius trainer.LearningRate = driftingLearningRate * (iterations - i) / iterations + fixedLearningRate; trainer.LearningRadius = learningRadius * (iterations - i) / iterations; // set network input int currentCity = rand.Next(citiesCount); input[0] = map[currentCity, 0]; input[1] = map[currentCity, 1]; // run one training iteration trainer.Run(input); // show current path for (int j = 0; j < neurons; j++) { path[j, 0] = network[0][j][0]; path[j, 1] = network[0][j][1]; } path[neurons, 0] = network[0][0][0]; path[neurons, 1] = network[0][0][1]; chart.UpdateDataSeries("path", path); // increase current iteration i++; // set current iteration's info UpdateTextbox(currentIterationBox, i.ToString()); //currentIterationBox.Text = i.ToString(); // stop ? if (i >= iterations) break; } // enable settings controls EnableControls(true); }
void KohonenTeach() { Neuron.RandRange = new Range(0.0f, 1.0f); kohonenNetwork = new DistanceNetwork(liczba_wejsc, liczba_neuronow_pion * liczba_neuronow_poziom); kohonenNetwork.Randomize(); SOMLearning teacher = new SOMLearning(kohonenNetwork); double driftingLearningRate = this.wps_zmiany_wsp; double fixedLearningRate = this.pocz_wart_wsp_nauki; double learningRadius = this.pocz_rozmiar_sasiedz; double driftingLearningRadius = this.wsp_zmian_rozm_sasiedz; int iteration = 1; while (!needToStop) { teacher.LearningRate = driftingLearningRate * (numberOfCycles - iteration) / numberOfCycles + fixedLearningRate; teacher.LearningRadius = (double)learningRadius * (numberOfCycles - iteration) / numberOfCycles; teacher.RunEpoch(trainingKData); SetIterationsCount(iteration++); if (iteration > numberOfCycles) break; } teachingDone = true; needToStop = false; UpdateLabels(); }
// On "Start" button click private void startButton_Click(object sender, System.EventArgs e) { // get network size try { networkSize = Math.Max( 5, Math.Min( 50, int.Parse( sizeBox.Text ) ) ); } catch { networkSize = 15; } // get iterations count try { iterations = Math.Max( 10, Math.Min( 1000000, int.Parse( iterationsBox.Text ) ) ); } catch { iterations = 500; } // get learning rate try { learningRate = Math.Max( 0.00001, Math.Min( 1.0, double.Parse( rateBox.Text ) ) ); } catch { learningRate = 0.3; } // get radius try { learningRadius = Math.Max( 1, Math.Min( 30, int.Parse( radiusBox.Text ) ) ); } catch { learningRadius = 3; } // update settings controls UpdateSettings( ); // disable all settings controls except "Stop" button EnableControls( false ); // generate training set for ( int i = 0; i < pointsCount; i++ ) { // create new training sample trainingSet[i] = new double[2] { points[i, 0], points[i, 1] }; } //// run worker thread //needToStop = false; //workerThread = new Thread( new ThreadStart( SearchSolution ) ); //workerThread.Start( ); Neuron.RandRange = new DoubleRange(0, Math.Max(pointsPanel.ClientRectangle.Width, pointsPanel.ClientRectangle.Height)); // create network network = new DistanceNetwork(2, networkSize * networkSize); // create learning algorithm trainer = new SOMLearning(network, networkSize, networkSize); // create map map = new int[networkSize, networkSize, 3]; fixedLearningRate = learningRate / 10; driftingLearningRate = fixedLearningRate * 9; // iterations _i = 0; }