Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 受监控的培训课程如何运作?_Python_Tensorflow - Fatal编程技术网

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.