监控培训课程如何工作?
python
tensorflow
4
0

我试图了解使用tf.Sessiontf.train.MonitoredTrainingSession之间的区别,并且我可能更喜欢一个。看来,当我使用后者时,我可以避免许多“琐事”,例如初始化变量,启动队列运行器或为摘要操作设置文件编写器。另一方面,在受监控的培训课程中,我无法明确指定要使用的计算图。所有这些对我来说似乎都很神秘。这些类的创建方式背后是否存在一些我不了解的基本哲学?

参考资料:
Stack Overflow
收藏
评论
共 1 个回答
高赞 时间 活跃

我无法提供有关如何创建这些类的一些见解,但是我认为这是与如何使用它们有关的几件事。

tf.Session是python TensorFlow API中的一个低级对象,而正如您所说, tf.train.MonitoredTrainingSession具有许多方便的功能,在大多数常见情况下尤其有用。

在描述tf.train.MonitoredTrainingSession一些好处tf.train.MonitoredTrainingSession ,让我回答有关该会话使用的图的问题。您可以通过将上下文管理器with your_graph.as_default() tf.Graph使用,来指定MonitoredTrainingSession使用的with your_graph.as_default()

from __future__ import print_function
import tensorflow as tf

def example():
    g1 = tf.Graph()
    with g1.as_default():
        # Define operations and tensors in `g`.
        c1 = tf.constant(42)
        assert c1.graph is g1

    g2 = tf.Graph()
    with g2.as_default():
        # Define operations and tensors in `g`.
        c2 = tf.constant(3.14)
        assert c2.graph is g2

    # MonitoredTrainingSession example
    with g1.as_default():
        with tf.train.MonitoredTrainingSession() as sess:
            print(c1.eval(session=sess))
            # Next line raises
            # ValueError: Cannot use the given session to evaluate tensor:
            # the tensor's graph is different from the session's graph.
            try:
                print(c2.eval(session=sess))
            except ValueError as e:
                print(e)

    # Session example
    with tf.Session(graph=g2) as sess:
        print(c2.eval(session=sess))
        # Next line raises
        # ValueError: Cannot use the given session to evaluate tensor:
        # the tensor's graph is different from the session's graph.
        try:
            print(c1.eval(session=sess))
        except ValueError as e:
            print(e)

if __name__ == '__main__':
    example()

因此,正如您所说,使用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, {})`

或以分布式方式(有关输入的更多信息,请参见分布式文档 ):

run_my_model(train_op, {"master": server.target,
                        "is_chief": (FLAGS.task_index == 0)})

另一方面,使用原始tf.Session对象的好处是,您没有tf.train.MonitoredTrainingSession的额外好处,如果您不打算使用它们或希望使用它,这将很有用获得更多控制(例如,有关如何启动队列的信息)。

编辑(根据评论):对于操作初始化,您必须做类似的事情(参见官方文档

# 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,...)

对于QueueRunner,我将带您参考官方文档 ,您将在其中找到更完整的示例。

编辑2:

了解tf.train.MonitoredTrainingSession如何工作的主要概念是_WrappedSession类:

该包装器用作各种会话包装器的基类,这些会话包装器提供了附加功能,例如监视,协调和恢复。

tf.train.MonitoredTrainingSession通过tf.train.MonitoredTrainingSession工作(从1.1版开始 ):

  • 它首先检查它是主管还是工人(请参阅有关词汇问题的分布式文档 )。
  • 它开始提供的钩子(例如, StopAtStepHook在此阶段将只检索global_step张量。
  • 它创建一个会话,该会话是包装在_HookedSessionChief (或Worker会话),包装在_CoordinatedSession包装在_RecoverableSession
    Chief / Worker会议负责运行Scaffold提供的初始化操作。
      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. 
  • chief会议还负责所有检查点部分:例如,使用ScaffoldSaver从检查点恢复。
  • _HookedSession基本上是用来修饰run方法的:它在相关时调用_call_hook_before_runafter_run方法。
  • 在创建时, _CoordinatedSession会构建一个Coordinator ,该Coordinator器启动队列运行器并负责关闭它们。
  • _RecoverableSession将确保在出现tf.errors.AbortedError情况下重试。

总之, tf.train.MonitoredTrainingSession避免了很多样板代码,同时可以通过钩子机制轻松扩展。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号