页面树结构

2017-11-09 ApacheCN 开源组织,第二期邀请成员活动,一起走的更远 : http://www.apachecn.org/member/209.html


MachineLearning 优酷地址 : http://i.youku.com/apachecn

转至元数据结尾
转至元数据起始

 

原文链接 : https://www.tensorflow.org/programmers_guide/supervisor

译文链接 : http://www.apache.wiki/pages/viewpage.action?pageId=2886337(修改该链接为 ApacheCN 对应的译文链接)

贡献者 :  ApacheCN Apache中文网

校对:Ngxin

使用TensorFlow训练一个模型,您可以多次运行训练操作,并在完成后保存训练参数的检查点(checkpoint)。这对能够在几个小时内训练的小模型很有效。

需要长时间训练的较大模型,需要更鲁棒(robust)的训练过程:

  • 能处理关机以及彻底崩溃的情况。
  • 可以在关机或崩溃后恢复。
  • 可以通过TensorBoard进行监控。

为了能够在停机或崩溃后恢复训练,训练过程必须周期保存检查点。在重新启动时,它必须查找最新的检查点,并在恢复训练之前加载它。

要通过TensorBoard进行监控,训练过程必须周期进行summary操作,并将返回的值附加到事件文件中,如TensorBoard:可视化学习中所述。TensorBoard监测事件文件并显示训练进度随时间变化的图形。

tf.train.Supervisor提供了一套有助于实施鲁棒的训练过程的服务。

本教程将告诉您如何直接使用supervisor。请考虑建立在supervisor之上的几个框架,他们能提供更丰富的训练循环,以及众多的自定义选项,如: tf.learn是一个不错的选择。

请注意,Supervisor对训练大模型非常有帮助,但也可以用于较小型号,不会有任何不好的地方。

 

一个简单方案

使用Supervisor的最简单的方案是:

  • 创建一个Supervisor对象,将其传递到保存检查点和summary的目录。

  • tf.train.Supervisor.managed_sessionSupervisor请求一个会话(session)。

  • 使用会话执行训练操作,如果Supervisor要求训练停止,请检查每一步。

  ...create graph...
  my_train_op = ...

  sv = tf.train.Supervisor(logdir="/my/training/directory")
  with sv.managed_session() as sess:
    for step in range(100000):
      if sv.should_stop():
        break
      sess.run(my_train_op)

开始服务

在简单方案下,调用managed_session()启动一些服务,它们在自己的线程中运行,并利用managed session在您的图中运行各种操作。

如果您的图中包含一个名为global_step的整型变量,则服务使用其值来测量执行的训练步骤数量。有关如何创建global_step变量,请参阅MNIST训练教程

  • 检查点服务:在logdir中保存图形变量的副本。global_step如果添加到您的图中,则检查点文件名将使用该变量的值。默认运行10分钟。

  • summary服务:运行所有summary操作,并将其输出附加到logdir 中的 事件文件中。默认情况下每2分钟运行一次。

  • 步骤计数器:通过查看global_step变量的更改来计算执行了多少步。向事件文件追加一个summary,报告每秒钟的全局步数。 summary tag 为“global_step / sec”。这也默认每2分钟运行一次。

  • Queue Runners:如果tf.train.QueueRunner添加到图形中,Supervisor将在自己的线程中启动它们。

构建Supervisor对象时可以更改所有时间间隔。有关详细信息,请参阅Supervisor参考

检查停止

在主训练循环中对停止的检查是重要和必要的。

在服务线程中引发的异常报告给Supervisor,然后将其should_stop()条件设置为true。其他服务线程告知此情形并合理终止。managed_session()块内的主训练循环 还必须检查停止条件并终止。

请注意managed_session()捕获从训练循环中引发的异常情况,将其报告给Supervisor。主循环不需要对异常做任何特别的处理。它只需要检查停止条件。

复苏

如果训练程序关闭或崩溃,其最新的检查点和事件文件将留在logdir中。当您重新启动程序时, managed_session()从最近的检查点恢复图形,并恢复停止的训练。

创建一个新的事件文件。如果您启动TensorBoard并将其指向logdir,它将会知道如何合并两个事件文件的内容,并将在检查点的最后一个全局步骤中显示训练恢复。

 

较大的模式场景

对于大多数中小型机型而言,非常简单的情况就足够了。当总结服务运行时,较大的模型可能会耗尽内存:摘要操作与运行列车操作的主循环并行运行。这可能导致内存使用量达到正常使用的两倍。

对于较大的型号,您可以告诉主管不要运行汇总服务,而是自己运行在主培训循环中:summary_op=None 构建主管时通过。

例如,该代码在训练循环中每100个步骤运行摘要:

  ...create graph...
  my_train_op = ...
  my_summary_op = tf.summary.merge_all()

  sv = tf.train.Supervisor(logdir="/my/training/directory",
                     summary_op=None) # Do not run the summary service
  with sv.managed_session() as sess:
    for step in range(100000):
      if sv.should_stop():
        break
      if step % 100 == 0:
        _, summ = session.run([my_train_op, my_summary_op])
        sv.summary_computed(sess, summ)
      else:
        session.run(my_train_op)

预先训练的模式场景

managed_session()呼叫负责在会话中初始化模型。如果有可用模型从检查点恢复,否则从头开始初始化。

一个常见的情况是通过加载一个“预训练”检查点来初始化模型,该检查点在使用不同的数据集训练通常略有不同的模型时被保存。

您可以通过将“init函数”传递给主管来加载预训练的检查点。仅当需要从头开始初始化模型时,才能调用此函数,而不是从logdir的检查点恢复模型。

要加载预训练的模型,init函数需要一个 tf.train.Saver对象,因此您应该为此创建一个保护程序。这通常是一个好主意,因为新模型可能包含预先训练的检查点中不存在的变量:此保护程序只能恢复预先训练的变量。如果您使用的是默认保护程序,则可能会从预培训的检查点中收到新模型的所有变量的错误。

  ...create graph...
  # Create a saver that restores only the pre-trained variables.
  pre_train_saver = tf.train.Saver([pre_train_var1, pre_train_var2])

  # Define an init function that loads the pretrained checkpoint.
  def load_pretrain(sess):
    pre_train_saver.restore(sess, "<path to pre-trained-checkpoint>")

  # Pass the init function to the supervisor.
  #
  # The init function is called _after_ the variables have been initialized
  # by running the init_op.
  sv = tf.train.Supervisor(logdir="/my/training/directory",
                     init_fn=load_pretrain)
  with sv.managed_session() as sess:
    # Here sess was either initialized from the pre-trained-checkpoint or
    # recovered from a checkpoint saved in a previous run of this code.
    ...

运行您自己的服务

Supervisor服务(例如检查点服务)与主训练循环并行运行。您有时希望添加自己的服务,例如,以不同于通常的汇总服务的方式获取不同的汇总集。

 tf.train.Supervisor.loop为此目的使用主管的方法。它会重复地在一个计时器上调用您选择的功能,直到主管停止条件成为真实状态,因此与其他服务很好地播放。

示例:my_additional_summaries()每20mn 调用一次:

def my_additional_sumaries(sv, sess):
 ...fetch and write summaries, see below...

...
  sv = tf.train.Supervisor(logdir="/my/training/directory")
  with sv.managed_session() as sess:
    # Call my_additional_sumaries() every 1200s, or 20mn,
    # passing (sv, sess) as arguments.
    sv.loop(1200, my_additional_sumaries, args=(sv, sess))
    ...main training loop...

写摘要

管理员总是在其logdir中创建一个事件文件,以及 tf.summary.FileWriter向该文件附加事件和摘要。如果要编写自己的摘要,将它们附加到相同的事件文件是一个好主意:当目录中只有一个事件文件被积极附加到时,TensorBoard更好地喜欢它。

主管提供一个辅助功能来附加摘要: tf.train.Supervisor.summary_computed。只需传递一个摘要op返回的输出函数。以下是使用该函数my_additional_sumaries()从上一个示例中实现的示例:

def my_additional_sumaries(sv, sess):
  summaries = sess.run(my_additional_summary_op)
  sv.summary_computed(sess, summaries)
对于更高级的用途,主管通过其tf.train.Supervisor.summary_writer 属性提供对其摘要作者的 访问。

 

Supervisor参考

非常简单的场景,以及更大的模型方案显示监事的基本用途。可以通过使用主管提供的许多选项来构建更高级的场景

检查点:何时何地。

managed_session()呼叫启动检查点服务,可以通过以下关键字参数为Supervisor() 构造函数配置:

  • logdir:检查点服务创建检查点的目录的路径。如果需要,创建该目录。传递None禁用检查点和摘要服务。

  • checkpoint_basename:要创建的检查点文件的名称,默认为“model.ckpt”。

如果模型包含一个名为的标量整数变量global_step,则该变量的值将附加到检查点文件名。

例如,在全局步骤1234,检查点文件名是“model.ckpt-1234”。

  • save_model_secs:每个检查点之间的秒数。默认为600或10分钟。

选择一个值时,请考虑在遇到崩溃时想要失去多少工作:您永远不会失去超过save_model_secs几秒钟的工作。将其设置为0将禁用检查点服务。

如果您不通过,则主管通过调用创建一个 tf.train.Saver(),其中添加操作以保存并还原模型中的所有变量。这通常是你需要的。

示例:每30秒使用自定义保护程序和检查点。

  ...create graph...
  my_saver = tf.train.Saver(<only some variables>)
  sv = tf.train.Supervisor(logdir="/my/training/directory",
                     saver=my_saver,
                     save_model_secs=30)
  with sv.managed_session() as sess:
    ...training loop...

摘要:何时何地。

managed_session()呼叫启动摘要服务,其获取摘要并报告每秒执行的步骤数。可以通过构造函数的以下关键字参数来配置Supervisor() 它:

  • logdir:摘要服务创建事件文件的目录的路径。如果需要,创建该目录。传递None禁用汇总服务以及检查点服务。

  • save_summaries_secs:汇总服务的每次运行之间的秒数。默认为120或2分钟。

选择一个值时,请考虑您的摘要是多么昂贵,以及它们将占用多少磁盘。通过0以禁用摘要服务。

  • summary_op:用于获取摘要。

如果没有指定,则主管使用tf.GraphKeys.SUMMARY_OP 图形集合中的第一个操作 。如果集合为空,则主管将创建一个op,该集合使用图中的所有摘要tf.summary.merge_all()

传递None禁用摘要服务。

  • global_step:Tensor用来计数全球一步。

如果未指定,则主管将使用tf.GraphKeys.GLOBAL_STEP 图形集合中的第一张张 。如果集合为空,则主管global_step将在图中查找一个标量整型变量。

如果找到,全局步长张量用于测量执行的训练步骤的数量。请注意,您的培训操作系统负责增加全局步进值。

模型初始化和恢复

managed_session()呼叫负责初始化或恢复会话。它返回一个具有完全初始化模型的会话,准备运行ops。如果managed_session()调用logdir中存在检查点,则通过加载该检查点来初始化该模型,否则通过调用init op和可选的init函数进行初始化。

当没有检查点可用时,模型初始化由构造函数的以下关键字参数Supervisor()控制:

  • init_op:运行以初始化模型。

如果没有指定,主管将使用集合中的第一个操作 tf.GraphKeys.INIT_OP。如果集合为空,则主管添加一个op,通过调用来初始化图中的所有变量tf.global_variables_initializer()

传递None不使用init操作。

  • init_fn:Python函数调用初始化模型。

如果指定,调用为管理会话init_fn(sess)在哪里sess。如果还使用init op,init函数将在init操作之后调用。

  • local_init_op:用于初始化未保存在检查点(如表和局部变量)中的图形部分的附加操作 。本地init op 在init op和init函数之前运行。

如果没有指定,主管将使用集合中的第一个操作 tf.GraphKeys.LOCAL_INIT_OP。如果集合为空,则主管添加操作以通过调用tf.initialize_all_tables()和 初始化图中的所有表和局部变量tf.initialize_all_local_variables()

传递None不使用本地init操作。

  • ready_op:操作以检查模型是否被初始化。

在运行本地init操作,init操作和init函数之后,主管通过运行ready操作来验证模型是否被完全初始化。这是一个op,如果模型被初始化,则返回一个空字符串,或者如果没有初始化模型的哪些部分的描述。

如果没有指定,主管将使用集合中的第一个操作 tf.GraphKeys.READY_OP。如果集合为空,则主管创建一个准备好的操作,通过调用来验证所有变量是否被初始化tf.report_uninitialized_variables()

通过None禁用准备操作。在这种情况下,初始化后不检查模型。

检查点恢复由构造函数的以下关键字参数 Supervisor()控制:

  • logdir:要查找检查点的目录的路径。检查点服务在检查点目录中保存名为“检查点”的元数据文件,该目录指示最近检查点的路径。

此文件为文本格式。当捏住时,您可以手动编辑它,以从不同于最近的检查点进行恢复。

  • ready_op: (往上看)。准备运行在加载检查点之前和之后运行。第一个运行检查模型是否需要初始化,第二个运行验证模型是否已完全初始化。

  • local_init_op: (往上看)。在运行ready操作之前运行本地init操作,初始化局部变量和表。

  • saver: (往上看)。用于加载检查点的Saver对象。

 

  • 无标签