Ejemplo n.º 1
0
        /// <summary>
        /// start a new trainingsession to learn the new imagedatas
        /// </summary>
        /// <param name="TrainingImageData">data (images) to learn</param>
        public void StartTrainingSession(Dictionary <Char, List <ImageData> > TrainingImageData)
        {
            if (!NetworkWasInitialised)
            {
                CharactersToRecognize = new List <Char>(TrainingImageData.Keys);
                WorkingNeuralNetwork  = new NeuralNetwork(ImageSense.Num(), new int[] { ImageSense.Num(), 10, 10, CharactersToRecognize.Count });
                WorkingNeuralNetwork.ShuffleBoth();
                NetworkWasInitialised = true;
            }


            // we need random here
            Random rand = new Random();

            const float BAD_CHARACTER  = -0.5f;     // the expected output for a not matching character
            const float GOOD_CHARACTER = 0.5f;      // the expected output for a matching character

            // precalculate the expected output
            float[] ExpectedOutput = new float[CharactersToRecognize.Count];
            for (int j = 0; j < CharactersToRecognize.Count; j++)
            {
                ExpectedOutput[j] = BAD_CHARACTER;
            }

            // remember last character to calculate the expected output faster
            int LastCharacter = 0;

            int TotalLearningData = 0;

            for (int chars = 0; chars < CharactersToRecognize.Count; chars++)
            {
                TotalLearningData += TrainingImageData[CharactersToRecognize[chars]].Count;
            }

            // raw learning - data
            float[][] X = new float[TotalLearningData][];
            float[][] Y = new float[TotalLearningData][];

            int LearningdataPointer = 0;
            int NumberOfInputs      = ImageSense.Num();
            int NumberOfOutputs     = CharactersToRecognize.Count;

            for (int CurrentCharacter = 0; CurrentCharacter < CharactersToRecognize.Count; CurrentCharacter++)
            {
                ExpectedOutput[LastCharacter]    = BAD_CHARACTER;
                ExpectedOutput[CurrentCharacter] = GOOD_CHARACTER;
                LastCharacter = CurrentCharacter;
                if (TrainingImageData[CharactersToRecognize[CurrentCharacter]].Count != 0)
                {
                    for (int imgs = 0; imgs < TrainingImageData[CharactersToRecognize[CurrentCharacter]].Count; imgs++)
                    {
                        float[] CurrentState = ImageSense.GetMagicMatchSticksState(TrainingImageData[CharactersToRecognize[CurrentCharacter]][imgs]);
                        X[LearningdataPointer] = new float[NumberOfInputs];
                        Y[LearningdataPointer] = new float[NumberOfOutputs];
                        for (int a = 0; a < NumberOfInputs; a++)
                        {
                            X[LearningdataPointer][a] = CurrentState[a];
                        }
                        for (int a = 0; a < NumberOfOutputs; a++)
                        {
                            Y[LearningdataPointer][a] = ExpectedOutput[a];
                        }
                        LearningdataPointer++;
                    }
                }
            }
            WorkingNeuralNetwork.Teacher.MaximumOfEpochs = 1000;
            WorkingNeuralNetwork.Learn(X, Y);
        }