Problème de machine learning en python

Suivre ce topic
Ce topic est suivi par : Personne...
Ce topic a été résolu
Artcreation

Artcreation Le 20 novembre 2020 à 08:37 (Édité le 20 novembre 2020 à 08:50)

Bonjour, je suis un debutant en python en je veux apprendre le machine learning. (oui je sais c'est. pas banal)

Bref j'ai programme le debut d'une IA mais la j'ai un probleme: Les resultat et le taux d´ereurs sont beaucoup trop élevés ! Le code:

#-------------------------------------------------------------------------------
# Name:        appauto
# Purpose:
#
# Author:      Artcoco1
#
# Created:     19/11/2020
# Copyright:   (c) Artcoco1 2020
# Licence:     <your licence>
#-------------------------------------------------------------------------------
import numpy as np

x_entrer = np.array(([3,1.5],[2,1],[4,1.5],[3,1],[3.5,0.5],[2,0.5],[5.5,1],[1,1],[4.5,1.5]),dtype=float)
y = np.array(([1],[0],[1],[0],[1],[0],[1],[0]),dtype=float)

x_entrer = x_entrer/np.amax(x_entrer, axis=0)

X = np.split(x_entrer,[8])[0]
xPrediction = np.split(x_entrer,[8])[1]

class Neural_Network(object):
    def __init__(self):
        self.inputSize = 2
        self.outputSize = 1
        self.hiddenSize = 3
        self.W1 = np.random.randn(self.inputSize, self.hiddenSize)
        self.W2 = np.random.randn(self.hiddenSize, self.outputSize)
        #print(self.W1)

    def forward(self,X):
        self.z = np.dot(X,self.W1)
        self.z2 = self.sigmoid(self.z)
        self.z3 = np.dot(self.z2,self.W2)
        o = self.sigmoid(self.z3)
        return o

    def sigmoid(self,s):
        return 1/(1+np.exp(-s))

    def sigmoidPrime(self,s):
        return s * (1-s)

    def backward(self,X,y,o):
        self.o_error = y - o
        self.o_delta = self.o_error * self.sigmoidPrime(o)

        self.z2_error = self.o_delta.dot(self.W2.T)
        self.z2_delta = self.z2_error * self.sigmoidPrime(self.z2)

    def train(self,X,y):
        o = self.forward(X)
        self.backward(X,y,o)
    def predict (self):
        print("Donnee predite apres entrainement: ")
        print("Entree: \n" + str(xPrediction))
        print("Sortie: \n" + str(self.forward(xPrediction)))

        if(self.forward(xPrediction) < 0.5):
            print("La fleur est bleu!")
        else:
            print("La fleur est rouge!")

NN = Neural_Network()

for i in range(100000):
    print("#" + str(i) + "\n")
    NN.train(X,y)
print("Sortie entrees: \n" + str(X))
print("Sortie actuelle: \n" + str(y))
print("Sortie predite: \n" + str(np.matrix.round(NN.forward(X),2)))
print("\n")
NN.predict() 

J´espere que vous pourez m'aider en trouvant le moyen de la faire apprendre plus vite et plus correctement! ArtCreation team

PrimFX

PrimFX Le 21 novembre 2020 à 21:14

Hello @Artcreation,

Bienvenue à toi sur le forum et dans le merveilleux monde du Machine Learning 😃

Si tu débutes à la fois en Python et en ML, je te recommanderais de regarder quelques tutos uniquement sur Python, sa syntaxe et ses spécificités avant de passer au ML. Ça pourra certainement t'épargner quelques heures de débug lorsque tu travailleras sur des projets plus complexes de ML / IA.

Ça fait un moment que je n'ai pas codé de NN from scratch mais je vois que tu as oublié de mettre à jour les valeurs des poids (i.e. weights) de ton réseau de neurones dans la propagation arrière. Il faudrait ajouter les lignes suivantes à la fin de ta fonction backward :

self.W1 += X.T.dot(self.z2_delta)
self.W2 += self.z2.T.dot(self.o_delta)

Source du bout de code : enlight.nyc

Avec ça, tu gagnes déjà en précision mais tu peux également diminuer le nombre d'itérations pour l'entraînement de ton réseau de neurones histoire de le rendre plus rapide 😉 Le tout étant de trouver le bon compromis entre vitesse et précision du modèle.

Il faut également garder à l'esprit que "sur-entraîner" ton réseau neuronal risque de le faire tomber dans l' "overfitting" : les prédictions seront excellentes pour les jeux de données d'entraînement, mais pas pour les données réelles (plus de détails sur Wikipédia). Évidemment, sous-entraîner ton modèle le rendra également obsolète. Le nombre d'itération (i.e. epoch d'entraînement) dépend donc de ce compromis que tu devras déterminer. J'ai par exemple testé avec 1000 itérations sur ton modèle et le résultat est déjà assez convaincant.

En espérant avoir pu t'aider !

A bientôt,

Boris ('PrimFX')

Meilleure réponse
Artcreation

Artcreation Le 20 novembre 2020 à 08:39

Ne vous interessez pas a "la fleur est bleu/rouge" c'est un test...

PrimFX

PrimFX Le 21 novembre 2020 à 21:14

Hello @Artcreation,

Bienvenue à toi sur le forum et dans le merveilleux monde du Machine Learning 😃

Si tu débutes à la fois en Python et en ML, je te recommanderais de regarder quelques tutos uniquement sur Python, sa syntaxe et ses spécificités avant de passer au ML. Ça pourra certainement t'épargner quelques heures de débug lorsque tu travailleras sur des projets plus complexes de ML / IA.

Ça fait un moment que je n'ai pas codé de NN from scratch mais je vois que tu as oublié de mettre à jour les valeurs des poids (i.e. weights) de ton réseau de neurones dans la propagation arrière. Il faudrait ajouter les lignes suivantes à la fin de ta fonction backward :

self.W1 += X.T.dot(self.z2_delta)
self.W2 += self.z2.T.dot(self.o_delta)

Source du bout de code : enlight.nyc

Avec ça, tu gagnes déjà en précision mais tu peux également diminuer le nombre d'itérations pour l'entraînement de ton réseau de neurones histoire de le rendre plus rapide 😉 Le tout étant de trouver le bon compromis entre vitesse et précision du modèle.

Il faut également garder à l'esprit que "sur-entraîner" ton réseau neuronal risque de le faire tomber dans l' "overfitting" : les prédictions seront excellentes pour les jeux de données d'entraînement, mais pas pour les données réelles (plus de détails sur Wikipédia). Évidemment, sous-entraîner ton modèle le rendra également obsolète. Le nombre d'itération (i.e. epoch d'entraînement) dépend donc de ce compromis que tu devras déterminer. J'ai par exemple testé avec 1000 itérations sur ton modèle et le résultat est déjà assez convaincant.

En espérant avoir pu t'aider !

A bientôt,

Boris ('PrimFX')

Meilleure réponse
Artcreation

Artcreation Le 23 novembre 2020 à 09:23

MERCIIIIIIIIIIII !!!

ca marche super bien!

en 10000 test les resultats sont quasiment justes!

et merci aussi pour tout les conseils !

PrimFX

PrimFX Le 23 novembre 2020 à 13:36

Parfait, de rien 😃

Vous devez être connecté pour poster une réponse. Se connecter ou Créer un compte