摘要: 使用新的tf.contrib.data.Dataset功能会使我的图形protobuf文件大小翻倍,且我无法在Tensorboard中可视化该图形。
详细信息:
我正在尝试使用新的TensorFlow tf.contrib.data.Dataset
功能与tf.contrib.learn.Experiment
框架。我的输入数据被定义为输入函数,返回特征和标签张量。
如果我使用tf.train.slice_input_producer
函数创建输入函数,则生成的graph.pbtxt
文件大小为620兆字节,.meta
文件大小约为165兆字节(完整代码在此处)。
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
来创建输入函数,就像下面的代码块中一样(完整代码在此处),那么我的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需要很长时间来解析此文件,我无法通过可视化方式调试我的模型图形。我在数据集文档中发现,大小增加的原因是:"数组的内容将被多次复制",解决方案是使用占位符。然而,在这种情况下,我需要使用活动会话将numpy数组馈送到占位符以初始化迭代器:sess.run(iterator.initializer, feed_dict={features_placeholder: features, labels_placeholder: labels})
然而,使用tf.contrib.learn.Experiment
框架时,这似乎超出了我的控制范围。
我应该如何使用Experiment框架初始化迭代器的初始值?或者找到一个使用Dataset API而不增加图形大小的解决方法?