Программирование - это просто
Advertisement
Главная arrow Искусственный интеллект arrow Искусственный интеллект arrow Генетический алгоритм (платный раздел) arrow Генетический алгоритм. Урок 5. Вводим передаточную функцию.
26.05.2018 г.
Главное меню
Главная
Системный подход
Интернет магазин
Биржевые роботы
Программные продукты
Математика и информатика
1С:Предприятие
C#, Delphi, VB, F#, Web и пр.
Искусственный интеллект
Услуги
Ча. Во. (FAQ)
Платный раздел
Наука для чайников
Разное
Размышления
Карта сайта
Друзья сайта
Excel-это не сложно
Все о финансах
Генетический алгоритм. Урок 5. Вводим передаточную функцию. Печать E-mail
Автор 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 г. )
 
« След.   Пред. »
 
© 2018 Программирование - это просто
Joomla! - свободное программное обеспечение, распространяемое по лицензии GNU/GPL.
Русская локализация © 2005-2008 Joom.Ru - Русский Дом Joomla!
Design by Mamboteam.com | Powered by Mambobanner.de
Я принимаю Яндекс.Деньги
Мы принимаем
Банковские карты
Оплатите покупку в интернет-магазине банковскими картами VISA и Mastercard любого банка.
узнать больше
Электронный кошелек
Моментальная оплата покупок с помощью вашего электронного кошелька RBK Money.
узнать больше
Банковский платеж
Оплатите покупку в любом российском банке. Срок зачисления средств на счет - 3-5 рабочих дней.
узнать больше
Денежные переводы
Оплата покупок через крупнейшие системы денежных переводов CONTACT и Unistream.
узнать больше
Почтовые переводы
Оплатите покупку в любом отделении Почты России. Срок зачисления платежа - 3-4 рабочих дня.
узнать больше
Платежные терминалы
Оплата покупок в терминалах крупнейших платежных систем в любом городе России - быстро и без комиссии.
узнать больше