Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.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 在TF估计器训练挂钩中设置变量?_Python_Tensorflow_Tensorflow Estimator - Fatal编程技术网

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

Python 在TF估计器训练挂钩中设置变量?,python,tensorflow,tensorflow-estimator,Python,Tensorflow,Tensorflow Estimator,tf.estimator.estimator的train函数具有以下特征: train( input_fn, hooks=None, steps=None, max_steps=None, saving_listeners=None ) 我正在训练一个网络,在那里我需要每隔几步根据一个相当复杂的算法的结果手动设置一些变量,这在图中是无法实现的。可以在钩子中设置变量的值吗?有人知道这方面的示例代码吗 为了不浪费资源,我不需要在训练的每一步都扣钩。有没有办法

tf.estimator.estimator
train
函数具有以下特征:

train(
    input_fn,
    hooks=None,
    steps=None,
    max_steps=None,
    saving_listeners=None
)
我正在训练一个网络,在那里我需要每隔几步根据一个相当复杂的算法的结果手动设置一些变量,这在图中是无法实现的。可以在钩子中设置变量的值吗?有人知道这方面的示例代码吗


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

是的,这应该是可能的!我不知道这个变量到底存在于哪个范围内,也不知道您是如何引用它的,所以我假设您知道它的名称。我基本上是从我的另一个答案中窃取代码

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

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)
我认为不值得研究避免每次迭代后调用的另一种方法,因为它们非常便宜。因此,该走的路正如你所建议的

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