POO et multiprocessing

a marqué ce sujet comme résolu.

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 :

  1. Les print ne s’affichent que dans la méthode add_perceptron.
  2. 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 !

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte