我一直在使用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
提供数据:一切正常。
从那以后我一直只使用一种型号。我的输入总是place_holders,我只输入训练或验证数据。
最近,我注意到在使用tf.layers.dropout
和tf.layers.batch_normalization
的模型上出现了一些奇怪的行为。这两个函数都有一个'training'参数,我用tf.bool
占位符。我已经看到tf.layers通常使用tf.estimator.Estimator
,但我没有使用它。我已经阅读了Estimators代码,它似乎创建了两个不同的图表用于培训和验证。可能是因为没有两个单独的模型而产生这些问题,但我仍然持怀疑态度。
有没有明显的理由我没有看到这意味着必须使用两个独立的等效模型?
答案 0 :(得分:3)
你没有 使用两个神经网络进行训练和验证。毕竟,正如您所注意到的,tensorflow通过允许某些图层的training
参数作为占位符来帮助您进行单一的训练和验证网络。
然而,为什么你不呢?通过为培训和验证提供单独的网络,您可以为自己设定正确的路径,并为您的代码提供面向未来的服务。您的培训和验证网络今天可能完全相同,但您稍后可能会看到使用不同网络的一些好处,例如具有不同的输入,不同的输出,删除中间层等等。
此外,由于变量是在它们之间共享的,因此使用不同的训练和验证网几乎不会受到惩罚。
所以,保持一个网是好的;根据我的经验,除了有趣的实验之外的任何项目都可能在某些时候实现一个独特的验证网络,而tensorflow可以很容易地以最小的惩罚来做到这一点。
答案 1 :(得分:1)
tf.estimator.Estimator
类确实为每次调用创建了一个新图形,这已成为激烈辩论的主题,请参阅this issue on GitHub。他们的方法是在每个train
,evaluate
和predict
调用中从头开始构建图形,并从最后一个检查点恢复模型。这种方法有明显的缺点,例如:
train
和evaluate
的循环将在每次迭代时创建两个新图。train_and_evaluate
,但这看起来不太好。)我倾向于同意为所有操作使用相同的图形和模型很方便,我通常会使用此解决方案。但在很多情况下,使用像tf.estimator.Estimator
这样的高级API时,您不能直接处理图形和变量,因此您不应该关心模型的组织结构。< / p>