Python 受监控的培训课程如何运作?
我试图理解使用Python 受监控的培训课程如何运作?,python,tensorflow,Python,Tensorflow,我试图理解使用tf.Session和tf.train.MonitoredTrainingSession之间的区别,以及我可能更喜欢其中一个而不是另一个。当我使用后者时,似乎可以避免许多“杂务”,例如初始化变量、启动队列运行程序或为摘要操作设置文件编写器。另一方面,对于受监控的培训会话,我无法明确指定要使用的计算图。这一切对我来说似乎都很神秘。这些类是如何创建的,我还不了解它们背后的一些基本原理吗?我无法对这些类是如何创建的给出一些见解,但我认为以下几点与如何使用它们相关 tf.Session是p
tf.Session
和tf.train.MonitoredTrainingSession
之间的区别,以及我可能更喜欢其中一个而不是另一个。当我使用后者时,似乎可以避免许多“杂务”,例如初始化变量、启动队列运行程序或为摘要操作设置文件编写器。另一方面,对于受监控的培训会话,我无法明确指定要使用的计算图。这一切对我来说似乎都很神秘。这些类是如何创建的,我还不了解它们背后的一些基本原理吗?我无法对这些类是如何创建的给出一些见解,但我认为以下几点与如何使用它们相关
tf.Session
是python TensorFlow API中的低级对象,
正如您所说的,tf.train.MonitoredTrainingSession
具有许多方便的特性,在大多数常见情况下尤其有用
在描述tf.train.MonitoredTrainingSession
的一些好处之前,让我先回答一下关于该会话使用的图形的问题。您可以通过在图形中使用上下文管理器,指定MonitoredTrainingSession
使用的tf.Graph
。默认值为()
因此,正如您所说,使用MonitoredTrainingSession
的好处在于,这个对象负责
- 初始化变量
- 启动队列运行程序以及
- 设置文件编写器
但它还有一个好处,就是使代码易于分发,因为它的工作方式也有所不同,这取决于您是否将正在运行的进程指定为主进程
例如,您可以运行以下操作:
def run_my_model(train_op, session_args):
with tf.train.MonitoredTrainingSession(**session_args) as sess:
sess.run(train_op)
您将以非分布式方式调用:
run_my_model(train_op, {})`
或以分布式方式(有关输入的更多信息,请参阅):
另一方面,使用原始tf.Session
对象的好处是,您没有tf.train.MonitoredTrainingSession
的额外好处,如果您不打算使用它们,或者想要获得更多的控制权(例如队列的启动方式),这可能会很有用
编辑(根据评论):
对于op初始化,您必须执行以下操作(参见:
对于QueueRunner,我想让您参考,在这里您可以找到更完整的示例
编辑2:
了解tf.train.MonitoredTrainingSession
如何工作的主要概念是\u WrappedSession
类:
此包装器用作各种会话包装器的基类
提供额外功能,如监控、协调、,
和恢复
tf.train.MonitoredTrainingSession
的工作方式如下:
- 它首先检查它是主管还是工人(参见词汇问题)
- 它开始提供的钩子(例如,
StopAtStepHook
将在此阶段检索global\u步骤
tensor)
- 它创建了一个会话,该会话是一个
主管
(或工作者
会话),被包装成\u HookedSession
被包装成\u CoordinatedSession
被包装成\u RecoverableSession
主管
/工人
会话负责运行由脚手架
提供的初始化ops。
chief
会话还负责所有检查点部分:例如,使用Saver
从Scaffold
从检查点恢复
\u HookedSession
基本上是用来修饰run
方法的:它在运行之前调用\u call\u hook
和运行之后调用方法(如果相关)
- 在创建时,
\u CoordinatedSession
构建一个协调器
,该协调器启动队列运行程序并负责关闭它们
\u RecoverableSession
将确保在出现tf.errors.AbortedError
的情况下重试
总之,tf.train.MonitoredTrainingSession
避免了大量锅炉板代码,同时易于通过挂钩机制进行扩展。谢谢-您能给出一些(伪?)吗关于如何使用普通会话替换MonitoredTrainingSession代码的代码?这相当复杂-例如,显然MTS将完成(默认/)图形:谢谢-tf。initialize_all_variables()
已弃用顺便说一句,它们很快就被弃用了。我感兴趣的是“引擎盖下的动作”-应该按照-这里的图形(哪个图形…)来查看代码例如,是最终确定的。所以MTS做了很多事情——正如我在上一个问题中讨论的那样,这可能会导致令人不快的意外。对操作执行的系列进行详细说明会很有趣——不能再进一步了。尽管我添加了一些关于MTS内部工作方式的描述,我希望这会有所帮助。(我还将初始化器修改为tf.global\u variables\u initializer()
。感谢您发现了它。非常感谢,将通过-您可以从版本1.1开始将转到代码链接吗?在github上查看代码时点击y,它将变成特定提交的链接(非常重要,否则链接会断开)我认为尼古拉斯的回答应该涵盖了你——不?
run_my_model(train_op, {})`
run_my_model(train_op, {"master": server.target,
"is_chief": (FLAGS.task_index == 0)})
# Define your graph and your ops
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init_p)
sess.run(your_graph_ops,...)
scaffold: A `Scaffold` used for gathering or building supportive ops. If
not specified a default one is created. It's used to finalize the graph.