Redes neurais artificiais. Parte 3

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:





f` (x) = \ frac {e ^ {- x}} {(1 + e ^ {- x}) ^ 2} = f (x) * (1-f (x))

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









.

























.





github.





, .








All Articles