2017-12-17 3 views
1

I ein Autoencoder Modell in Tensorflow haben, die als grob geschrieben werden kann (dies ist unrealistisch vereinfachtes Beispiel):Lauf Subgraphen und Einspeisen Zwischenvariablen

x = tf.placeholder(tf.float32, input_shape, name='x') 

# encoder part: 
W = tf.Variable(tf.random_uniform(shape, -1, 1)) 
z = relu(tf.nn.conv2d(x, W, strides=[1, 2, 2, 1], padding='SAME')) 

# decoder part: 
y = relu(tf.nn.conv2d_transpose(z, W, shape_tr, 
     strides=[1, 2, 2, 1], padding='SAME'), b)) 
cost = tf.reduce_sum(tf.square(y - x)) 

So habe ich Eingangs Platzhalter x, Zwischendarstellung z, Gewichtungsmatrix W und Ausgabe y.

Dann trainiere ich mein Modell wie folgt aus:

optimizer = tf.train.AdamOptimizer(learning_rate).minimize(cost) 
sess = tf.Session() 
sess.run(tf.global_variables_initializer()) 
sess.run(optimizer, feed_dict={x: some_train_data}) 

nun einige Testdaten gegeben ich die Ausgabe des Modells überprüfen:

recon = sess.run(y, feed_dict={x: some_test_data}) 

Ich kann auch die Zwischendarstellung für diese Daten erhalten

latent = sess.run(z, feed_dict={x: some_test_data}) 

Was ich will, ist in der Lage, meine Zwischendarstellung zu ändern (z) und die decodierten Ergebnisse y erhalten. Etwas wie folgt aus:

recon = sess.run(y, feed_dict={z: some_fake_z}) 

Natürlich ist es nicht so z Arbeit ist kein Platzhalter, ich habe einen Fehler wie You must feed a value for placeholder tensor 'x'. Wenn ich x zur Verfügung stelle, werden die Ergebnisse überhaupt nicht von z abhängen (was wiederum zu erwarten ist).

Also meine Frage ist: Wie kann ich einen Subgraphen ausführen, die y als Funktion der z und ihn mit meinen eigenen Werten von z berechnet?

Antwort

2

Erstellen Sie einen weiteren Untergraphen mit derselben Variablen.

fake_z = tf.placeholder(z.dtype, z.name) 
fake_y = relu(tf.nn.conv2d_transpose(fake_z, W, shape_tr, 
    strides=[1, 2, 2, 1], padding='SAME'), b)) 

Jetzt können Sie sess.run(fake_y, {fake_z: my_values}). Wenn Sie tf.layers verwenden, sollten Sie auch variable_scope verwenden, um sicherzustellen, dass die Schichtgewichte gleich sind.

Dies ist eine der Einschränkungen von statischen Graphenbibliotheken. Sie müssen alles vorausplanen, was Sie berechnen müssen.

+0

Danke, das funktioniert. Allerdings muss ich noch einige "x" -Werte bereitstellen (die keinen Effekt haben), um die Berechnung durchzuführen. Ist es möglich, es zu vermeiden? –

+0

@ IlyaV.Schurov: Das ist überraschend für mich. Könnten Sie einen vollständigen, aber minimalen Code für mich testen? Codes in Ihrer Frage können nicht ausgeführt werden, da sie viele nicht definierte Namen wie 'input_shape' enthalten. –

+0

Oh, wahrscheinlich, das ist ein Nachteil meiner Architektur - es scheint, dass der Decoderteil einige Informationen über die Form von 'x' benötigt und somit vom entsprechenden Platzhalter abhängt. –