【发布时间】:2018-02-25 18:26:11
【问题描述】:
我正在构建一个 TensorFlow Estimator,我想使用 tf.estimator.train_and_evaluate() 函数对其进行训练和评估。该函数的doc 给出以下建议:
还建议在执行评估之前对模型进行更长时间的训练,比如多个 epoch,因为每次训练的输入管道都是从头开始的。
这是有道理的,因为train_and_evaluate() 通过交替调用estimator.train() 和estimator.evaluate() 工作,为每个新调用拆除计算图。就我而言,这是一个问题,因为我想相对频繁地评估模型,而我的input_fn 似乎在设置上有很多开销。它目前看起来像这样:
def input_fn():
# Build dataset from generator
dataset = tf.data.Dataset.from_generator(
generator=instance_generator,
output_types=types,
output_shapes=shapes,
)
dataset = dataset.shuffle(buffer_size=dataset_size)
dataset = dataset.repeat(epochs_per_eval)
dataset = dataset.batch(batch_size)
dataset = dataset.prefetch(1)
return dataset
我怀疑这个函数的很多时间成本来自于洗牌,因为它需要首先生成整个数据集。改组可能并不慢,但我的instance_generator 是。理想情况下,我想找到一种方法来避免必须从生成器为每个 train/eval 调用重建数据集。有什么方法可以使用 Dataset 类实现这一点?有没有办法在数据集生成后缓存它的状态,以便在第一次调用之后对input_fn 的每次新调用都变得更便宜?
【问题讨论】:
-
您不应该在 input_fn 之外缓存任何与 tensorflow 相关的内容,因为 Estimator 每次都会创建一个新图。您是构建 input_fn(不太可能)还是执行它的瓶颈?另外,为什么在评估期间洗牌?
-
我知道 Estimator 每次都会创建一个新图表。我希望您可以在估算器之外维护一个单独的图形,您可以在构建估算器的图形时插入该图形。瓶颈是返回第一批数据;之后它工作正常。我也没有在评估期间洗牌。问题是每个 eval 都会触发 training 输入管道的重建,该管道已经并且应该被改组。
-
听起来您仍然想缓存一个值而不是图形。我认为现在不支持此功能。
标签: python performance tensorflow tensorflow-datasets tensorflow-estimator