2016-03-07 43 views
6

Ho una dimensione del lotto variabile, così tutti i miei ingressi sono di formatensorflow costante con dimensioni variabili

tf.placeholder(tf.float32, shape=(None, ...) 

accettare i lotti variabili. Tuttavia, come si può creare un valore costante con una dimensione batch variabile? Il problema è con questa linea:

log_probs = tf.constant(0.0, dtype=tf.float32, shape=[None, 1]) 

Mi sta dando un errore:

TypeError: unsupported operand type(s) for *: 'NoneType' and 'int' 

Sono sicuro che è possibile inizializzare un tensore costante con dimensioni del lotto variabili, come potrei farlo ?

Ho anche provato la seguente:

tf.constant(0.0, dtype=tf.float32, shape=[-1, 1]) 

ottengo questo errore:

ValueError: Too many elements provided. Needed at most -1, but received 1 
+1

Non è possibile - "tf.constant" costruisce l'array esplicitamente in modo che sia necessario conoscere le dimensioni. Tuttavia, molte operazioni di tensorflow supportano la trasmissione, quindi forse puoi usarlo invece? http://docs.scipy.org/doc/numpy-1.10.1/user/basics.broadcasting.html –

risposta

13

Un tf.constant() ha fissato dimensioni e valore al tempo di costruzione grafico, quindi probabilmente non è il giusto per la tua applicazione.

Se si sta tentando di creare un tensore con una dimensione dinamica e lo stesso valore (costante) per ogni elemento, è possibile utilizzare tf.fill() e tf.shape() per creare un tensore opportunamente sagomato. Ad esempio, per creare un tensore t che ha la stessa forma input e il valore 0.5 ovunque:

input = tf.placeholder(tf.float32, shape=(None, ...)) 

# `tf.shape(input)` takes the dynamic shape of `input`. 
t = tf.fill(tf.shape(input), 0.5) 

Come Yaroslav mentions in his comment, si può anche essere in grado di utilizzare (NumPy-style) broadcasting per evitare di materializzare un tensore con forma dinamica. Ad esempio, se input ha la forma (None, 32) e t ha la forma (1, 32) quindi il calcolo tf.mul(input, t) trasmetterà t sulla prima dimensione in modo che corrisponda alla forma di input.

+0

Cosa succede se la forma dipende dalla dimensione del lotto? Supponiamo di avere un tensore di input di forma (dimensioni_bassi, altezza, larghezza, num_canali) 'dove dimensione_batch è Nessuno. Voglio creare un tensore di forma '(batch_size)' pieno di valore 'height'. –

+0

È possibile utilizzare lo stesso metodo: 'height_vector = tf.fill (tf.shape (input_tensor) [0: 1], tf.shape (input_tensor) [1])'. – mrry

Problemi correlati