.
Генетический алгоритм. Урок 5. Вводим передаточную функцию.
Автор megabax   
25.01.2014 г.
unit AIObj

Генетический алгоритм. Урок 5. Вводим передаточную функцию.

Что бы смотреть урок полностью, подпишитесь на платный раздел.

В платном разделе статья находиться здесь.


Сегодня мы будем усовершенствовать нейронную сеть, которую начали на прошлом уроке. Для начала предусмотрим возможность задать передаточную функцию (если не знаете что это такое см. сюда). Для этого нам понадобиться интерфейс передаточной функции, а так же класс констант, идентифицирующих передаточные функции ...

...

Гауссовская функция. Она вычисляется по формуле:

Теория нейронных сетей. Урок 2. Сетевые функции и функции преобразование нейрона

И вот так мы ее реализуем...

...

...Далее реализуем функцию "Линейная с насыщением", она описывается вот такой формулой:

Теория нейронных сетей. Урок 2. Сетевые функции и функции преобразование нейрона

А реализуем мы ее вот так...

...

...Займемся нейроном. Пропишем туда передаточную функцию:

...

        /// <summary>

        /// Передаточная функция

        /// </summary>

        public ITransFunc trans;

...

В конструктор добавим код создания этой самой функции...

...

...Наконец, переходим к нашим клонам метода Cross, которые предназначены для скрещивания разных объектов нейросети.

Для нейрона:

        /// <summary>

        /// Метод для скрещивания нейронов нейросети

        /// </summary>

        /// <param name="a_neuron1">Первый нейрон</param>

        /// <param name="a_neuron2">Второй нейрон</param>

        /// <returns>Полученный нейрон</returns>

        public static Neuron Cross(Neuron a_neuron1, Neuron a_neuron2)

        {

...

...

В этом методе мы используем скрещивание передаточных функций, реализуем его тоже...

...

...Все, со скрещиванием закончили. Перейдем к мутациям. Мутация отдельного слоя:

        /// <summary>

        /// Мутировать указанный слой

        /// </summary>

        /// <param name="layer">Слой</param>

        static protected void Mutation(Layer layer)

        {

            foreach (Neuron neuron in layer.neurons)

            {

                Mutation(neuron);

            }

        }

Как видим, из него вызывается метод мутации отдельного нейрона...

...

 

....и так, все сделано. Приступим к тестированию. В форме ничего переделывать не надо, просто зададим нужные обучающие матрицы, и все.

Что же мы в итоге видим? Обучение стало происходить гораздо лучше. Вот например, такая картинка:

 

0 1 2 3
1      
2      
3      

 

На уроке 3 на такой обучающей матрице сеть вырождалась. Сейчас нормально обучается:

 

Генетический алгоритм. Урок 5. Вводим передаточную функцию.

 

Но для чистоты эксперимента мы все таки сделаем небольшую проверку. Делаем два поля и кнопочку. Обработчик кнопочки:

        private void button3_Click(object sender, EventArgs e)

        {

            NeuralNet net = new NeuralNet();

            net.incomes.Add(Convert.ToDouble(tbX.Text));

            net.incomes.Add(Convert.ToDouble(tbY.Text));

            net.createLayer(2);

            net.createLayer(1);

 

            //первый слой первый нейрон

            net.layers[0].neurons[0].weights[0] = 0.307;

            net.layers[0].neurons[0].weights[1] = 0.348;

            net.layers[0].neurons[0].trans = TransFuncFactory.CreateTransFuncAsId(TransFuncConstId.ThreeLevelsId);

            (net.layers[0].neurons[0].trans as ThreeLevels).level_plus = 1.000496;

            (net.layers[0].neurons[0].trans as ThreeLevels).level_minus = -3.815E-06;

 

            //первый слой второй нейрон

            net.layers[0].neurons[1].weights[0] = 0.0;

            net.layers[0].neurons[1].weights[1] = 0.0;

            net.layers[0].neurons[1].trans = TransFuncFactory.CreateTransFuncAsId(TransFuncConstId.GaussFuncId);

            (net.layers[0].neurons[1].trans as GaussFunc).C = 1.063;

            (net.layers[0].neurons[1].trans as GaussFunc).Sigm = 2.05235E-289;

 

            //второй слой первый нейрон

            net.layers[1].neurons[0].weights[0] = 39.681;

            net.layers[1].neurons[0].weights[1] = -9.807E+152;

            net.layers[1].neurons[0].trans = TransFuncFactory.CreateTransFuncAsId(TransFuncConstId.GaussFuncId);

            (net.layers[1].neurons[0].trans as GaussFunc).C = 1.0;

            (net.layers[1].neurons[0].trans as GaussFunc).Sigm = 5.6985E-306;

 

            net.compute();

 

            pop.species[0].net = net;

            pop.species[0].Compute();

            MessageBox.Show(pop.species[0].FinalFunc.ToString());

            //MessageBox.Show(net.outcome.ToString());

 

        }

 

И что же мы видим? С указанными значениями считает не так, как на образце. Так что придется отглючивать. Но этим мы займемся на следующем уроке.

 


Скриншоты, помеченные знаком *, являются цитатами и иллюстрациями  программного продукта "Microsoft Visual Studio 2010 Professional", авторское право на который принадлежит корпорации Microsoft.. 


Последнее обновление ( 25.01.2014 г. )