【问题标题】:End of Sequence Error when using tf.estimator and tf.data使用 tf.estimator 和 tf.data 时出现序列结束错误
【发布时间】:2018-11-03 23:35:23
【问题描述】:

我正在使用 tf.estimator.train_and_evaluatetf.data.Dataset 将数据提供给估算器:

输入数据函数:

    def data_fn(data_dict, batch_size, mode, num_epochs=10):
        dataset = {}
        if mode == tf.estimator.ModeKeys.TRAIN:
            dataset = tf.data.Dataset.from_tensor_slices(data_dict['train_data'].astype(np.float32))
            dataset = dataset.cache()
            dataset = dataset.shuffle(buffer_size= batch_size * 10).repeat(num_epochs).batch(batch_size)
        else:
            dataset = tf.data.Dataset.from_tensor_slices(data_dict['valid_data'].astype(np.float32))
            dataset = dataset.cache()
            dataset = dataset.batch(batch_size)

        iterator = dataset.make_one_shot_iterator()
        next_element = iterator.get_next()

    return next_element

训练功能:

def train_model(data):
    tf.logging.set_verbosity(tf.logging.INFO)
    config = tf.ConfigProto(allow_soft_placement=True,
                            log_device_placement=False)
    config.gpu_options.allow_growth = True
    run_config = tf.contrib.learn.RunConfig(
        save_checkpoints_steps=10,
        keep_checkpoint_max=10,
        session_config=config
    )

    train_input = lambda: data_fn(data, 100, tf.estimator.ModeKeys.TRAIN, num_epochs=1)
    eval_input = lambda: data_fn(data, 1000, tf.estimator.ModeKeys.EVAL)
    estimator = tf.estimator.Estimator(model_fn=model_fn, params=hps, config=run_config)
    train_spec = tf.estimator.TrainSpec(train_input, max_steps=100)
    eval_spec = tf.estimator.EvalSpec(eval_input,
                                      steps=None,
                                      throttle_secs = 30)

    tf.estimator.train_and_evaluate(estimator, train_spec, eval_spec)

训练进行得很顺利,但在评估时出现此错误:

OutOfRangeError (see above for traceback): End of sequence 

如果我不在评估数据集上使用Dataset.batch(通过在data_fn 中省略dataset[name] = dataset[name].batch(batch_size) 行)我会得到同样的错误,但时间要长得多。

如果我不对数据进行批处理并使用steps=1 进行评估,我只能避免此错误,但这是否会对整个数据集执行评估?

我不明白是什么导致了这个错误,因为文档表明我也应该能够对批次进行评估。

注意:在数据批次上使用tf.estimator.evaluate 时,我遇到了同样的错误。

【问题讨论】:

    标签: tensorflow tensorflow-datasets


    【解决方案1】:

    我将此问题发布为 github 问题,以下是 Tensorflow 团队的回复:

    https://github.com/tensorflow/tensorflow/issues/19541

    为了完整起见,从“xiejw”复制:

    如果我理解正确,这个问题是“一旦给 estimator 一个 input_fn 并在里面包含数据集,评估过程就会出现 OutOfRangeError 错误。”

    Estimator 实际上可以正确处理这个问题。但是,一个已知的常见根本原因是 model_fn 中定义的指标有错误。我们需要先排除这部分。

    @mrezak 如果可能的话,你能展示一下关于 model_fn 的代码吗?或者,如果您有一个最小的可重现脚本,那将非常有帮助。 -- 提前致谢。

    对此的一个常见问题是:tensorflow 中的 metric 应该返回两个 Ops:update_op 和 value_op。 Estimator 为输入源中的每批数据调用 update_op,一旦用尽,它调用 value_op 以获取度量值。这里的 value_op 应该依赖回只读变量。

    许多model_fn将value_op的依赖关系放在输入管道中,因此,estimator.evaluate将因此再次触发输入管道一次,并出现OutOfRangeError错误

    问题确实是我如何在model_fn 中定义eval_metric。在我的实际代码中,我要优化的总损失由多个损失(重建 + L2 + KL)组成,在评估部分,我想获得重建损失(基于验证数据),这取决于输入数据管道。我的实际重建成本比 MSE(其他 tf.metric 函数也没有)更复杂,使用 tf.metric 基本函数实现起来并不简单。

    这是解决问题的“xiejw”的建议:

    my_total_loss =  ... # the loss you care. Pay attention to how you reduce the loss. 
    eval_metric_ops = {'total_loss: tf.metrics.mean(my_total_loss)}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-09
      • 1970-01-01
      • 1970-01-01
      • 2021-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多