Страницы

Поиск по вопросам

понедельник, 8 июля 2019 г.

Создание простой нейросети

Доброго времени суток. Допустим хочу сделать простую нейросеть для XOR:

X=0, У=0, О=0 | X=1, У=0, О=1 | Х=0, У=1, О=1 | Х=1, У=1, О=0

Я так понимаю, что 1,1 и 2,1 входные и им передается значение без изменения. После передачи сигналы далее, в каждом нейроне значение умножается на вес и т.д. В конце я должен сравнить выходы 1,3 и 2,3 и получить ответ, если это 1 ряд, то ответ 0, если 2 ответ 1. Для простоты пусть класс нейрон содержит вес на каждый вход (т.е. 2) и силу сигнала:
Class Neuron Public weight() As Double = {0, 0} Public power As Double = 0.0 End Class
Дальше создаем массив и получаем случайный вес, в пределах единицы:
Dim neural(2, 1) As Neuron Dim rand As New Random For I As Integer = 0 To 2 Step 1 For J As Integer = 0 To 1 Step 1 neural(I, J) = New Neuron neural(I, J).weight(0) = rand.NextDouble() neural(I, J).weight(1) = rand.NextDouble() Next Next
Получаем входные значения:
neural(0, 0).power = Console.ReadLine() neural(0, 1).power = Console.ReadLine()
Функция активации:
Function Sigmoid(ByRef int As Double) As Double Const e_sigmoid As Double = 2.71828 Return (1 / (1 + (e_sigmoid ^ (-(int))))) End Function
И простой код работы этой нейронной сети:
For I As Integer = 1 To 2 Step 1 neural(I, 0).power = Sigmoid(((neural(I - 1, 0).power * neural(I, 0).weight(0)) + (neural(I - 1, 1).power * neural(I, 0).weight(1)))) neural(I, 1).power = Sigmoid(((neural(I - 1, 0).power * neural(I, 1).weight(0)) + (neural(I - 1, 1).power * neural(I, 1).weight(1)))) Next
Вот у меня вопрос будет ли это работать и как её обучить? Примеры не важно на чем.


Ответ

Прислушался к комментарию о 3-х нейронах. Простая реализация:

Module Module1
'Переменные НС: Dim enters() As Double = {0, 0} Dim hidden_layer() As Double = {0, 0} Dim output As Double = 0 Dim synapses_hidden(,) As Double = {{0.0, 0.1}, {0.0, 0.1}} Dim synapses_out() As Double = {0.1, 0.0}
'Данные для обучения: Dim learn(,) As Integer = {{0, 0}, {1, 0}, {0, 1}, {1, 1}} 'Обучает всем ответам кроме 0 - 0 - 1: Dim learn_answer() As Integer = {0, 1, 1, 1}
Sub Main() 'Обучаем НС: Console.WriteLine("::: TRAINING NETWORK START :::") 'Глобальная переменная и временная: Dim global_error As Double = 0.0 Dim currect_error As Double = 0.0 'Массив ошибок: Dim errors(hidden_layer.Length - 1) 'Счетчик итераций: Dim iteration As Integer = 0
'Выполняем пока есть ошибка: Do global_error = 0 For I As Integer = 0 To learn.Length / 2 - 1 Step 1 'Заполняем вход для НС: enters(0) = learn(I, 0) enters(1) = learn(I, 1)
'Суммируем: StartNetwork()
'Получаем погрешность: currect_error = learn_answer(I) - output 'Пишем в глобальную: global_error += Math.Abs(currect_error) 'Пишем в массив ошибок: For J As Integer = 0 To errors.Length - 1 Step 1 errors(J) = currect_error * synapses_out(J) Next 'Корректируем веса (от выхода к входу): For J As Integer = 0 To enters.Length - 1 Step 1 For K As Integer = 0 To synapses_hidden.Length / 2 - 1 Step 1 synapses_hidden(K, J) += 0.1 * errors(J) * enters(J) Next Next 'Меняем следующий слой: For J As Integer = 0 To synapses_out.Length - 1 Step 1 synapses_out(J) += 0.1 * currect_error * hidden_layer(J) Next Next iteration += 1 Loop While global_error <> 0 Console.WriteLine("::: NUMBER OF ITERATIONS OF THE TRAINING -> " + iteration.ToString + " TIMES :::")
'Запуск НС For I As Integer = 0 To learn.Length / 2 - 1 Step 1 'Заполняем входные данные enters(0) = learn(I, 0) enters(1) = learn(I, 1) 'Суммируем StartNetwork() 'Выводим результат Console.WriteLine(output) Next
Console.ReadLine() End Sub
Sub StartNetwork() 'Суммируем для скрытого слоя: For I As Integer = 0 To hidden_layer.Length - 1 Step 1 hidden_layer(I) = 0 For J As Integer = 0 To enters.Length - 1 Step 1 hidden_layer(I) += synapses_hidden(I, J) * enters(J) Next 'Функция активации: If hidden_layer(I) > 0.5 Then hidden_layer(I) = 1.0 Else hidden_layer(I) = 0.0 End If Next output = 0 'Выходной слой: For I As Integer = 0 To hidden_layer.Length - 1 Step 1 output += synapses_out(I) * hidden_layer(I) Next 'Функция активации: If output > 0.5 Then output = 1 Else output = 0 End If End Sub
End Module

Комментариев нет:

Отправить комментарий