Tensorflow 数据集 API 将图形 protobuff 文件大小加倍
Tensorflow Dataset API doubles graph protobuff filesize
总结:使用新的 tf.contrib.data.Dataset 使我的图形 protobuff 文件的大小加倍,我无法在 Tensorboard 中可视化图形。
详情:
我正在试用新的 TensorFlow tf.contrib.data.Dataset
functionality together with the tf.contrib.learn.Experiment
framework. My input data is defined as input functions,其中 return 个特征和标签张量。
如果我使用 tf.train.slice_input_producer
function like in the following codeblock (full code here) 创建我的输入函数,那么我生成的 graph.pbtxt
文件大小为 620M,.meta
文件大小约为 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)
现在,如果我使用新的 tf.contrib.data.Dataset.from_tensor_slices
like in the following codeblock (full code here) 创建我的输入函数,那么我生成的 graph.pbtxt
文件的大小会加倍至 1.3G,而 .meta
文件的大小会加倍至 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
现在因为 graph.pbtxt
文件太大,TensorBoard 需要很长时间来解析这个文件,我无法直观地调试我的模型图。
我发现在 Dataset documentation that this increase in size comes from: "the contents of the array will be copied multiple times" and the solution 中会使用占位符。但是,在这种情况下,我需要将 numpy 数组输入到具有活动会话的占位符中以初始化迭代器:
sess.run(iterator.initializer, feed_dict={features_placeholder: features, labels_placeholder: labels})
然而,在使用 tf.contrib.learn.Experiment
框架时,这似乎超出了我的控制范围。
如何使用 Experiment 框架初始化迭代器的初始化程序?或者找到一个解决方法来使用数据集 API 而不增加我的图形大小?
我使用 tf.train.SessionRunHook
找到了解决问题的方法。我创建了一个 SessionRunHook
对象,它在创建会话后初始化迭代器:
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)
初始化函数在创建数据集迭代器时设置:
iterator_initiliser_hook.iterator_initiliser_func = \
lambda sess: sess.run(
iterator.initializer,
feed_dict={images_placeholder: images,
labels_placeholder: labels})
然后我将挂钩对象传递给 tf.contrib.learn.Experiment
的 train_monitors
和 eval_hooks
参数。
生成的 graph.pbtxt
文件现在只有 500K,而 .meta
文件只有 244K。
总结:使用新的 tf.contrib.data.Dataset 使我的图形 protobuff 文件的大小加倍,我无法在 Tensorboard 中可视化图形。
详情:
我正在试用新的 TensorFlow tf.contrib.data.Dataset
functionality together with the tf.contrib.learn.Experiment
framework. My input data is defined as input functions,其中 return 个特征和标签张量。
如果我使用 tf.train.slice_input_producer
function like in the following codeblock (full code here) 创建我的输入函数,那么我生成的 graph.pbtxt
文件大小为 620M,.meta
文件大小约为 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)
现在,如果我使用新的 tf.contrib.data.Dataset.from_tensor_slices
like in the following codeblock (full code here) 创建我的输入函数,那么我生成的 graph.pbtxt
文件的大小会加倍至 1.3G,而 .meta
文件的大小会加倍至 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
现在因为 graph.pbtxt
文件太大,TensorBoard 需要很长时间来解析这个文件,我无法直观地调试我的模型图。
我发现在 Dataset documentation that this increase in size comes from: "the contents of the array will be copied multiple times" and the solution 中会使用占位符。但是,在这种情况下,我需要将 numpy 数组输入到具有活动会话的占位符中以初始化迭代器:
sess.run(iterator.initializer, feed_dict={features_placeholder: features, labels_placeholder: labels})
然而,在使用 tf.contrib.learn.Experiment
框架时,这似乎超出了我的控制范围。
如何使用 Experiment 框架初始化迭代器的初始化程序?或者找到一个解决方法来使用数据集 API 而不增加我的图形大小?
我使用 tf.train.SessionRunHook
找到了解决问题的方法。我创建了一个 SessionRunHook
对象,它在创建会话后初始化迭代器:
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)
初始化函数在创建数据集迭代器时设置:
iterator_initiliser_hook.iterator_initiliser_func = \
lambda sess: sess.run(
iterator.initializer,
feed_dict={images_placeholder: images,
labels_placeholder: labels})
然后我将挂钩对象传递给 tf.contrib.learn.Experiment
的 train_monitors
和 eval_hooks
参数。
生成的 graph.pbtxt
文件现在只有 500K,而 .meta
文件只有 244K。