我想在函数之间传递一个可变值以进行调试。共享变量不起作用,因为他们的作业需要调用.eval()
或sess.run()
,而我使用tf.Print()
位于我的过程和输出值的深处。
假设我想输出此时计算渐变的图层数,所以我尝试用张量来做:
# initialize shared tensor somewhere outside
LevelCounter = tf.constant(5, name ="sharedtensor", dtype=tf.int32)
#function that updates shared tensor value
def process_gradient_layer_counter(): # show current layer
#access shared tensor
current_layer = tf.get_default_graph().get_tensor_by_name("sharedtensor:0")
#modify it's value
current_layer -= 1
# My attempt: save it again using the same name. Didn't work
current_layer = tf.identity(current_layer, name ="sharedtensor")
return current_layer
# compute gradient
@tf.RegisterGradient('MyGrad')
def mygrad(op, grad):
x = op.inputs[0]
# ... compute grad_new, which I want to debug ... #
#Display layer counter
grad_new = tf.Print(grad_new, [process_gradient_layer_counter()], message = 'debug: ')
return grad_new
但遗憾的是,此代码始终输出4.如何在不破坏工作流程的情况下在不同功能之间共享可变值?
答案 0 :(得分:1)
要了解正在发生的事情,请考虑创建的计算图。每次调用mygrad()时,它都会创建tf.identity(sharedtensor-1)
节点。你有一堆节点正在进行相同的计算,所以你看到相同的结果打印就不足为奇了。
通过强制assign_add
通过控制依赖来实现可变内部状态,但它不直观且容易出错。更好的方法可能是用更新全局Python变量的process_gradient_layer_counter
替换tf.py_func