2016-06-20 19 views
7

Fondamentalmente voglio avere l'opzione di alimentare l'input al centro del grafico e calcolare l'uscita andando da lì. Un'idea che ho avuto è quella di utilizzare tf.placeholder_with_default che per impostazione predefinita è un tensore a zero. Quindi potrei mescolare gli input opzionali usando l'addizione, tuttavia l'aggiunta su una grande forma sembra essere un calcolo non necessario. Ci sono modi migliori per farlo?Come posso aggiungere un input opzionale a un grafico in TensorFlow?

input_enabled = tf.placeholder_with_default(tf.constant(1.), [1]) 

input_shape = [None, in_size] 
input = tf.placeholder_with_default(tf.zeros(input_shape), input_shape) 
// ... 
bottleneck_shape = [None, bottleneck_size] 
bottleneck = input_enabled * f(prev_layer) + tf.placeholder_with_default(tf.zeros(bottleneck_shape), bottleneck_shape) 
// ... 

// Using graph with input at first layer: 
sess.run([output], feed_dict={input: x}) 

// Using graph with input at bottleneck layer: 
sess.run([output], feed_dict={bottleneck: b, input_enabled: 0.}) 
+0

Puoi fornire una panoramica più specifica del tuo problema? Che tipo di input opzionale vuoi e cosa fare? –

+0

A avere un grafico simile a un autoencoder e voglio ricostruire un codice come input per il collo di bottiglia con lo stesso grafico che utilizzo per l'allenamento. –

+0

Puoi dare la parte del codice che hai ora con 'tf.placeholder_with_default' che vuoi cambiare? –

risposta

10

Ho capito meglio grazie al tuo codice.

In sostanza lo schema è:

 input  <- you can feed here 
     |   
    (encoder) 
     | 
    bottleneck <- you can also feed here instead 
     | 
    (decoder) 
     | 
     output 

si desidera che due casi di utilizzo:

  1. treno: alimentare un'immagine in input, calcolare l'uscita
  2. prova : inserire un codice nel collo di bottiglia, calcolare l'output

Non è necessario creare un segnaposto per bottleneck, perché sess.run() consente di inserire i valori di non segnaposto nel grafico:

input_shape = [None, in_size] 
input = tf.placeholder(tf.float32, input_shape) 
# ... 

bottleneck = f(prev_layer) # of shape [None, bottleneck_size] 
# ... 

# Using graph with input at first layer: 
sess.run([output], feed_dict={input: x}) 

# Using graph with input at bottleneck layer: 
sess.run([output], feed_dict={bottleneck: b}) 

Dalla documentazione di sess.run():

L'argomento feed_destinazione facoltativo consente al chiamante di ignorare il valore dei tensori nel grafico. Ciascuna chiave in feed_dict può essere uno dei seguenti tipi:

Se la chiave è un tensore, il valore può essere uno scalare Python, una stringa, un elenco o un ndarray numerico che può essere convertito nello stesso tipo di tensore di quel tensore. Inoltre, se la chiave è un segnaposto, la forma del valore verrà verificata per verificarne la compatibilità con il segnaposto.