Для початку, необхідно визначити, що таке нейрон. В
біології нейрон - спеціалізована клітина, з якої складається нервова система. Біологічний нейрон має будову, показане на рис.1.
Рис.1 Схема нейрона
Нейронну мережу можна ввести як сукупність нейронів і їх взаємозв'язків. Отже, для того, щоб визначити штучну (не біологічне) нейронну мережу необхідно:
- Задати архітектуру мережі;
- Визначити динаміку окремих елементів мережі - нейронів;
- Визначити правила, за якими нейрони будуть взаємодіяти між собою;
- Описати алгоритм навчання, тобто формування зв'язків для вирішення поставленого завдання.
Як архітектури нейронної мережі буде використовуватися мережа Хопфілда. Дана модель, мабуть, є найбільш поширеною математичної моделлю в нейронауці. Це обумовлено її простотою і наочність. Мережа Хопфілда показує, яким чином може бути організована пам'ять в мережі з елементів, які не є дуже надійними. Експериментальні дані показують, що при збільшенні кількості поламаних нейронів до 50%, ймовірність правильної відповіді вкрай близька до 100%. Навіть поверхневе зіставлення нейронної мережі (наприклад, мозку) і Фон-Неймановская ЕОМ показує, наскільки сильно розрізняються ці об'єкти: наприклад, частота зміни станів нейронів ( "тактова частота") не перевищує 200 Гц, тоді як частота зміни стану елементів сучасного процесора може досягати декількох ГГц (10 9 Гц).
Формальний опис мережі Хопфілда
Мережа складається з N штучних нейронів, аксон кожного нейрона пов'язаний з дендритами інших нейронів, утворюючи зворотний зв'язок. Архітектура мережі зображена на рис. 2.
Рис.2 Архітектура нейронної мережі Хопфілда
Кожен нейрон може перебувати в одному з 2-х станів:
Рівнянь (1), (2), (3), (5) досить для визначення штучної нейронної мережі Хопфілда і можна перейти до її реалізації.
Реалізація нейронної мережі Хопфілда, визначеної вище буде проводитися на мові C ++. Для початку, необхідно визначити додаткові типи даних (докладніше див. Лістинг 1)
- тип вагових коефіцієнтів (обраний тип float);
- тип, що описує стан нейрона (обраний власний введений тип-перерахування);
- тип, що описує стан мережі в момент t (обраний стандартний контейнер vector);
- тип, що описує матрицю вагових коефіцієнтів зв'язків нейронів (обраний контейнер vector контейнерів vector).
Лістинг 1. Визначення нових типів
Навчання мережі, або, точніше, обчислення елементів матриці відповідно до (3) проводиться функцією LearnNeuroNet. приймаючої на вхід список навчальних образів і повертає об'єкт типу link_koefs_t. Значення обчислюються тільки для ніжнетреугольний елементів. Значення верхнетреугольних елементів обчислюються відповідно до виразом (4). Загальний вигляд методу LearnNeuroNet показаний в лістингу 2.
Лістинг 2. Навчання нейронної мережі
Оновлення станів нейронів реалізовано за допомогою функтора neuro_net_system. У перевантажений оператор функтора передається початковий стан функтора передається початковий стан. є вхідним розпізнаються чином (відповідно до (5)) - покажчик на об'єкт типу neurons_line.
Оператор функтора модифікує об'єкт, який потрібно типу neurons_line до стану нейронної мережі в момент часу. Значення жорстко не фіксоване і визначається виразом:
тобто коли стан кожного нейрона не змінилося за 1 "такт".
Для обчислення (2) застосовані 2 алгоритму STL:
- inner_product для обчислення суми творів вагових коефіцієнтів і станів нейронів (тобто обчислення (2) для певного);
- transform для обчислення нових значень для кожного нейрона (тобто обчислення пункту вище для кожного можливого)
Вихідний код функтора neurons_net показаний в лістингу 3.
Лістинг 3. Функтор, який реалізує роботу нейронної мережі
Для виведення в консоль вхідних і вихідних образів створений тип neurons_line_print_descriptor. який зберігає посилання на образ і формат форматування (ширину і висоту прямокутника, в який буде вписаний образ). Для цього типу перевизначений оператор <<. Исходный код типа neurons_line_print_descriptor и оператора вывода в поток показан в листинге 4.
Лістинг 4. Навчання нейронної мережі
Для перевірки працездатності реалізації, нейронна мережа була навчена 2 ключовим образам:
Рис.3 Ключові образи
На вхід подавалися спотворені образи. Нейронна мережа коректно розпізнала вихідні образи. Спотворені образи і розпізнані образи показані на рис.4, 5
Рис.4 Розпізнавання образу 1
Рис.5 Розпізнавання образу 2
Запуск програми проводиться з командного рядка рядком виду: AppName WIDTH HEIGHT SOURCE_FILE [LEARNE_FILE_N]. де:
- AppNaame - назва файлу, що виконується;
- WIDTH. HEIGHT - ширина і висота прямокутника, в який будуть вписуватися вихідний і ключові образи;
- SOURCE_FILE - вихідний файл з початковим чином;
- [LEARNE_FILE_N] - один або кілька файлів з ключивимі образами (через пробіл).
Для отримання докладної інформації про можливості оптимізації компілятора зверніться до нашого повідомленням про оптимізацію.