Tensorflow:带有 Dataset.from_tensor_slices() 的非常大的估计器日志



我一直在研究mnist估计器代码(https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/layers/cnn_mnist.py) 使用此代码训练或 150,000 步后,估算器生成的日志大小为 31M。(每个权重检查点 13M,图形定义 5M)。

在修改代码时,我使用tf.data.Dataset.from_tensor_slices()编写了自己的train_input_fn。 我的代码在这里:

def my_train_input_fn():
mnist = tf.contrib.learn.datasets.load_dataset("mnist")
images = mnist.train.images  # Returns np.array
labels = np.asarray(mnist.train.labels, dtype=np.int32)
dataset = tf.data.Dataset.from_tensor_slices(
({"x": images}, labels))
dataset = dataset.shuffle(50000).repeat().batch(100)
return dataset

而且,我的日志,甚至在训练的一个步骤之前,只有在图初始化之后,大小超过 1,5G!(ckpt-meta 为 165M,每个 events.out.tfevents 和 graph.pbtxt 文件约为 600M)。

经过一番研究,我发现函数 from_tensor_slices() 不适合较大的数据集,因为它在执行图中创建了常量。

请注意,上面的代码片段将嵌入功能和标签TensorFlow 图中的数组作为 tf.constant() 操作。这 适用于小型数据集,但会浪费内存---因为 数组的内容将被多次复制---并且可能会遇到 TF 的 2GB 限制。GraphDef 协议缓冲区。

源: https://www.tensorflow.org/programmers_guide/datasets

但mnist数据集的大小只有1300万左右。那么为什么我的图定义有 600M,而不仅仅是那些额外的 13M 作为常量嵌入?为什么事件文件这么大?

生成代码 (https://github.com/tensorflow/tensorflow/blob/r1.8/tensorflow/python/estimator/inputs/numpy_io.py) 的原始数据集不会生成如此大的日志文件。我想这是因为队列的使用。但是现在队列已被弃用,我们应该使用tf.Dataset而不是队列,对吧?从包含图像的文件(而不是从TFRecord)创建此类数据集的正确方法是什么?我应该使用tf.data.FixedLengthRecordDataset吗?

我有一个类似的问题,我用tf.data.Dataset.from_generator解决了 或 tf.data.Dataset.range,然后是 dataset.map 以获取特定值。

例如,带发电机

def generator():
for sample in zip(*datasets_tuple):
yield sample
dataset = tf.data.Dataset.from_generator(generator,
output_types=output_types, output_shapes=output_shapes)

最新更新