Redes neuronales artificiales. Parte 3

Entrenamiento de redes neuronales

En esta parte del artículo sobre el desarrollo de la red neuronal más simple, aprenderemos cómo entrenar redes neuronales.





Entrenaremos la red neuronal para resolver el problema de encontrar patrones en varios números. Por simplicidad, estos serán los números 0 y 1.





Para entrenar una red neuronal, uno debe tener condiciones y soluciones de problemas, los problemas deben resolver un problema.





Los datos de entrenamiento se ven así





Condición





Responder





uno





0





uno





0





0





0





0





uno





0





Puede ver este problema en casi todos los artículos sobre cómo escribir redes neuronales desde cero.





Como resultado del entrenamiento, la red neuronal encuentra una conexión lógica entre una condición y una respuesta.





La solución a este problema es el primer número ingresado.





Como condición del problema a resolver por la red neuronal se ve como





Condición





Responder





uno





uno





uno





El entrenamiento de redes neuronales se trata de reducir las pérdidas.





Cuantas menos pérdidas, mejor y más correcto será el resultado.





Para evitar fórmulas complicadas, no explicaré en detalle los principios del entrenamiento, te daré un código más o menos claro y explicaré las funciones necesarias para entrenar una red neuronal.





Para el entrenamiento, necesitamos la derivada del sigmoide.





Puede ver qué es una derivada en Wikipedia, y la derivada de un sigmoide se ve así:





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

La implementación de Python se ve así:





def deriv_sig(x):
    return sig(x) * (1 - sig(x))
      
      



Escribamos este código en el archivo Math.py





También necesitamos 2 constantes para el entrenamiento:





tasa - tasa de aprendizaje

count_learn - número de repeticiones de entrenamiento





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