在 TF 估计器训练挂钩中设置变量?

Setting variables in a TF estimator training hook?

tf.estimator.Estimatortrain 函数具有以下签名:

train(
    input_fn,
    hooks=None,
    steps=None,
    max_steps=None,
    saving_listeners=None
)

我正在训练一个网络,我需要根据相当复杂的算法的结果每隔几步手动设置一些变量,这无法在图中实现。是否可以在钩子中设置变量的值?有人知道这方面的任何示例代码吗?

为了不浪费资源,我不需要在每个训练步骤都调用挂钩。有没有办法指定我的钩子每 N 步只调用一次?我当然可以,在我的钩子中保留一个计数器,当我的算法不应该 运行 时只是 return,但看起来这应该是可配置的。

是的,这应该是可能的!我不确切知道这个变量存在于哪个范围内或者你如何引用它,所以我假设你知道它的名字。我基本上是从我的其他答案 .

窃取代码

只需在训练循环之前创建一个钩子:

class VariableUpdaterHook(tf.train.SessionRunHook):
    def __init__(self, frequency, variable_name):
        # variable name should be like: parent/scope/some/path/variable_name:0
        self._global_step_tensor = None
        self.variable = None
        self.frequency = frequency
        self.variable_name = variable_name

    def after_create_session(self, session, coord):
        self.variable = session.graph.get_tensor_by_name(self.variable_name)

    def begin(self):
        self._global_step_tensor = tf.train.get_global_step()

    def after_run(self, run_context, run_values):
        global_step = run_context.session.run(self._global_step_tensor)
        if global_step % self.frequency == 0:
            new_variable_value = complicated_algorithm(...)
            assign_op = self.variable.assign(new_variable_value)
            run_context.session.run(assign_op)

我认为不值得研究另一种方法来避免每次迭代后调用,因为它们非常便宜。所以要走的路就像你建议的那样。

注意:我没有时间调试它,因为我目前没有用例。但我希望你能明白。