Formation sur les réseaux neuronaux
Dans cette partie de l'article sur le développement du réseau de neurones le plus simple, nous allons apprendre à entraîner les réseaux de neurones.
Nous formerons le réseau de neurones à résoudre le problème de la recherche de modèles dans un certain nombre de nombres. Pour simplifier, ce seront les nombres 0 et 1.
Pour former un réseau de neurones, il faut avoir des conditions de problème et des solutions, les problèmes doivent résoudre un problème.
Les données d'entraînement ressemblent à ceci
État |
Répondre |
|
une |
0 |
une |
0 |
0 |
0 |
0 |
une |
0 |
Vous pouvez voir ce problème dans presque tous les articles sur l'écriture de réseaux de neurones à partir de zéro.
À la suite de la formation, le réseau neuronal trouve une connexion logique entre une condition et une réponse.
La solution à ce problème est le premier nombre entré.
En tant que condition du problème à résoudre par le réseau de neurones ressemble à
État |
Répondre |
|
une |
une |
une |
La formation sur les réseaux neuronaux consiste à réduire les pertes.
Moins il y a de pertes, meilleur est le résultat et plus il est correct.
Afin d'éviter les formules compliquées, je n'expliquerai pas en détail les principes de l'entraînement, je vais vous donner un code plus ou moins clair et vous expliquer les fonctions nécessaires à l'entraînement d'un réseau de neurones.
Pour l'entraînement, nous avons besoin du dérivé du sigmoïde.
Vous pouvez voir ce qu'est un dérivé sur Wikipedia, et le dérivé d'un sigmoïde ressemble à ceci:
L'implémentation Python ressemble à ceci:
def deriv_sig(x):
return sig(x) * (1 - sig(x))
Écrivons ce code dans le fichier Math.py
Nous avons également besoin de 2 constantes pour l'entraînement:
rate - taux d'apprentissage
count_learn - nombre de répétitions d'entraînement
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 |
.
.