
Приклад 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);
}
}
Після навчання на двох шрифтах, нейронна мережа розрізняє цифри і з інших шрифтів. У тому числі буде пройдений контрольний тест на таких ось цифрах: