Bonjour à tous,
je cherche en ce moment à créer un template de réseau de neurone, mais je ne parviens pas à programmer la fonction d'apprentissage du perceptron.
Est-ce que quelqu'un pourrais me donner le principe de cet apprentissage (rétropropagation du gradient) ?
A titre d'info, voici mon programme actuel (en ruby) :
#=====================================================
# initialisation des constantes :
#=====================================================
STEPS = 0 #renvoie uniquement 1 ou 0
SIGMOIDE = 1 #renvoie des valeurs réelles entre 0 et 1
TANHYP = 2 #renvoie des valeurs réelles entre -1 et 1
GAUSS =3 #renvoie des valeurs réelles entre 0 et 1
#======================================================
# déclaration d'un neurone
#======================================================
class Neurone
attr_accessor :weight #tableau des poids dendritiques
attr_accessor :entry #tableau des entrées dentritiques
attr_accessor :out #sauvegarde de la sortie sur l'axone
attr_accessor :type #type de fonction seuil à utiliser
#nbe est le nombre d'entrées (de dendrites) du neurone
#le type de seuillage à effectuer (STEPS, SIGMOIDE, TANHYP, GAUSS)
def initialize(nbe,type = STEPS)
@type = type
@weight = Array.new(nbe,1)
end
#fonction de seuillage de la sortie
#x constitue la somme des entrées pondérées de leur poids respectif
def seuil(x)
case @type
when STEPS
if @type < 0
return 0
else
return 1
end
when SIGMOIDE
return (1/(1 + Math::exp(-x)))
when TANHYP
return (2 / (1 + Math::exp(-x)) - 1)
when GAUSS
return (Math::exp(-(x**2)))
end
end
#calcule de la sortie
def exit(entry)
@entry = entry
wx = 0
for i in 0...@weight.size
wx += @entry[i]*@weight[i]
end
@out = seuil(wx) #la variable @out permet de garder une trace de la dernière sortie du neurone
return @out
end
end
#======================================================
# déclaration d'une couche
#======================================================
class Layer
attr_accessor :entry #entrée de la couche
attr_accessor :neurone #tableau des neurones de la couche
attr_accessor :type #type de traitement des neurones de la couche
attr_accessor :out #tableau de sauvegarde de la dernière sortie de la couche
#initialisation de la couche
#nbn est le nombre de neurones, nbe est le nombre d'entrées, et type le type de seuillage des neurones
def initialize(nbn,nbe,type = STEPS)
@neurone = Array.new(nbn, Neurone.new(nbe, type))
@type = type
end
#fonction de calcule de la sortie de la couche
def exit(entry)
@out = Array.new(@neurone.size)
@entry = entry
for i in 0...@neurone.size
@out[i] = @neurone[i].exit(@entry)
end
return @out
end
end
#====================================================
# déclaration d'un perceptron multi-couche
#====================================================
class Perceptron
attr_accessor :entry #entrée du perceptron
attr_accessor :layer #tableau des couches du perceptron
attr_accessor :out #sortie du perceptron
#initialisation du perceptron
#structure est la structure interne en couches et neurones du perceptron
#exemple : [4,2,1] est un perceptron à trois couches de respectivement 4, 2 et 1 neurone
#soe est le nombre de dendrites par neurones en première couche (soe = size of entry)
def initialize(soe, structure,type = STEPS)
@layer = Array.new(structure.size)
@layer[0] = Layer.new(structure[0],soe,type)
for i in 1...structure.size
@layer[i] = Layer.new(structure[i],structure[i-1],type)
end
end
#fonction de calcule de la sortie du perceptron
def exit(entry)
@entry = entry
e = entry
for i in 0...@layer.size
e = @layer[i].exit(e)
end
@out = e
return @out
end
end
En esperant une réponse,
@+
__________________________
Gné !