我想在函数之间传递一个可变值,以便于调试。共享变量不起作用,因为它们的赋值需要调用.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。如何在不同的函数之间共享可变值而不破坏工作流?在
要了解发生了什么,请考虑创建的计算图。每次调用mygrad()时,它都会创建
tf.identity(sharedtensor-1)
节点。你有一堆节点在做同样的计算,所以你看到同样的结果打印出来就不足为奇了。在通过控制依赖项强制
assign_add
来实现可变的内部状态是可能的,但这是不直观的,而且容易出错。更好的方法是用更新全局Python变量的process_gradient_layer_counter
替换tf.py_func
相关问题 更多 >
编程相关推荐