Distance network.
Distance network is a neural network of only one distance layer. The network is a base for such neural networks as SOM, Elastic net, etc.
Inheritance: Network
        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;
        }
Beispiel #2
0
        /// <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;
        }
Beispiel #4
0
        // 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( );
		}
Beispiel #6
0
        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);
        }
Beispiel #7
0
        // 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( );
        }
Beispiel #8
0
        // 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);
        }
Beispiel #9
0
        // 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);
        }
Beispiel #10
0
        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();
        }
Beispiel #11
0
        // 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;
        }