Доброго времени суток. Допустим хочу сделать простую нейросеть для 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
Комментариев нет:
Отправить комментарий