web-dev-qa-db-fra.com

ValueError: l'opérande de sortie non diffusable de forme (3,1) ne correspond pas à la forme de diffusion (3,4)

J'ai récemment commencé à suivre les didacticiels Deep Learning de Siraj Raval sur YouTube, mais une erreur s'est produite lorsque j'ai essayé d'exécuter mon code. Le code provient du deuxième épisode de sa série, Comment faire un réseau de neurones. Quand j'ai exécuté le code, j'ai eu l'erreur:

Traceback (most recent call last):
File "C:\Users\dpopp\Documents\Machine Learning\first_neural_net.py", line 66, in <module>
neural_network.train(training_set_inputs, training_set_outputs, 10000)
File "C:\Users\dpopp\Documents\Machine Learning\first_neural_net.py", line 44, in train
self.synaptic_weights += adjustment
ValueError: non-broadcastable output operand with shape (3,1) doesn't match the broadcast shape (3,4)

J'ai vérifié plusieurs fois avec son code et je n'ai trouvé aucune différence. J'ai même essayé de copier et coller son code à partir du lien GitHub. C'est le code que j'ai maintenant:

from numpy import exp, array, random, dot

class NeuralNetwork():
    def __init__(self):
        # Seed the random number generator, so it generates the same numbers
        # every time the program runs.
        random.seed(1)

        # We model a single neuron, with 3 input connections and 1 output connection.
        # We assign random weights to a 3 x 1 matrix, with values in the range -1 to 1
        # and mean 0.
        self.synaptic_weights = 2 * random.random((3, 1)) - 1

    # The Sigmoid function, which describes an S shaped curve.
    # We pass the weighted sum of the inputs through this function to
    # normalise them between 0 and 1.
    def __sigmoid(self, x):
        return 1 / (1 + exp(-x))

    # The derivative of the Sigmoid function.
    # This is the gradient of the Sigmoid curve.
    # It indicates how confident we are about the existing weight.
    def __sigmoid_derivative(self, x):
        return x * (1 - x)

    # We train the neural network through a process of trial and error.
    # Adjusting the synaptic weights each time.
    def train(self, training_set_inputs, training_set_outputs, number_of_training_iterations):
        for iteration in range(number_of_training_iterations):
            # Pass the training set through our neural network (a single neuron).
            output = self.think(training_set_inputs)

            # Calculate the error (The difference between the desired output
            # and the predicted output).
            error = training_set_outputs - output

            # Multiply the error by the input and again by the gradient of the Sigmoid curve.
            # This means less confident weights are adjusted more.
            # This means inputs, which are zero, do not cause changes to the weights.
            adjustment = dot(training_set_inputs.T, error * self.__sigmoid_derivative(output))

            # Adjust the weights.
            self.synaptic_weights += adjustment

    # The neural network thinks.
    def think(self, inputs):
        # Pass inputs through our neural network (our single neuron).
        return self.__sigmoid(dot(inputs, self.synaptic_weights))

if __== '__main__':

    # Initialize a single neuron neural network
    neural_network = NeuralNetwork()

    print("Random starting synaptic weights:")
    print(neural_network.synaptic_weights)

    # The training set. We have 4 examples, each consisting of 3 input values
    # and 1 output value.
    training_set_inputs = array([[0, 0, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]])
    training_set_outputs = array([[0, 1, 1, 0]])

    # Train the neural network using a training set
    # Do it 10,000 times and make small adjustments each time
    neural_network.train(training_set_inputs, training_set_outputs, 10000)

    print("New Synaptic weights after training:")
    print(neural_network.synaptic_weights)

    # Test the neural net with a new situation
    print("Considering new situation [1, 0, 0] -> ?:")
    print(neural_network.think(array([[1, 0, 0]])))

Même après avoir copié et collé le même code que celui utilisé dans l'épisode de Siraj, je reçois toujours la même erreur.

Je viens juste de commencer à étudier l'intelligence artificielle et je ne comprends pas ce que l'erreur veut dire. Quelqu'un pourrait-il s'il vous plaît expliquer ce que cela signifie et comment y remédier? Merci!

4
dpopp783

Remplacez self.synaptic_weights += adjustment par

self.synaptic_weights = self.synaptic_weights + adjustment

self.synaptic_weights doit avoir une forme de (3,1) et adjustment doit avoir une forme de (3,4). Alors que les formes sont broadcastables numpy ne doit pas aimer essayer d’attribuer le résultat avec shape (3,4) à un tableau de forme (3,1)

a = np.ones((3,1))
b = np.random.randint(1,10, (3,4))

>>> a
array([[1],
       [1],
       [1]])
>>> b
array([[8, 2, 5, 7],
       [2, 5, 4, 8],
       [7, 7, 6, 6]])

>>> a + b
array([[9, 3, 6, 8],
       [3, 6, 5, 9],
       [8, 8, 7, 7]])

>>> b += a
>>> b
array([[9, 3, 6, 8],
       [3, 6, 5, 9],
       [8, 8, 7, 7]])
>>> a
array([[1],
       [1],
       [1]])

>>> a += b
Traceback (most recent call last):
  File "<pyshell#24>", line 1, in <module>
    a += b
ValueError: non-broadcastable output operand with shape (3,1) doesn't match the broadcast shape (3,4)

La même erreur se produit lorsque vous utilisez numpy.add et que vous spécifiez a comme tableau de sortie

>>> np.add(a,b, out = a)
Traceback (most recent call last):
  File "<pyshell#31>", line 1, in <module>
    np.add(a,b, out = a)
ValueError: non-broadcastable output operand with shape (3,1) doesn't match the broadcast shape (3,4)
>>> 

Une nouvelle a doit être créée

>>> a = a + b
>>> a
array([[10,  4,  7,  9],
       [ 4,  7,  6, 10],
       [ 9,  9,  8,  8]])
>>> 
5
wwii

Si tout va bien, vous devez maintenant avoir exécuté le code, mais le problème entre son code et votre code est cette ligne: 

training_output = np.array([[0,1,1,0]]).T  

Lors de la transposition, n'oubliez pas d'ajouter 2 crochets, j'avais le même problème pour le même code, cela a fonctionné pour moi ...

0
user10864598