运行钩子
概述
SessionRunHooks
有助于跟踪训练,报告进展,要求尽早停止和更多。用户可以将任意数量的钩子附加到一个估计器上。SessionRunHooks
使用观察者模式并在以下点通知:
- 当一个会话开始使用时
- 之前打了个电话
session.run ()
- 打了个电话后
session.run ()
- 会话何时结束
一个SessionRunHook
封装一段可重用/可组合的计算,它可以承载调用MonitoredSession.run ()
.钩子可以向运行调用添加任何op -or张量/feed,当运行调用成功完成时,将获得它所请求的输出。允许钩子向图中添加操作hook.begin ()
.图形在开始()
方法被调用。
内置运行钩子
有一些预定义的SessionRunHooks
例如:运行钩子在跟踪训练、报告进度、请求提前停止等方面很有用。用户可以将任意数量的钩子附加到一个估计器上。一些内置的运行钩子包括:
方法 | 描述 |
---|---|
hook_checkpoint_saver () |
每N步或秒保存检查点。 |
hook_global_step_waiter () |
延迟执行,直到全局步骤达到wait_until_step。 |
hook_history_saver () |
节省了指标的历史。 |
hook_logging_tensor () |
每N步或每N秒打印一次给定的张量。 |
hook_nan_tensor () |
南损失监测。 |
hook_progress_bar () |
创建并更新进度条。 |
hook_step_counter () |
每秒步数监视器。 |
hook_stop_at_step () |
监视器请求在指定的步骤停止。 |
hook_summary_saver () |
每N步保存摘要。 |
例如,我们可以用hook_progress_bar ()
在模型训练过程中附加一个钩子来创建和更新进度条。
fcs < -feature_columns(column_numeric(“诅咒”))输入< -input_fn(mtcars响应=“英里”,特点=c(“诅咒”,“共青团”),batch_size =8 l)lr < -linear_regressor(feature_columns =fcs)% > %火车(input_fn =输入,步骤=2,钩子=列表(hook_progress_bar()))
培训2/2 [======================================] - 埃塔:0 -损失:3136.10
另一个例子是使用hook_history_saver ()
每2个训练步骤保存一次训练记录,如下所示:
lr < -linear_regressor(feature_columns =fcs)training_history < -火车(lr,input_fn =输入,步骤=4,钩子=列表(hook_history_saver(every_n_step =2)))
培训()
返回保存的训练指标历史记录:
4 . > training_history mean_losses total_losses steps 1 343.9690 2751.752 2 2 419.7618 3358.094
自定义运行钩子
用户还可以通过在会话的不同阶段定义钩子的行为来创建自定义运行钩子。
我们可以通过定义一个回调函数列表作为的一部分来实现自定义运行钩子session_run_hook ()
初始化。它具有以下可选参数,可被自定义函数覆盖:
开始
:有签名的函数函数()
,在使用会话之前调用一次。after_create_session
:有签名的函数函数(会话,coord)
,在创建新的TensorFlow会话后调用。before_run
:有签名的函数函数(run_context)
在跑步前被叫到。after_run
:有签名的函数函数(run_context run_values)
在跑步后被呼叫。结束
:有签名的函数函数(会话)
在会议结束时调用。
例如,让我们尝试实现hook_history_saver ()
我们在前一节已经展示过了。我们首先初始化aiter_count
变量保存正在运行的步骤的当前计数。我们增加计数作为的一部分after_run ()
在每一个session.run
调用。内部before_run ()
,我们使用上下文访问当前的损耗,并将其保存到一个名为“损耗”的张量中,以便稍后在内部访问它after_run ()
通过值结果美元损失
它包含了张量“损耗”的评估值。最后,我们计算原始损失的平均值,并将其附加到一个名为“mean_losses_history”的全局状态变量和平均损失列表。
mean_losses_history < < - - - - - -零hook_history_saver_custom < -函数(every_n_step) {iter_count < < - - - - - -0session_run_hook(before_run =函数(上下文){session_run_args(损失=上下文$会话$图$get_collection(“损失”))},after_run =函数(背景、价值观){iter_count < < - - - - - -iter_count+1打印(paste0(“运行步骤:, iter_count))如果(iter_count% %every_n_step= =0){raw_losses < -值$结果$损失[[1]]mean_losses_history < < - - - - - -c(mean_losses_history的意思是(raw_losses))}})}
接下来,我们可以将这个钩子附加到我们的估计器上:
lr < -linear_regressor(feature_columns =fcs)% > %火车(input_fn =输入,步骤=4,钩子=列表(hook_history_saver_custom(every_n_step =1)))
[1] "运行步骤:1"[1]"运行步骤:2"[1]"运行步骤:3"[1]"运行步骤:4"
我们每一步都保存了损失的历史。让我们检查一下损失清单:
> mean_losses_history [1] 415.8088 452.2128 376.7346 331.6045