gpt4 book ai didi

tensorflow - 无法使用估算器+数据集,并且训练时间少于一个纪元

转载 作者:行者123 更新时间:2023-12-04 04:36:52 25 4
gpt4 key购买 nike

TensorFlow 1.4将TF数据集移至核心(tf.data.Dataset),而文档/教程建议使用tf.estimator来训练模型。

但是,按照this page末尾的建议,必须在input_fn函数内部实例化Dataset对象及其迭代器。这意味着对于estimator.train(input_fn, steps)的每次调用都将重新遍历数据集。因此,调用的步骤<时期内的样本数,将导致在数据集的子集上训练模型。

因此,我的问题。是否可以使用Estimator + Dataset来实现这样的事情:

for i in range(num_epochs):
# Train for some steps
estimator.train(input_fn=train_input_fn, steps=valid_freq)

validation_iterator.
# Evaluate on the validation set (steps=None, we evaluate on the full validation set)
estimator.evaluate(input_fn=valid_input_fn)

无需在每次调用 estimator.train(input_fn=train_input_fn, steps=valid_freq)时从头开始训练样本迭代?

例如,与 here不同,在 input_fn之外实例化数据集及其迭代器?我尝试了一下,但是它不起作用,因为输入(来自数据集迭代器)和模型(来自估算器 model_fn)不是同一张图的一部分。

谢谢

相关 GitHub issue

最佳答案

我不知道有什么方法可以使整个estimator.train()的训练保持一致。

但是,您可以做的是确保构建train_input_fn,使其足够随机以获得相同的效果。

例如,假设您有一个值[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]的数据集,并且每次调用estimator.train时只能训练一半的数据集。
如果您的洗牌不够好,您将继续训练[0, 1, 2, 3, 4]值:

train_size = 10
dataset = tf.data.Dataset.range(train_size)
x = dataset.make_one_shot_iterator().get_next()

sess = tf.Session()
for i in range(train_size // 2):
print(sess.run(x))

但是,如果使用至少与数据集一样大的 tf.data.Dataset.shuffle()调用 buffer_size ,则将获得随机值。多次调用 estimator.train等同于多次调用一次。

train_size = 10
dataset = tf.data.Dataset.range(train_size)
dataset = dataset.shuffle(buffer_size=train_size)
x = dataset.make_one_shot_iterator().get_next()

sess = tf.Session()
for i in range(train_size // 2):
print(sess.run(x))

我写了另一个答案来解释 buffer_size here的重要性。

关于tensorflow - 无法使用估算器+数据集,并且训练时间少于一个纪元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47153813/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com