Своя нейронная сеть на C# исходники
Нейронная сеть на C# + Исходники
Введение
Многие сталкиваются с проблемой где взять нейронную сеть. Самому писать - долго, а если качать какую-либо другую, то придется долго разбираться в ней что да как работает. Не плохо бы написать свою нейронную сеть. Этим мы сейчас и займемся.
Немного теории
В кратце что такое нейронная сеть? - Это особая функция с X входами и Y выходами, которую обучают на имеющихся данных (обучающей выборке), а потом используют в своих целях, например в распознавании изображений. Не вижу смысла писать тут как устроена сеть ибо информации об этом очень много, например: aiportal.ru/articles/neural-networks
Моя Нейронная сеть
Программных реализаций хороших НС довольно много, например FANN, я пытался разобраться с ней, но так и не понял как прикрутить ее к C#(Если кто разберется - дайте знать) и решил написать свою. В качестве активационной функции я взял сигмоид(рис. 1, рис. 2). Обучать сеть решил методом обратного распространения ошибки.
Рис. 1 Сигмоид
Рис. 2 График сигмоида
Начнем со структуры классов. Логично описать класс нейрона, в котором содержится активационная функция, состояние нейрона и т. п... Но я решил пойти иначе и сделал класс LayerNW - Слой нейросети:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
// Класс - слой нейросети public class LayerNW { // Тут у нас хранятся веса double[,] Weights; // Число входов и выходов в слое int cX, cY; // Заполняем веса случайными числами public void GenerateWeights() // Выделяет память под веса protected void GiveMemory() // Конструктор с параметрами. передается количество входных и выходных нейронов public LayerNW(int countX, int countY) // Возвращаем или устанавливаем число входов public int countX // Возвращаем или устанавливаем число выходов public int countY // Возвращаем или устанавливаем вес в заданной связи public double this[int row, int col] } |
Комментарии все говорят за себя. Теперь приступим к описанию прототипа класса нейронной сети:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
// Класс - нейронная сеть public class NeuralNW { // Слои НС LayerNW[] Layers; // Число слоев, входов и выходов сети int countLayers = 0, countX, countY; // Выход сети double[][] NETOUT; // Дельта - коэффициент изменения весов double[][] DELTA; // Конструкторы /* Создает полносвязанную сеть из 1 слоя. sizeX - размерность вектора входных параметров sizeY - размерность вектора выходных параметров */ public NeuralNW(int sizeX, int sizeY) /* Создает полносвязанную сеть из n слоев. sizeX - размерность вектора входных параметров layers - массив слоев. Значение элементов массива - количество нейронов в слое */ public NeuralNW(int sizeX, params int[] layers) // Конструктор открывает НС public NeuralNW(String FileName) // Открывает НС public void OpenNW(String FileName) // Сохраняет НС public void SaveNW(String FileName) // Возвращает значение j-го слоя НС public void NetOUT(double[] inX, out double[] outY, int jLayer) // Возвращает значение НС public void NetOUT(double[] inX, out double[] outY) // Возвращает ошибку (метод наименьших квадратов) public double CalcError(double[] X, double[] Y) /* Обучает сеть, изменяя ее весовые коэффициэнты. X, Y - обучающая пара. kLern - скорость обучаемости В качестве результата метод возвращает ошибку 0.5(Y-outY)^2 */ public double LernNW(double[] X, double[] Y, double kLern) // Свойства. Возвращает число входов и выходов сети public int GetX public int GetY // Число слоев в сети public int CountLayers /* Вспомогательные закрытые функции */ // Возвращает все значения нейронов до lastLayer слоя void GetOUT(double[] inX, int lastLayer) // Возвращает все значения нейронов всех слоев void GetOUT(double[] inX) // Возвращает размер НС в байтах int GetSizeNW() // Возвращает num-й слой Нейронной сети public LayerNW Layer(int num) // Методы ниже используются для записи в файл и открытия из файла нейросети // Разбивает переменную типа int на байты и записывает в массив void WriteInArray(byte[] mas, ref int pos, int value) // Разбивает переменную типа int на байты и записывает в массив void WriteInArray(byte[] mas, ref int pos, double value) // Извлекает переменную типа int из 4-х байтов массива int ReadFromArrayInt(byte[] mas, ref int pos) // Извлекает переменную типа double из 8-ми байтов массива double ReadFromArrayDouble(byte[] mas, ref int pos) } |
Теперь нужно определиться со структурой хранения нейронной сети в файл. Я сделал это следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
struct NeuralNetwork { // Количество слоев, 4 байта int countLayers; // Число нейронов в каждом слое + на выходе int[] X; // Размерность countLayers+1 /* Строка выше, описанная более подробно // Число входов в 1-м слое int X1; .... // Число входов в n-м слое int Xn; // Число выходов в n-м слое int Y; */ // веса первого слоя. double[][] weight_1; // Размерность [X1][X2] /* записаны в следующей последовательности weight_1[0][0]; weight_1[0][1]; weight_1[0][2]; ... */ ... // веса n-го слоя double[][] weight_n; // Размерность [Xn][Y] } |
Ну вот, что-то вроде такого. Т. е. в файл сначала записываю количество слоев, потом количество нейронов в каждом слое и потом веса. Теперь осталось реализовать все эти функции.
Скачать библиотеку нейронной сети и пример использования можно тут, исходники ее тут
Скачать исходники библиотеки можно тут
P. S. Данная статья обладает авторскими правами, поэтому при ее использовании вам необходимо указать источник:
Автор: Носов Александр
Сайт: kernel-zone.ru
Комментарии
WoulԀ Ⲩoᥙ Also visit my hߋmepage Daftar togel: https://Megatongkol.com/
Cheers! Wherе arе your contact details tһough?
Ⲥɑn Υou Review mү web page - Daftar Togel: https://Megatogel.xyz/
compared to books, as I foᥙnd tһis article at this site.
Ԝould You Feel free tо surf to my website: Bandar Togel: https://Megatongkol.com/
so he/shе needs to be availаble that in dеtail, so thɑt thing iѕ maintained оver herе.
Ꮤould Yⲟu Feel free to visit mу webpage: judi togel: https://megatop4d.com/
Wⲟuld You Mʏ weblog Daftar
Togel: https://megatogel.xyz/
Can You Feel free tⲟ visit mу web site :: Daftar Togel: https://megatop4d.com/
tested tߋ see іf it can survive a 40 foot drop, ϳust so sһe can bе a youtube sensation. My iPad іѕ
now broken and sһe has 83 views. I know this iѕ cοmpletely off topic Ƅut I had to
share іt witһ someone!
Would Υоu my page ... judi Togel: https://Megatop4D.com
I'd be very thankful if you could elaborate a
little bit further. Bless yoս!
Can Yоu Feel free tօ surf tо my webpage; Judi
Slot: http://Www.Kdbadmin.com/slots
I am reading this impressive post tօ improve mʏ experience.
Ꮃould You My web site :: Judi togel: https://megatop4d.com/
ɑs no one else know such detailed аbout mʏ trouble.
Уoս are wonderful! Tһanks!
Ϲan Yߋu Аlso visit mу blog post :: Bandar Togel: https://Megatop4D.com
RSS лента комментариев этой записи