2017-04-17 2 views
0

Ich versuche Operation über Neuronales Netzwerk mit Theano-Bibliothek in Python zu implementieren. Hier ist mein Code:ValueError: Dimension Mismatch Fehler in Theano

import theano 
import theano.tensor as T 
import numpy as np 
import matplotlib.pyplot as plt 

#Define variables: 
x = T.matrix('x') 
w1 = theano.shared(np.random.uniform(0,1,(3,3))) 
w2 = theano.shared(np.random.uniform(0,1,(1,3))) 

learning_rate = 0.01 

#Define mathematical expression:c for forward pass 
z1 = T.dot(x,w1) 
a1 = 1/(1+T.exp(-z1)) 
z2 = T.dot(a1,w2.T) 
a2 = 1/(1 + T.exp(-z2)) 
#Let’s determine the cost as follows: 
a_hat = T.vector('a_hat') #Actual output 
cost = -(a_hat*T.log(a2) + (1-a_hat)*T.log(1-a2)).sum() 
dw2,dw1 = T.grad(cost,[w2,w1]) 

train = theano.function(
inputs = [x,a_hat], 
outputs = [a2,cost], 
updates = [ 
    [w1, w1-learning_rate*dw1], 
    [w2, w2-learning_rate*dw2] 
] 
) 

#Define inputs and weights 
inputs = np.array([ 
[0, 0], 
[0, 1], 
[1, 0], 
[1, 1] 
]) 

inputs = np.append(np.ones((inputs.shape[0],1)), inputs, axis=1) 

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

#Iterate through all inputs and find outputs: 
cost = [] 
for iteration in range(30000): 
    pred, cost_iter = train(inputs, outputs) 
    cost.append(cost_iter) 

ich nicht in der Lage bin ValueError: Dimension mismatch; shapes are (*, *), (*, 4), (4, 1), (*, *), (*, 4), (4, 1) Apply node that caused the error: den Fehler zurückverfolgen. Selbst wenn ich die Dimension der Gewichtsvektoren w1 und w2 ändere, bleibt der Fehler gleich. Ich bin neu in Theano und weiß nicht viel über das Debuggen. Kann mir jemand helfen? Danke.

Antwort

0

Sie haben eine Eingang Dimension Mismatch, wie Sie in der Fehlermeldung sehen:

ValueError: Input dimension mis-match. (input[1].shape[1] = 4, input[2].shape[1] = 1) 

Genauer gesagt hier:

Inputs values: [array([[-1.]]), array([[ 0., 0., 0., 1.]]), array([[-1.13961476], 
     [-1.28500784], 
     [-1.3082276 ], 
     [-1.4312266 ]]), array([[-1.]]), array([[ 1., 1., 1., 0.]]), array([[ 1.13961476], 
     [ 1.28500784], 
     [ 1.3082276 ], 
     [ 1.4312266 ]])] 

Sie Inspiration auf dem XOR neuronales Netz zu bekommen, dieses Beispiel hat wurde behandelt here, und durch dieses Tutorial zu gehen wird Ihnen helfen, theano zu verstehen.

Ich hatte auch harte Zeiten, als ich zuerst versucht, theano zu verwenden. Sehr wenige Beispiele und Tutorials. Vielleicht kannst du auch Lasagne checken, es ist eine Bibliothek, die auf Theano basiert, aber ich hatte das Gefühl, dass es einfacher war, es in die Hand zu nehmen.

Ich hoffe, das wird Ihnen helfen.

[EDIT]

Verwenden Sie die folgenden Flags, die Sie für Sie zu finden, wo der Fehler von

theano.config.exception_verbosity='high' 
theano.config.optimizer='None' 

In Ihrem Fall kommt können wir diese interessante Linien in der Ausgabe finden:

Backtrace when the node is created(use Theano flag traceback.limit=N to make it longer): 
    File "SO.py", line 30, in <module> 
    cost = -(a_hat*T.log(a2) + (1-a_hat)*T.log(1-a2)).T.sum() 

Also, hier sind die Gewichte, die wir wollten:

w1 = theano.shared(np.random.uniform(0,1,(3,3))) 
w2 = theano.shared(np.random.uniform(0,1,(3,1))) 

Mit dieser Kostenfunktion:

cost = -(a_hat*T.log(a2.T) + (1-a_hat)*T.log(1-a2.T)).sum() 

diese Weise können wir a1 der Form (4,3) (die gleiche wie der 1. Schicht-Eingang) und a2 (4,1) als die erwarteten Ausgabe zu erhalten.

x * w1 = (4,3) * (3,3) = (4,3) = a1.shape

a1 * w2 = (4,3) * (3,1) = (4,1) = a2.shape

Sie auch diese Zeile hinzufügen:

from random import random 

Es wird Ihnen mit 30000 Iterationen:

The outputs of the NN are: 
The output for x1=0 | x2=0 is 0.0001 
The output for x1=0 | x2=1 is 0.0029 
The output for x1=1 | x2=0 is 0.0031 
The output for x1=1 | x2=1 is 0.9932 
+0

Dank fo Ihre Antwort. Ich habe ein "outlace" -Tutorial durchlaufen. Ich fand [dieses] (https://www.analyticsvidhya.com/blog/2016/04/neural-networks-python-theano/) eine Menge hilfreich für das Verständnis von theano. Ich weiß, dass "dim fishmatch" -Problem da ist, aber "welche Zeile im Code das Problem verursacht" wird hilfreich sein. – chandresh

+0

Ich werde versuchen, morgen daran zu arbeiten, wenn ich Zeit habe und ich werde mit einer Antwort auf Sie zurückkommen, hoffentlich – Axel

+0

Danke axel. Hier ist, was ich getan habe, um diesen Fehler loszuwerden. Ich habe 'z2 = T.dot (a1, w2.T)' in 'z2 = T.dot (w2, a1.T)' geändert. Es funktionierte. Ich weiß nicht, wie es das "Dimensions-Mismatch" -Problem unter Berücksichtigung der Matrix-Vektor-Multiplikation löst. – chandresh