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í:
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 |
.
.