Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторна робота 1 ШІ.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
421.9 Кб
Скачать

Приклад 2.

Отже, розпізнавати ми будемо цифри, написані білим по чорному, такі як ці:

                      Картинки 45 на 45 пікселів, а значить входів в нашу нейронну мережу буде 45 * 45. Для простоти, розпізнаємо лише цифри від 0 до 5, тому нейронів у нас буде 6 - по одному на кожну відповідь.

Cтруктура нашої нейромережі:

Кожен зв'язок входу мережі з нейроном має свою вагу. Імпульс, проходячи через зв'язок, змінюється: імпульс = імпульс * вага_ зв'язку. Нейрон отримує імпульси від усіх входів і просто підсумовує їх. Нейрон набрав більший сумарний імпульс перемагає.

Класи для представлення елементів мережі (C #):

/ / Вхід

public class Input

{

     / / Зв'язки з нейронами

     public Link [] OutgoingLinks;

}

/ / Зв'язок входу з нейроном

public class Link

{

     / / Нейрон

     public Neuron Neuron;

     / / Вага зв'язку

     public double Weight;

}

public class Neuron

{

     / / Всі входи нейрона

     public Link [] IncomingLinks;

     / / Накопичений нейроном заряд

     public double Power {get; set;}

}

Стан класу KohonenNetwork це масив Input [] і масив Neuron []:

public class KohonenNetwork

{

     private readonly Input [] _inputs;

     private readonly Neuron [] _neurons;

...

}

Припустимо, що наша мережа вже навчена. Тоді, щоб дізнатися що зображено на картинці ми викличемо метод Handle, там все перемножити, складеться і знайдеться максимум:

/ / Пропустити вектор через нейронну мережу

public int Handle (int [] input)

{

     for (var i = 0; i <_inputs.Length; i + +)

     {

          var inputNeuron = _inputs [i];

          foreach (var outgoingLink in inputNeuron.OutgoingLinks)

          {

               outgoingLink.Neuron.Power + = outgoingLink.Weight * input [i];

          }

     }

     var maxIndex = 0;

     for (var i = 1; i <_neurons.Length; i + +)

     {

          if (_neurons [i]. Power> _neurons [maxIndex]. Power)

               maxIndex = i;

     }

     / / Зняти імпульс з усіх нейронів:

     foreach (var outputNeuron in _neurons)

     {

          outputNeuron.Power = 0;

     }

     return maxIndex;

}

Для навчання пред'являємо картинки і вказуємо що на них намальовано:

 Навчання - це зміна ваг зв'язків:

public void Study (int [] input, int correctAnswer)

{

     var neuron = _neurons [correctAnswer];

     for (var i = 0; i <neuron.IncomingLinks.Length; i + +)

     {

          var incomingLink = neuron.IncomingLinks [i];

          incomingLink.Weight = incomingLink.Weight + 0.5 * (input [i] - incomingLink.Weight);

     }

}

Після навчання на двох шрифтах, нейронна мережа розрізняє цифри і з інших шрифтів. У тому числі буде пройдений контрольний тест на таких ось цифрах: