Treinamento de rede neural
Nesta parte do artigo sobre o desenvolvimento da rede neural mais simples, aprenderemos como treinar redes neurais.
Vamos treinar a rede neural para resolver o problema de encontrar padrões em vários números. Para simplificar, esses serão os números 0 e 1.
Para treinar uma rede neural, é preciso ter condições e soluções para os problemas, os problemas precisam resolver um problema.
Os dados de treinamento são assim
Doença |
Responda |
|
1 |
0 |
1 |
0 |
0 |
0 |
0 |
1 |
0 |
Você pode ver esse problema em quase todos os artigos sobre como escrever redes neurais do zero.
Como resultado do treinamento, a rede neural encontra uma conexão lógica entre uma condição e uma resposta.
A solução para este problema é o primeiro número inserido.
Como condição do problema a ser resolvido pela rede neural parece
Doença |
Responda |
|
1 |
1 |
1 |
O treinamento da rede neural visa reduzir as perdas.
Quanto menos perdas, melhor e mais correto será o resultado.
Para evitar fórmulas complicadas, não irei explicar em detalhes os princípios do treinamento, darei um código mais ou menos claro e explicarei as funções necessárias para treinar uma rede neural.
Para o treinamento, precisamos da derivada do sigmóide.
Você pode ver o que é uma derivada na Wikipedia, e a derivada de um sigmóide se parece com isto:
A implementação Python se parece com isto:
def deriv_sig(x):
return sig(x) * (1 - sig(x))
Vamos escrever este código no arquivo Math.py
Também precisamos de 2 constantes para o treinamento:
taxa - taxa de aprendizagem
count_learn - número de repetições de treinamento
count_learn , . rate .
:
rate = 0.1
count_learn = 10000
, 0 count_learn, , .
, :
def learn(self, inputs, answers):
rate = 0.1
count_learn = 10000
for o in range(count_learn):
for inputt, answer in zip(inputs, answers):
sum_n1 = self.n[0].w[0] * inputt[0] + self.n[0].w[1] * inputt[1] + self.n[0].b
n1 = sig(sum_n1)
sum_n2 = self.n[1].w[0] * inputt[0] + self.n[1].w[1] * inputt[1] + self.n[1].b
n2 = sig(sum_n2)
sum_n3 = self.n[2].w[0] * n1 + self.n[2].w[1] * n2 + self.n[2].b
n3 = sig(sum_n3)
out_res = n3
err = -2 * (answer - out_res)
err_rate = rate * err
deriv_sig_n1 = deriv_sig(sum_n1)
deriv_sig_n2 = deriv_sig(sum_n2)
deriv_sig_n3 = deriv_sig(sum_n3)
self.n[0].w[0] -= err_rate * self.n[2].w[0] * deriv_sig_n3 * inputt[0] * deriv_sig_n1
self.n[0].w[1] -= err_rate * self.n[2].w[0] * deriv_sig_n3 * inputt[1] * deriv_sig_n1
self.n[0].b -= err_rate * self.n[2].w[0] * deriv_sig_n3 * deriv_sig_n1
self.n[1].w[0] -= err_rate * self.n[2].w[1] * deriv_sig_n3 * inputt[0] * deriv_sig_n2
self.n[1].w[1] -= err_rate * self.n[2].w[1] * deriv_sig_n3 * inputt[1] * deriv_sig_n2
self.n[1].b -= err_rate * self.n[2].w[1] * deriv_sig_n3 * deriv_sig_n2
self.n[2].w[0] -= err_rate * n1 * deriv_sig_n3
self.n[2].w[1] -= err_rate * n2 * deriv_sig_n3
self.n[2].b -= err_rate * deriv_sig_n3
NeuronNet.
NeuronNet.py :
from Neuron import *
class NeuronNet:
def __init__(self):
self.n = []
for i in range(3):
self.n.append(Neuron(2))
def activate(self, inputs):
return self.n[2].activate(np.array([self.n[0].activate(inputs), self.n[1].activate(inputs)]))
def learn(self, inputs, answers):
rate = 0.1
count_learn = 10000
for o in range(count_learn):
for inputt, answer in zip(inputs, answers):
sum_n1 = self.n[0].w[0] * inputt[0] + self.n[0].w[1] * inputt[1] + self.n[0].b
n1 = sig(sum_n1)
sum_n2 = self.n[1].w[0] * inputt[0] + self.n[1].w[1] * inputt[1] + self.n[1].b
n2 = sig(sum_n2)
sum_n3 = self.n[2].w[0] * n1 + self.n[2].w[1] * n2 + self.n[2].b
n3 = sig(sum_n3)
out_res = n3
err = -2 * (answer - out_res)
err_rate = rate * err
deriv_sig_n1 = deriv_sig(sum_n1)
deriv_sig_n2 = deriv_sig(sum_n2)
deriv_sig_n3 = deriv_sig(sum_n3)
self.n[0].w[0] -= err_rate * self.n[2].w[0] * deriv_sig_n3 * inputt[0] * deriv_sig_n1
self.n[0].w[1] -= err_rate * self.n[2].w[0] * deriv_sig_n3 * inputt[1] * deriv_sig_n1
self.n[0].b -= err_rate * self.n[2].w[0] * deriv_sig_n3 * deriv_sig_n1
self.n[1].w[0] -= err_rate * self.n[2].w[1] * deriv_sig_n3 * inputt[0] * deriv_sig_n2
self.n[1].w[1] -= err_rate * self.n[2].w[1] * deriv_sig_n3 * inputt[1] * deriv_sig_n2
self.n[1].b -= err_rate * self.n[2].w[1] * deriv_sig_n3 * deriv_sig_n2
self.n[2].w[0] -= err_rate * n1 * deriv_sig_n3
self.n[2].w[1] -= err_rate * n2 * deriv_sig_n3
self.n[2].b -= err_rate * deriv_sig_n3
Math.py :
import numpy as np
def sig(x):
return 1 / (1 + np.exp(-x))
def deriv_sig(x):
return sig(x) * (1 - sig(x))
.
main.py :
learn_inputs = np.array([[1, 0], [0, 0], [0, 1]])
learn_answers = np.array([1, 0, 0])
:
net.learn(learn_inputs, learn_answers)
:
x = np.array([1, 1])
if (net.activate(x) < 0.5):
print("0")
else:
print("1")
main.py :
import numpy as np
from NeuronNet import *
net = NeuronNet()
learn_inputs = np.array([[1, 0], [0, 0], [0, 1]])
learn_answers = np.array([1, 0, 0])
net.learn(learn_inputs, learn_answers)
x = np.array([1, 1])
if (net.activate(x) < 0.5):
print("0")
else:
print("1")
:
python main.py
,
|
|
|
|
1 |
1 |
1 |
|
|
|
|
0 |
1 |
0 |
.
.