2016-01-20 43 views
14

io sono un principiante totale a tensorflow, e sto cercando di moltiplicare due matrici insieme, ma io continuo a ricevere un'eccezione che dice:eccezione tensorflow con matmul

ValueError: Shapes TensorShape ([Dimension (2) ]) e TensorShape ([Dimension (Nessuno), Dimensione (None)]) deve avere lo stesso valore

Ecco il codice esempio minimo:

data = np.array([0.1, 0.2]) 
x = tf.placeholder("float", shape=[2]) 
T1 = tf.Variable(tf.ones([2,2])) 
l1 = tf.matmul(T1, x) 
init = tf.initialize_all_variables() 

with tf.Session() as sess: 
    sess.run(init) 
    sess.run(feed_dict={x: data} 

Confusamente, il seguente codice molto simile funziona bene:

data = np.array([0.1, 0.2]) 
x = tf.placeholder("float", shape=[2]) 
T1 = tf.Variable(tf.ones([2,2])) 
init = tf.initialize_all_variables() 

with tf.Session() as sess: 
    sess.run(init) 
    sess.run(T1*x, feed_dict={x: data} 

Qualcuno può indicare qual è il problema? Devo mancare qualcosa ovvia ..

risposta

15

Il tf.matmul() op richiede che entrambi i suoi ingressi sono matrici (cioè tensori 2-D) *, e non esegue alcuna conversione automatica. La variabile T1 è una matrice, ma il segnaposto x è un vettore lunghezza-2 (ad esempio un tensore 1-D), che è la fonte dell'errore.

Al contrario, l'operatore * (uno pseudonimo per tf.multiply()) è una moltiplicazione dell'elemento di trasmissione. Converte l'argomento vettoriale in una matrice seguendo NumPy broadcasting rules.

Per rendere il vostro lavoro di matrice moltiplicazione, è possibile richiedere che x è una matrice:

data = np.array([[0.1], [0.2]]) 
x = tf.placeholder(tf.float32, shape=[2, 1]) 
T1 = tf.Variable(tf.ones([2, 2])) 
l1 = tf.matmul(T1, x) 
init = tf.initialize_all_variables() 

with tf.Session() as sess: 
    sess.run(init) 
    sess.run(l1, feed_dict={x: data}) 

... Oppure si potrebbe usare il tf.expand_dims() op per convertire il vettore ad una matrice:

data = np.array([0.1, 0.2]) 
x = tf.placeholder(tf.float32, shape=[2]) 
T1 = tf.Variable(tf.ones([2, 2])) 
l1 = tf.matmul(T1, tf.expand_dims(x, 1)) 
init = tf.initialize_all_variables() 

with tf.Session() as sess: 
    # ... 

* Questo era vero quando ho inviato la risposta all'inizio, ma ora tf.matmul() supporta anche moltiplicazioni di matrice batch. Ciò richiede che entrambi gli argomenti abbiano almeno 2 dimensioni. Vedi the documentation per maggiori dettagli.

+0

Grazie, perfetto! Quel messaggio di errore era piuttosto criptico. – homesalad

+1

Questo è un buon punto! Invierò una patch per migliorarla nella prossima versione. – mrry

+2

Grazie - quindi è possibile moltiplicare un vettore con una matrice per ottenere un vettore (non una matrice)? O devo seguire questa risposta e quindi rimodellare? –