.
Пишем биржевого робота на C#. Урок 2. Нейросеть
Автор megabax   
23.09.2011 г.
Структура программы на примере простейшей программы

  Пишем биржевого робота на C#. Урок 2. Нейросеть

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

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


Исходники к уроку можно скачать в платном разделе.

Сегодня мы рассмотрим библиотеку для создания нейронной сети, которая разработана в рамка проекта "Генетический алгоритм". На основе этой нейросети мы и будем постепенно строить робота. Прежде чем перейти к рассмотрению тестового примера ("Редактор нейросети версия 1.1") я перечислю модули библиотеки и их назначение..

...

... Если мы запустим тестовый пример (скачать exe-шник можно здесь) то увидим вот такое окно:

Пишем биржевого робота на C#. Урок 2. Нейросеть

По умолчанию у нас добавлена одна нейросеть ("сеть 0"):

Пишем биржевого робота на C#. Урок 2. Нейросеть

Мы можем добавить еще нейросети:

Пишем биржевого робота на C#. Урок 2. Нейросеть

после чего нейросетей будет несколько:

Пишем биржевого робота на C#. Урок 2. Нейросеть

Добавление нейросети реализовано следующим образом...

...

 

.. Так же мы можем загрузить нейросеть из файла:

Пишем биржевого робота на C#. Урок 2. Нейросеть

 

при этом добавленная нейросеть добавляется в конец списка:

Пишем биржевого робота на C#. Урок 2. Нейросеть

 

Вот как реализовано добавление нейросети из файла...

        /// <summary>

        /// Загрузка нейросети.

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void openToolStripMenuItem_Click(object sender, EventArgs e)

        {

            openFileDialog1.Title = "Открыть нейросеть...";

            openFileDialog1.Filter = "Файлы нейросетей|*.nnf|Все файлы|*.*";

            if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.Cancel)

                return

            try

            {

                FileStream fs = new FileStream(openFileDialog1.FileName, FileMode.Open);

                BinaryFormatter formatter = new BinaryFormatter();

                NeuralNetwork newNetwork = (NeuralNetwork)formatter.Deserialize(fs);

                fs.Close();

                newNetwork.Bind(_set);

                _set.AddLast(newNetwork);

            }

            catch (IOException ex)

            {

                MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Warning);

            }

            UIManager.UpdateDataGrid(dgvNetwork, _network);

        }

 

Тоесть, мы просто читаем нейросеть из файла, а потом добавляем ее в набор. Возможность сохранить и прочитать нейросеть через BinaryFormatter существует благодаря тому, что класс нейросети объявлен как сериализуемый:

    /// <summary>

    /// Класс нейросети. Состоит из входного слоя [0] и слоев нейронов.

    /// </summary>

    [Serializable]

    class NeuralNetwork : Container

    {

 

        LinkedList<NeuralLayer> _layers;

        NeuralComputationManager _manager;

        uint _id;

 ...

 

 

Так как сеть можно добавить из файла, то ее можно и сохранить в файл:

Пишем биржевого робота на C#. Урок 2. Нейросеть

 

Сохраняется нейросеть так же через  BinaryFormatter...

 

...

 

После добавления слоя к нему нужно добавить элементы:

Пишем биржевого робота на C#. Урок 2. Нейросеть

 

Для того, что бы добавить к слою элемент(нейрон), нужно сначала получить его (метод класса нейросети GetLayer), затем вызвать у онного метод AddEntity...

 

...

 

... Совокупность слоев и элементов образуют нейросеть:

Пишем биржевого робота на C#. Урок 2. Нейросеть

 

числами отображаются значения на выходе нейрона (нулевой слой - это "рецепторы", входные нейроны. У нейронов первого слоя мы может устанавливать значения:

 

Пишем биржевого робота на C#. Урок 2. Нейросеть

 

У нейронов последующих слоев мы не можем установить значения, они вычисляемые:

Пишем биржевого робота на C#. Урок 2. Нейросеть

 

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

 

Пишем биржевого робота на C#. Урок 2. Нейросеть

 

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

Пишем биржевого робота на C#. Урок 2. Нейросеть

 

Добавленные синапсы у нас отобразятся в таблице справа:

Пишем биржевого робота на C#. Урок 2. Нейросеть

 

Теперь попробуем рассчитать нейросеть. На выходе у нас должно получиться 11 (1*3+2*4=11):

Пишем биржевого робота на C#. Урок 2. Нейросеть

 

Теперь попробуем сменить агрегатор, например, поставив максимум:

Пишем биржевого робота на C#. Урок 2. Нейросеть

 

Теперь мы получим результат 8 (максимум из 1*3 и 2*4).

Что касается передаточной функции. Пока их реализовано два вида: "как есть" и "персептрон". Первую вы уже испробовали. Давайте займемся второй. У нас при этом программа запросит ввести пороговые значения:

Пишем биржевого робота на C#. Урок 2. Нейросеть

 

Если мы сейчас рассчитаем сеть, то получим результат нуль: значение вычисления между пороговыми значения. Если оно будет ниже нижнего порога, то -1, выше верхнего +1.

 

Рассчитать можно не только нейросеть, но и весь пакет нейросетей, только сначала нужно настроить связи между нейросетями:

 

Пишем биржевого робота на C#. Урок 2. Нейросеть

 

Порядок расчета нейросетей в пакете задается по кнопочке "порядок":

Пишем биржевого робота на C#. Урок 2. Нейросеть

 

Теперь поговорим об агрегаторах. Все агрегаторы объявлены от абстрактного класса SynapsesAggregator...

 

....

 

...Если вы разработали какой либо новый агретор, то его нужно давить в процедуру static SynapsesAggregator(), например, вот так...

 

....

 

... Давайте проверим:

Пишем биржевого робота на C#. Урок 2. Нейросеть

 

 

Передаточная функция реализуется в пространстве имен NeuronTransferFunctions...

 

...

 

... Теперь можно тестировать изменения в программе:

 

Пишем биржевого робота на C#. Урок 2. Нейросеть

 

Исходники к уроку можно скачать в платном разделе.

 


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

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