不能使用估算器+数据集并训练不到一个纪元

nis*_*ace 9 tensorflow tensorflow-datasets tensorflow-estimator

TensorFlow 1.4将TF数据集移动到core(tf.data.Dataset),doc/tutorial建议tf.estimator用于训练模型.

但是,正如本页末尾所建议的那样,必须在input_fn函数内实例化数据集对象及其迭代器.这意味着每次调用都将重新开始数据集的迭代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)
Run Code Online (Sandbox Code Playgroud)

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

例如,与此处不同,实例化数据集及其迭代器input_fn?我尝试过,但它不工作,因为那么输入(从数据集迭代器)和模型(从估计model_fn)是不一样的图的一部分.

谢谢

相关的GitHub问题

Oli*_*rot 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))
Run Code Online (Sandbox Code Playgroud)

但是,如果您使用至少与数据集一样大的数据进行调用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))
Run Code Online (Sandbox Code Playgroud)

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


归档时间:

查看次数:

571 次

最近记录:

6 年,8 月 前