3

我已经使用 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 或 Queues。而且我不知道为什么要使用两个独立的模型。我尝试只构建一个并使用feed_dict: 提供数据,一切正常。

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

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

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

4

2 回答 2

6

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

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

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

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

于 2018-03-07T16:03:14.377 回答
2

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

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

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

于 2018-03-07T16:29:10.753 回答