2016-06-27 11 views
7

Ho un problema con cui ho avuto difficoltà. È relativo a tf.matmul() e alla sua assenza di trasmissione.Nessuna trasmissione per tf.matmul in TensorFlow

Sono a conoscenza di un problema simile su https://github.com/tensorflow/tensorflow/issues/216, ma tf.batch_matmul() non sembra una soluzione per il mio caso.

Ho bisogno di codificare miei dati di ingresso come un tensore 4D: X = tf.placeholder(tf.float32, shape=(None, None, None, 100)) La prima dimensione è la dimensione di un lotto, secondo il numero di voci nel batch. È possibile immaginare ciascuna voce come una composizione di un numero di oggetti (terza dimensione). Infine, ogni oggetto è descritto da un vettore di 100 valori float.

Nota che ho usato Nessuno per la seconda e la terza dimensione perché le dimensioni effettive potrebbero cambiare in ogni lotto. Tuttavia, per semplicità, diciamo modellare il tensore con numeri reali: X = tf.placeholder(tf.float32, shape=(5, 10, 4, 100))

Questi sono i passi del mio calcolo:

  1. calcolare una funzione di ciascun vettore di 100 valori flottante (ad esempio, funzione lineare) W = tf.Variable(tf.truncated_normal([100, 50], stddev=0.1)) Y = tf.matmul(X, W) problema: nessuna trasmissione per tf.matmul() e nessun successo usando tf.batch_matmul() forma atteso di Y: (5, 10, 4, 50)

  2. applicando pool media per ogni voce del lotto (sugli oggetti di ogni voce): forma Y_avg = tf.reduce_mean(Y, 2) previsto di Y_avg: (5, 10, 50)

ho previsto che tf.matmul() sarebbe ha supportato la trasmissione. Poi ho trovato tf.batch_matmul(), ma ancora sembra non si applica al mio caso (ad esempio, W deve avere almeno 3 dimensioni, non chiaro perché).

BTW, sopra ho usato una semplice funzione lineare (i cui pesi sono memorizzati in W). Ma nel mio modello ho invece una rete profonda. Quindi, il problema più generale che ho è il calcolo automatico di una funzione per ogni fetta di un tensore. Questo è il motivo per cui mi aspettavo che tf.matmul() avrebbe avuto un comportamento di trasmissione (in tal caso, forse tf.batch_matmul() non sarebbe nemmeno necessario).

Attendo con ansia di imparare da voi! Alessio

risposta

5

Si potrebbe raggiungere tale da rimodellare X loro forma [n, d], dove d è la dimensionalità di un unico "istanza" di calcolo (100 nel tuo esempio) e n è il numero di quei casi in dell'oggetto multidimensionale (5*10*4=200 nell'esempio). Dopo il rimodellamento, è possibile utilizzare tf.matmul e quindi ridisegnare nuovamente alla forma desiderata. Il fatto che le prime tre dimensioni possano variare rende la cosa poco complicata, ma è possibile utilizzare tf.shape per determinare le forme reali durante il runtime. Infine, puoi eseguire il secondo passaggio del tuo calcolo, che dovrebbe essere un semplice tf.reduce_mean sulla rispettiva dimensione. Tutto sommato, sarebbe simile a questo:

X = tf.placeholder(tf.float32, shape=(None, None, None, 100)) 
W = tf.Variable(tf.truncated_normal([100, 50], stddev=0.1)) 
X_ = tf.reshape(X, [-1, 100]) 
Y_ = tf.matmul(X_, W) 
X_shape = tf.gather(tf.shape(X), [0,1,2]) # Extract the first three dimensions 
target_shape = tf.concat(0, [X_shape, [50]]) 
Y = tf.reshape(Y_, target_shape) 
Y_avg = tf.reduce_mean(Y, 2) 
+0

Grazie per la risposta.Sfortunatamente, la tua soluzione ha due problemi: 1. media su * tutti * i vettori, che non è corretto 2. la rimodellazione è valida solo nel caso di un tensore a forma fissa, mentre io ho lotti in cui le prime 3 dimensioni variare (fissato in ogni lotto, diverso tra i lotti) –

+0

Perché la media su tutti i vettori? '' X [i, j, k,:] '' costituisce un singolo vettore, giusto? Rimodellando nel modo in cui ho proposto, stiamo impilando questi vettori in una grande matrice (ogni riga contiene uno dei vettori). Se facciamo ora la moltiplicazione della matrice, ogni riga viene moltiplicata separatamente con la matrice. Ora possiamo fare con ogni riga ciò che è desiderato (ad esempio prendendo la media, come nel tuo esempio) e quindi ri-organizzare la forma che vogliamo avere. Non vedo dove stiamo prendendo una media sui vettori, ma potrei mancare qualcosa. – lballes

+0

Per quanto riguarda il secondo problema, a condizione che la dimensionalità dei vettori (100 nel tuo esempio) sia corretta, '' tf.reshape (X, [-1, 100]) '' dovrebbe funzionare bene? Usando il '' -1'', non è necessario ora le altre dimensioni a priori. – lballes

Problemi correlati