2016-07-05 11 views
1

Wie kann ich dem Tensorboard eine Validierung hinzufügen? Ich habe ein Wrapper für Schichten geschrieben, wie:Validierungszusammenfassung hinzufügen

def convolution(input_data, kernel_shape, strides, activation, name=None): 
    with tf.name_scope(name): 
     kernel = tf.Variable(tf.truncated_normal(kernel_shape, stddev=stddev), name="weights") 
     bias = tf.Variable(tf.zeros([kernel_shape[-1]]), name="biases") 

     conv = tf.nn.conv2d(input=input_data, filter=kernel, strides=strides, padding="SAME", name="convolutions") 
     result = activation(tf.nn.bias_add(conv, bias), name="activations") 

    tf.scalar_summary(name + "/mean", tf.reduce_mean(kernel))  
    return result 

und verwenden summary_op = tf.merge_all_summaries() in main. Auch habe ich train_op und valid_op implementiert, die beide inference Funktion aufrufen. Es erscheint jedoch ein Fehler, dass wir doppelte Tags für scalar_summary haben, d. H. inference wird sowohl in train_op als auch valid_op verwendet, was zu einer Verdopplung von beispielsweise conv1/mean Zusammenfassung führt.

Wie kann ich das schaffen? Ich brauche Zug und Validierung mit der gleichen Funktion inference.

Antwort

2

Wie der Fehler vermuten lässt, können Sie nicht zwei Zusammenfassungen mit demselben Tag erstellen. Dies passiert in Ihrem Fall, weil Sie tf.scalar_summary zweimal mit dem gleichen Tag aufrufen, einmal beim Erstellen des train_op und einmal beim Erstellen des valid_op. Hier ist eine mögliche Lösung: Sie können Ihrer inference-Funktion ein Flag hinzufügen, z. B. is_training, um anzuzeigen, dass der Code aufgerufen wird, um einen Teil eines Trainingsgraphen zu erstellen. Sie müssten dieses Flag an alle Ihre Layer-Funktionen fädeln. In convolution zum Beispiel, sollten Sie Folgendes tun:

if is_training: 
    tf.scalar_summary(name + "/mean", tf.reduce_mean(kernel)) 
return result 

Wenn die train_op Konstruieren Sie passieren is_training=True, und wenn die valid_op Konstruktion, übergeben Sie is_training=False. Es gibt ein Beispiel für ein solches Programmiermuster here im Inception-Modell.

+0

Die Lösung besteht also nur darin, Zusammenfassungen während der Validierung explizit zu vermeiden. Ich dachte über diesen Ansatz nach, hoffte aber, dass es einen klügeren gibt. Wie auch immer, danke für Hilfe! – nmerci

+0

Eine andere Frage ist: Mit diesem Ansatz wird die TEST-Zusammenfassung zur TRAIN-Zusammenfassung hinzugefügt. Ich kann die Testzusammenfassung mit dem Tag "test /" einkapseln und einen separaten summary_writer verwenden. Aber gibt es einen smarten Ansatz, um Zusammenfassungen zu verwalten? – nmerci

0

Eine andere Möglichkeit besteht darin, verschiedene Namensbereiche für Zusammenfassungen zu verwenden und sie dann nach dem Bereichs-Argument von merge_summary anstelle von merge_all_summaries zu filtern.