2017-08-07 2 views
2

Zusammenfassung: Die Verwendung der neuen tf.contrib.data.Dataset verdoppelt die Größe meiner Graph protobuff Datei und ich kann das Diagramm in Tensorboard nicht visualisieren.Tensorflow Dataset API verdoppelt Graph protobuff filesize

Die Details:

Ich versuche, die neue TensorFlow tf.contrib.data.Dataset Funktionalität zusammen mit dem tf.contrib.learn.Experiment Rahmen aus. Meine Eingabedaten sind definiert als input functions, die Tensoren von Features und Labels zurückgeben.

Wenn ich meine Eingabefunktion mit der tf.train.slice_input_producer Funktion wie im folgenden Codeblock (vollständigen Code here) erstellen, dann mein resultierenden graph.pbtxt Datei ist 620M und die .meta Dateien sind um 165M in der Größe.

def train_inputs(): 
    with tf.name_scope('Training_data'): 
     x = tf.constant(mnist.train.images.reshape([-1, 28, 28, 1])) 
     y = tf.constant(mnist.train.labels) 
     sliced_input = tf.train.slice_input_producer(
      tensor_list=[x, y], shuffle=True) 
     return tf.train.shuffle_batch(
      sliced_input, batch_size=batch_size, 
      capacity=10000, min_after_dequeue=batch_size*10) 

Nun, wenn ich meine Eingangsfunktion mit dem neuen tf.contrib.data.Dataset.from_tensor_slices wie im folgenden Codeblock (vollständige Code here) erstellen, dann meine resultierende graph.pbtxt Datei verdoppelt sich auf 1.3G und die .meta Dateien doppelt so groß wie 330M. Jetzt

def train_inputs(): 
    with tf.name_scope('Training_data'): 
     images = mnist.train.images.reshape([-1, 28, 28, 1]) 
     labels = mnist.train.labels 
     dataset = tf.contrib.data.Dataset.from_tensor_slices(
      (images, labels)) 
     dataset = dataset.repeat(None) # Infinite 
     dataset = dataset.shuffle(buffer_size=10000) 
     dataset = dataset.batch(batch_size) 
     iterator = dataset.make_one_shot_iterator() 
     next_example, next_label = iterator.get_next() 
     return next_example, next_label 

weil die graph.pbtxt Datei ist so groß TensorBoard Alter nimmt diese Datei zu analysieren, und ich bin nicht in der Lage meines Modell Diagramm visuell zu debuggen. Ich fand in der Dataset documentation, dass diese Größenzunahme kommt aus: "der Inhalt des Arrays wird mehrmals kopiert werden" und die solution wäre, Platzhalter zu verwenden. Doch in diesem Fall würde ich brauche in dem numpy Arrays in die Platzhalter mit einer aktiven Sitzung füttern den Iterator zu initialisieren:

sess.run(iterator.initializer, feed_dict={features_placeholder: features, labels_placeholder: labels}) 

Dies scheint jedoch aus meiner Kontrolle zu sein, wenn die tf.contrib.learn.Experiment Framework .

Wie kann ich den Initialisierer des Iterators mit dem Experiment-Framework initialisieren? Oder finden Sie eine Problemumgehung für die Verwendung der Dataset-API, ohne meine Diagrammgröße zu erhöhen?

Antwort

2

Ich fand eine Lösung für mein Problem mit tf.train.SessionRunHook. Ich erstelle ein SessionRunHook Objekt, das den Iterator initialisiert, nachdem die Sitzung erstellt wird:

class IteratorInitializerHook(tf.train.SessionRunHook): 
    def __init__(self): 
     super(IteratorInitializerHook, self).__init__() 
     self.iterator_initiliser_func = None 

    def after_create_session(self, session, coord): 
     self.iterator_initiliser_func(session) 

Die initializer Funktion gesetzt wird, wenn der Datensatz Iterator zu erstellen:

iterator_initiliser_hook.iterator_initiliser_func = \ 
    lambda sess: sess.run(
     iterator.initializer, 
     feed_dict={images_placeholder: images, 
        labels_placeholder: labels}) 

Und ich gehe in den Haken Objekte train_monitors und eval_hooks Parameter von tf.contrib.learn.Experiment.

Die resultierende graph.pbtxt Datei ist jetzt nur 500K, während die .meta Dateien nur 244K sind.

Full example here.

+0

Schön. löst auch mein Problem. aber scheint wie ein Workaround? Mein Beitrag: https://stackoverflow.com/questions/46207211/tensorflow-dataset-api-causes-graph-size-to-explode –

Verwandte Themen