9

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

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

因此我的问题。是否可以使用 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)

例如,与此处不同,在外部实例化 Dataset 及其迭代器input_fn?我试过了,但它不起作用,因为输入(来自数据集迭代器)和模型(来自估计器model_fn)不是同一个图表的一部分。

谢谢

相关的 GitHub 问题

4

2 回答 2

1

我不知道有什么方法可以使训练在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至少与数据集一样大的数据集进行调用,您将获得随机值。用 this调用多次estimator.train将相当于用多个 epoch 调用一次。

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 我写了另一个答案来解释这里的重要性。

于 2018-01-13T17:04:54.873 回答
0

dataset你可以从你的 input_fn返回一个。就像是:

def input_fn():
  dataset = ...
  return dataset

要在不停止训练过程的情况下运行评估,您可以使用tf.contrib.estimator.InMemoryEvaluatorHook

于 2018-08-28T20:55:09.687 回答