IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques d'apprentissage profond Discussion :

Problèmes Poids synaptiques réseaux de neurones


Sujet :

Bibliothèques d'apprentissage profond

  1. #1
    Invité
    Invité(e)
    Par défaut Problèmes Poids synaptiques réseaux de neurones
    Bonsoir à tous,

    Pour un projet, je dois coder un réseau de neurones permettant l'identification de caractères/nombres mais sans utilisation de librairies comme Tensorflow ou Keras.
    J'ai donc suivi la théorie mais problème, mes poids synaptiques ainsi que mon erreur au bout d'une centaine d'itérations seulement deviennent incohérents (tendent vers 0 ou 1).
    Je suppose deux choses:
    1-Soit mon calcul de l'erreur avec la dérivée de la fonction sigmoïde est fausse
    2-Soit la rétro propagation du gradient est erronée




    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    from matplotlib import pyplot as plt #Libraires pour opérations mathématiques"
    import numpy as np
    import math
    import random
    """import step1"""#etape recuperation info image
    import step2#étape conversion image en liste binaire
    import retribution#fonction pour ecrire poids synaptiques dans fichier txt
     
     
    x=64 #Variables"
    y=64
    z=10
     
     
    t_apprentissage = 0.1 #Taux d'apprentissage#
    Donnees = [0]*x #Données de l'image#
    for o in range(x):
        Donnees[o]=int(step2.listes[o])
    Entrees = [0]*x #Couche d'entrée#
    Cachees = [0]*y #Couche cachée#
    Sorties = [0]*z #Couche de sortie#
    W_En_Ca = [random.uniform(-1, 1) for i in range(x*y)] #Poids synaptiques de la couche cachée#
    W_Ca_So = [random.uniform(-1, 1) for i in range(y*z)] #Poids synaptiques de la couche de sortie#
    for c in range(x*y):
    	W_En_Ca[c]=float(retribution.listes1[c])
    for n in range(y*z):
    	W_Ca_So[n]=float(retribution.listes2[n])
    Intermed = [0]*y #Somme pondérées cumulées pour la couche cachée#
    Sort_p = [0]*z #Somme pondérées cumulées pour la couche de sortie#
    S_Souhaitées = [0]*z #Sorties Souhaitées#
    Erreurs = [0]*z #Erreurs simples#
    Gradients = [0]*(y*z) #Gradients de l'erreur#
    Cache_Local = [0]*(x*y) #Liste stockant la rétropagation de l'erreur de la couche sortie vers cachée#
     
     
    def sigmoid(x): #fonction sigmoïde#                
        return 1/(1+np.exp(-x)) 
     
    def sigmoidDerivee(x):#derivative of sigmoid
        return x*(1.0 - x)
     
    def propager():
        for f in range(z):
            S_Souhaitées[f]=float(step2.Sortie[f])
        for g in range(x): #Copie les données dans la couche d'entrée#
            Entrees[g]=Donnees[g]
        for i in range(y): #Propage dans la couche cachée#
            for j in range(x):
                Intermed[i] += (W_En_Ca[(i*x)+j])*Entrees[j]   
        for k in range(y): #Applique la fonction sigmoïde#
            Cachees[k] = sigmoid(Intermed[k])  
        for l in range(z): #Propage dans la couche de sortie#
            for m in range(y):
                Sort_p[l] += (W_Ca_So[(l*y)+m])*Cachees[m] 
        for n in range(z): #Applique la fonction sigmoïde#
            Sorties[n] = sigmoid(Sort_p[n])
     
     
     
    def apprentissage():
        for i in range(z): #Calcul de l'erreur en sortie#
            Erreurs[i] = (S_Souhaitées[i] - Sorties[i])
        for j in range(z): #Calcul des gradients couche de sortie#
            for k in range(y):
                Gradients[(j*y)+k] = ((Erreurs[j])*sigmoidDerivee(Sorties[j]))
        for l in range(y): #Calcul des gradients couche cachée#
            for n in range(x):
                e=0
                for m in range(z):    
                    e+= (W_Ca_So[(n*z)+m])*Gradients[(l*z)+m]
            Cache_Local[(l*x)+n] = e*sigmoidDerivee(e) 
        for o in range(z): #Mise à jour des poids couche de sortie#
            for p in range(y):
                W_Ca_So[(o*y)+p]=(W_Ca_So[(o*y)+p])+e
        for q in range(x): #Mise à jour des poids couche cachée#
            for r in range(y):
                W_En_Ca[(q*y)+r]=(W_En_Ca[(q*y)+r])+Cache_Local[(l*x)+n]
        str_W_En_Ca=','.join(map(str, W_En_Ca))
        fichier1 = open("Poids_synaptiques_Entrees_Cachee.txt", "w")
        fichier1.write(str_W_En_Ca)
        fichier1.close()
        str_W_Ca_So=','.join(map(str, W_Ca_So))
        fichier2 = open("Poids_synaptiques_Entrees_Sortie.txt", "w")
        fichier2.write(str_W_Ca_So)
        fichier2.close()
        retribution.lirecompter1()
        retribution.lirecompter2()
     
     
     
     
    propager() #On propage#
    apprentissage() #Phase d'apprentissage#
    print(Sorties)
    print(S_Souhaitées)
    Voilà, désolé si mon code est un peu long

  2. #2
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    juin 2013
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : juin 2013
    Messages : 1 460
    Points : 1 901
    Points
    1 901
    Par défaut
    Cela m'interpelle au niveau mathématiques mais comme je ne sais pas de quoi on parle vraiment...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def sigmoid(x): #fonction sigmoïde#                
        return 1/(1+np.exp(-x)) 
     
    def sigmoidDerivee(x):#derivative of sigmoid
        return x*(1.0 - x)
    Pas d'aide par mp.

  3. #3
    Membre chevronné

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    mars 2013
    Messages
    1 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : mars 2013
    Messages : 1 111
    Points : 2 082
    Points
    2 082
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def sigmoidDerivee(x):#derivative of sigmoid
        return x*(1.0 - x)
    n'est pas la dérivée de la sigmoide. Par contre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def sigmoidDerivee(x):#derivative of sigmoid
        return np.exp(-x)/(1.0 - np.exp(-x))**2
    l'est (suffit de prendre papier crayon et de dériver à la main). Et de cela on peut constater en effet que la dérivée vérifie l'égalité suivante : y' = y(1-y) (et ce n'est pas x la variable, c'est y=sigmoid(x) la variable ...

  4. #4
    Invité
    Invité(e)
    Par défaut
    Ok merci je vais tester ça
    Dernière modification par Winjerome ; 03/12/2018 à 19h58. Motif: Inutile de citer intégralement le message précédent

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par lg_53 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def sigmoidDerivee(x):#derivative of sigmoid
        return x*(1.0 - x)
    n'est pas la dérivée de la sigmoide. Par contre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def sigmoidDerivee(x):#derivative of sigmoid
        return np.exp(-x)/(1.0 - np.exp(-x))**2
    l'est (suffit de prendre papier crayon et de dériver à la main). Et de cela on peut constater en effet que la dérivée vérifie l'égalité suivante : y' = y(1-y) (et ce n'est pas x la variable, c'est y=sigmoid(x) la variable ...
    Après avoir testé le code, je rencontrais des erreurs en boucle, j'ai donc pensé à regarder votre dérivée de la fonction sigmoïde. Ne serait-ce pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    np.exp(-x)/(1.0 + np.exp(-x))**2
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    np.exp(-x)/(1.0 - np.exp(-x))**2

  6. #6
    Membre chevronné

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    mars 2013
    Messages
    1 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : mars 2013
    Messages : 1 111
    Points : 2 082
    Points
    2 082
    Par défaut
    Oui tout à fait, la dérivée de 1/u est -u'/u² (cf. vos cours de math). C'est votre x(1-x) qui est venu me perturber d'un signe -

+ Répondre à la discussion
Cette discussion est résolue.

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo