Tensorflow Dataset API duplica el tamaño del archivo del protobuff del gráfico

Resumen : el uso del nuevo archivo tf.contrib.data.Dataset duplica el tamaño de mi archivo gráfico protobuff y no puedo visualizar el gráfico en Tensorboard.

Los detalles:

Estoy probando la nueva funcionalidad TensorFlow tf.contrib.data.Dataset junto con el marco tf.contrib.learn.Experiment . Mis datos de entrada se definen como funciones de entrada que devuelven tensores de características y tags.

Si creo mi función de entrada con la función tf.train.slice_input_producer como en el siguiente bloque de código (código completo aquí ), entonces mi archivo graph.pbtxt resultante es 620M y los archivos .meta tienen un tamaño de aproximadamente 165M.

 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) 

Ahora si creo mi función de entrada con el nuevo tf.contrib.data.Dataset.from_tensor_slices como en el siguiente bloque de código (código completo aquí ), entonces mi archivo graph.pbtxt resultante se duplica en tamaño a 1.3G y los archivos .meta duplican en tamaño hasta 330M.

 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 

Ahora, debido a que el archivo graph.pbtxt es tan grande, TensorBoard tarda años en analizar este archivo, y no puedo depurar visualmente el gráfico de mi modelo. Encontré en la documentación del Conjunto de datos de la que proviene este aumento en el tamaño: “el contenido de la matriz se copiará varias veces” y la solución sería utilizar marcadores de posición. Sin embargo, en este caso, necesitaría introducir los arrays numpy en los marcadores de posición con una sesión activa para inicializar el iterador:

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

Sin embargo, parece que esto está fuera de mi control al utilizar el marco tf.contrib.learn.Experiment .

¿Cómo puedo inicializar el inicializador del iterador con el marco de Experimento? ¿O encuentra una solución alternativa para usar la API de conjunto de datos sin boost el tamaño de mi gráfico?

Encontré una solución a mi problema usando tf.train.SessionRunHook . Creo un objeto SessionRunHook que inicializa el iterador después de crear la sesión:

 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) 

La función de inicialización se establece al crear el iterador de conjunto de datos:

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

Y paso los objetos hook a los parámetros train_monitors y eval_hooks de tf.contrib.learn.Experiment .

El archivo graph.pbtxt resultante ahora solo tiene 500K, mientras que los archivos .meta solo tienen 244K.

Ejemplo completo aquí.