- g2i,
Bonjour à tous,
J’essaye de créer un réseau de neurones pour le faire s’entraîner sur la base de données du MNIST pour vérifier si je l’ai bien construit pour l’entraîner par la suite sur un autre problème.
Afin d’accélérer les temps de calcul, j’ai décidé de m’orienter vers la bibliothèque multiprocessing
de Python, étant donné que pour d’autres tests, j’aurai besoin d’entraîner beaucoup de réseaux de neurones en parallèle. Ainsi, j’ai essayé au maximum de réaliser en parallèle tout ce qui pouvait l’être.
Il apparaît que j’ai deux incompréhensions au moment d’instancier ma classe NeuralNetwork :
- Les
print
ne s’affichent que dans la méthodeadd_perceptron
. - L’attribut
perceptrons
de mon objet est une liste vide.
Après essai, je me rends compte que l’instanciation se termine sans que la méthode add_perceptron
ait finie d’être exécutée, et je me demande pourquoi.
Voici le code partiel de la classe NeuralNetwork
:
from perceptron import Perceptron
from multiprocessing import Pool, Manager
import numpy as np
class NeuralNetwork:
def __init__(self, perceptrons_size, epsilon=1):
print("Création du réseau de neurones...\n")
self.perceptrons = []
self.epsilon = epsilon
self.iterations = 0
pool = Pool()
manager = Manager()
locks = [manager.Lock()]
print("Création des perceptrons...\n")
for i in range(len(perceptrons_size) - 1):
locks.append(manager.Lock())
pool.apply_async(
self.add_perceptrons,
args=(locks[i], locks[i+1], perceptrons_size[i], perceptrons_size[i+1])
)
pool.close()
pool.join()
def add_perceptrons(self, previous_lock, lock, perceptron_entries_number, size):
print("\tCréation d'un perceptron...\n")
lock.acquire()
p = Perceptron(perceptron_entries_number, size)
previous_lock.acquire()
self.perceptrons.append(p)
print("Fini !")
lock.release()
Voici le code partiel de la classe Perceptron
:
from neuron import Neuron
import numpy as np
from multiprocessing import Pool
class Perceptron:
def __init__(self, entries_number, size):
self.size = size
self.neurons = []
self.output = np.zeros(size)
self.grad = 0
pool = Pool()
for i in range(self.size):
pool.apply_async(self.add_neuron, args=entries_number).start()
pool.close()
pool.join()
def add_neuron(self, entries_number):
self.neurons.append(Neuron(np.random.random_sample(entries_number + 1), self))
Et enfin le code partiel de la classe Neuron
:
import numpy as np
import activation_functions
from multiprocessing import Pool
class Neuron:
def __init__(
self,
weights,
perceptron,
activation=activation_functions.ActivationFunction(
activation_functions.sigmoid,
activation_functions.sigmoid_prime
)
):
self.weights = weights[:]
self.perceptron = perceptron
self.activation = activation
self.d = 0
Et enfin, voici mon main.py
:
from neuralnetwork import NeuralNetwork
import numpy as np
import mnist
if __name__ == '__main__':
# mnist.init()
training_images, temp, test_images, test_labels = mnist.load()
training_labels = []
for i in range(len(temp)):
training_labels.append(np.zeros(10))
training_labels[-1][temp[i]] = 1
nn = NeuralNetwork([784, 10])
mnist
fonctionne parfaitement bien, pas de souci là-dessus a priori. Lors de l’exécution, seul "Création d’un perceptron…" est affiché dans la console, et l’attribut perceptrons
de nn
est une liste vide. D’où pourraient venir mes erreurs ?
Merci d’avance !