Bonjour,
J'ai des difficultés à implémenter le perceptron multicouches.
J'essaye d'apprendre la fonction xor.
J'ai donc 2 neurones d'entrée, 2 neurones cachés et 1 neurone de sortie.
j'ai pris ε = 1, la fonction sigmoide comme fonction de transfert et j'itère 100 fois.
ma base est la suivante:
0 0 -> 0
1 0 -> 1
0 1 -> 1
1 1 -> 0
j'ai implémenté l'algorithme en c++ à partir du pseudo code suivant:
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 Algorithme de rétropropagation du gradient : Initialiser aléatoirement les coefficients wij dans [-0.5 ; 0.5] Répéter Prendre un exemple (x, c) de S Calculer la sortie o Pour toute cellule de sortie i δi = σ(yi) ∗ (ci − oi) = oi ∗ (1 − oi) ∗ (ci − oi) Fin Pour Pour chaque couche de q − 1 à 1 Pour chaque cellule i de la couche courante δi = σ(yi) ∗ [Σ(k ∈ Succ(i)) (δk ∗ wki)] = oi ∗ (1 − oi) ∗ [Σ(k ∈ Succ(i)) (δk ∗ wki)] Fin Pour Fin Pour Pour tout poids wij wij = wij + ε ∗ δi ∗ xij Fin Pour Fin Répéter
avec la légende suivante:
Lorsque je passe des entrées à mon réseau (après apprentissage), j'obtiens des valeurs de sorties qui convergent vers 0.5, au lieu de 1 ou 0.Notations :
• n cellules
• Cellules désignées par un indice i, 0 ≤ i < n
• p cellules de sortie
• k indice d ’une cellule de sortie
• ck : sortie attendue pour la cellule de sortie k avec l ’entrée x
• ok : sortie calculée pour la cellule de sortie k avec l ’entrée x
• xij : entrée associée au lien entre cellule I vers cellule j
• wij : coefficient synaptique associé au lien entre cellule i vers cellule j
• Succ(i) : ensemble des cellules qui prennent comme entrée la sortie de la
cellule i.
• Pred(i) : ensemble des cellules dont la sortie est une entrée de la cellule i.
• yi : entrée totale de la cellule i : yi = Σ(j ∈ Pred(i)) (wij ∗ xij)
• oi : sortie de la cellule I : oi = σ(yi)
Est-ce que le problème viendrait de mes paramètres ou est-ce que l'algorithme sur lequel je me suis basé est incorrect?
Merci d'avance.
Partager