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