2016-03-23 3 views
4

Angenommen, ich habe ein typisches CNN-Modell in TensorFlow.TensorFlow: Netzwerk mit einem anderen Eingangstensor neu starten?

images = input() 
logits = inference(images) 
output = sess.run([logits]) 

nehmen jetzt Nun meine input Funktion ein Paar von Argumenten zurückzugibt, left_images und right_images (Stereokamera):

def inference(images): 
    # images: 4D tensor of [batch_size, IMAGE_SIZE, IMAGE_SIZE, 3] size. 
    conv_1 = conv_layer(images, 64, 7, 2) 
    pool_2 = pooling_layer(conv_1, 2, 2) 
    conv_3 = conv_layer(pool_2, 192, 3, 1) 
    pool_4 = pooling_layer(conv_3, 2, 2) 
    ... 
    conv_28 = conv_layer(conv_27, 1024, 3, 1) 
    fc_29 = fc_layer(conv_28, 512) 
    fc_30 = fc_layer(fc_29, 4096) 
    return fc_30 

Ein typischer Vorwärtspass wie dies getan werden könnte. Ich möchte right_images bis conv_28 und left_images bis fc_30 laufen lassen. So etwas wie diese

images = tf.placeholder(tf.float32, [batch_size, IMAGE_SIZE, IMAGE_SIZE, 3]) 
left_images, right_images = input() 
conv_28, fc_30 = inference(images) 
right_images_val = sess.run([conv_28], feed_dict={images: right_images}) 
left_images_val = sess.run([fc_30], feed_dict={images: left_images}) 

Dies ist jedoch nicht mit

TypeError: The value of a feed cannot be a tf.Tensor object. Acceptable feed values include Python scalars, strings, lists, or numpy ndarrays.

Ich will, um zu vermeiden inputs zu bewerten, um sie dann wieder zu TensorFlow zu füttern. Der Aufruf von inference zweimal mit verschiedenen Argumenten funktioniert auch nicht, weil Funktionen wie conv_layer Variablen erstellen.

Kann das Netzwerk mit einem anderen Eingangstensor erneut gestartet werden?

+0

Ich bin nicht sicher, wie die "Bilder" erklärt wird. Es ist ein Platzhalter? Wenn nicht, sollte es. – RaduK

Antwort

2

Tensorflow shared Variables ist was Sie suchen. Ersetzen Sie alle Anrufe von tf.Variable durch tf.get_variable() in Inferenz. Dann können Sie ausführen:

images_left, images_right = input() 
with tf.variable_scope("logits") as scope: 
    logits_left = inference(images_left) 
    scope.reuse_variables() 
    logits_right = inference(images_right) 
output = sess.run([logits_left, logits_right]) 

Variablen werden nicht erneut im zweiten Aufruf der Inferenz erstellt. Linke und rechte Bilder werden mit den gleichen Gewichten verarbeitet. Überprüfen Sie auch meine Tensorflow CNN training toolkit (Look training code). Ich benutze diese Technik, um Validierungen und Trainings vorwärts im selben TensorFlow Graphen durchzuführen.

+1

FYI dein 'train.py' Link ist kaputt. – dimo414

+0

Danke! Ich habe es repariert. – MarvMind

+1

Enthält aufgrund von Änderungen keine relevanten Inhalte mehr. Protip: Schließen Sie immer die [commit SHA] (https://github.com/TensorVision/TensorVision/blob/25b2f634550d12987f247ac1d0c5db6824bb8c81/bin/tv-train) in GitHub-Links ein – oseiskar