.
Практика нейронных сетей. Урок 10. Введение в многослойную нейросеть
Автор megabax   
13.04.2014 г.
unit AIObj

Практика нейронных сетей. Урок 10. Введение в многослойную нейросеть

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

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


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

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

...

...Далее, делаем обработчики кнопочек.

Функция И

        private void btnStudyAnd_Click(object sender, EventArgs e)

        {

            matrix.Clear();

            add_to_matrix(0, 0, 0);

            add_to_matrix(0, 0, 1);

            add_to_matrix(0, 1, 0);

            add_to_matrix(1, 1, 1);

            study();

        }

...

...Ну и реализация кнопочки "Проверить":

        private void btnTest_Click(object sender, EventArgs e)

        {

            neuron.inputs[0] = Convert.ToDouble(nudIn1.Value);

            neuron.inputs[1] = Convert.ToDouble(nudIn2.Value);

            neuron.compute();

            MessageBox.Show(neuron.output.ToString());

        }

Теперь мы можем убедиться в том, что однонейронная нейросеть может обучиться распознавать функции "И", а так же "ИЛИ":

Практика нейронных сетей. Урок 10. Введение в многослойную нейросеть

А вот при попытке обучить нейрон для вычисления исключающего ИЛИ заканчивается эпик фэйлом:

Практика нейронных сетей. Урок 10. Введение в многослойную нейросеть

Что еще раз доказывает, что однослойную сеть невозможно обучить линейно НЕ сепарабельным задачам. Но выход есть. ...

...

...Теперь давайте все это запрограммируем. Начнем с класса, реализующего слой нейросети - Layer:

    /// <summary>

    /// Слой нейронной сети

    /// </summary>

    public class Layer

    {

        /// <summary>

        /// Нейроны слоя

        /// </summary>

        public List<Neuron> neurons;

 

        public Layer()

        {

            neurons = new List<Neuron>();

        }

 

        /// <summary>

        /// Рассчитать слой

        /// </summary>

        public void compute()

        {

            foreach (Neuron neuron in neurons) neuron.compute();

            foreach (Neuron neuron in neurons) neuron.send_signals();

        }

 

        /// <summary>

        /// Обучение слоя

        /// </summary>

        /// <param name="t">Желаемая реакция</param>

        /// <param name="a_inputs">Входной вектор</param>

        public void study(double t, List<double> a_inputs)

        {

            foreach (Neuron neuron in neurons) neuron.study(t, a_inputs);

        }

    }

Обратите внимание...

....

...Программа действительно выдает правильный результат:

Практика нейронных сетей. Урок 10. Введение в многослойную нейросеть

И так, подведем итоги. Мы наглядно показали, что однослойные нейронные сети не справляются с задачами, которые не являются линейносепарабельными. Эту проблема решатся за счет введение дополнительных нейроннных слоев.