Réseaux de neurones artificiels. Partie 3

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:





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

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









.

























.





github.





, .








All Articles