【问题标题】:Why should I build separated graph for training and validation in tensorflow?为什么要在 tensorflow 中为训练和验证构建分离图?
【发布时间】:2018-08-15 17:59:18
【问题描述】:

我已经使用 tensorflow 有一段时间了。起初我有这样的东西:

def myModel(training):
    with tf.scope_variables('model', reuse=not training):
        do model
        return model

training_model = myModel(True)
validation_model = myModel(False)

主要是因为我从一些强迫我这样做的 MOOC 开始。但他们也没有使用 TFRecords 或队列。而且我不知道为什么要使用两个独立的模型。我尝试只构建一个并使用feed_dict 提供数据:一切正常。

自从我通常只使用一种模型以来。我的输入总是占位符,我只输入训练或验证数据。

最近,我注意到使用 tf.layers.dropouttf.layers.batch_normalization 的模型有一些奇怪的行为。这两个函数都有一个“培训”参数,我将其与tf.bool 占位符一起使用。我见过 tf.layers 通常与 tf.estimator.Estimator 一起使用,但我没有使用它。我已经阅读了 Estimators 代码,它似乎为训练和验证创建了两个不同的图表。可能是这些问题是由于没有两个独立的模型引起的,但我仍然持怀疑态度。

是否有一个我没有看到的明确原因意味着必须使用两个独立的等效模型?

【问题讨论】:

    标签: python tensorflow machine-learning cross-validation tensorflow-estimator


    【解决方案1】:

    您没有必须使用两个神经网络进行训练和验证。毕竟,正如您所注意到的,tensorflow 通过允许某些层的 training 参数作为占位符来帮助您拥有一个单一的训练和验证网络。

    但是,你为什么不呢?通过使用单独的网络进行训练和验证,您可以让自己走上正确的道路,并让您的代码适应未来。您的训练和验证网络今天可能是相同的,但您稍后可能会看到拥有不同网络的一些好处,例如具有不同的输入、不同的输出、去除中间层等。

    此外,由于变量在它们之间共享,因此拥有不同的训练和验证网络几乎不会造成任何损失。

    所以,保持一张网就可以了;不过,根据我的经验,除了有趣的实验之外,任何项目都可能在某个时候实现一个独特的验证网络,而 TensorFlow 可以很容易地做到这一点,而且代价最小。

    【讨论】:

    • 输入和输出可以很容易地更改,而无需建立新的网络。移除中间层并不容易,但到目前为止,我想要移除的每个中间层在 tensorflow 中都有一个版本,您可以分配训练参数。对我来说,问题不是 RAM 损失,而是清晰度损失。我只是不觉得增加的功能值得复杂性(到目前为止)。
    • 是的,尤其是使用新的Dataset 输入框架——以前的基于队列的框架使用起来不太容易。尽管如此,通过将训练和验证网络分开,我避免了担心潜在的问题,例如使用验证数据或其他任何东西污染训练 EMA——我发现这种舒适来自简单地处理两个网络而不是一个网络是便宜的,而且易于管理。但是,是的,这主要是基于意见的。
    • 我不得不承认,在确定训练参数功能之前,我曾多次检查过批标准化和 dropout。我只是不太信任 tensorflow,每当出现问题时,我倾向于认为首先是他们的错。
    【解决方案2】:

    tf.estimator.Estimator 类确实为每个调用创建了一个新图,这一直是激烈辩论的主题,请参阅this issue on GitHub。他们的方法是在每个trainevaluatepredict 调用上从头开始构建图,并从最后一个检查点恢复模型。这种方法有明显的缺点,例如:

    • 调用trainevaluate 的循环将在每次迭代时创建两个新图。
    • 在训练时无法轻松评估(尽管有解决方法,train_and_evaluate,但这看起来不太好)。

    我倾向于同意为所有操作使用相同的图形和模型很方便,我通常采用这种解决方案。但在很多情况下,当使用像 tf.estimator.Estimator 这样的高级 API 时,您不会直接处理图形和变量,因此您不必关心模型的组织方式。

    【讨论】:

    • 我提到 tf.estimator.Estimator 只是说我认为 tensorflow 开发人员希望你这样做。我不使用它,因为我没有从中找到任何优势。此外,构建图表和恢复模型似乎是一项巨大的开销。您知道这是在 RAM 中完成,还是在每次迭代时它们实际上都进入 HD?
    • @AndrésMarafioti 检查点存储在磁盘上(您可以轻松找到它们),这使得这个生命周期相当低效,但不是那么关键:每次迭代仍然需要几秒钟到几分钟,而不是额外的几毫秒意义重大。
    • 我确实使用检查点来继续训练。如果只是几毫秒而不是“巨大的开销”,这是一个有趣的想法改变,会想到它。你知道任何评估这种开销的研究吗?
    • @AndrésMarafioti 这里没有什么可研究的,这完全取决于硬件和一般 I/O 吞吐量。任务是将模型从内存转储到磁盘(SSD 或 HDD),现在现代 SSD 在几毫秒内执行写入操作。
    猜你喜欢
    • 2016-12-31
    • 2020-02-12
    • 2019-03-18
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    相关资源
    最近更新 更多