张量流:共享可变十位数

2024-10-04 09:27:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在函数之间传递一个可变值,以便于调试。共享变量不起作用,因为它们的赋值需要调用.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。如何在不同的函数之间共享可变值而不破坏工作流?在


Tags: 函数namelayernewvaluetfdefcounter
1条回答
网友
1楼 · 发布于 2024-10-04 09:27:00

要了解发生了什么,请考虑创建的计算图。每次调用mygrad()时,它都会创建tf.identity(sharedtensor-1)节点。你有一堆节点在做同样的计算,所以你看到同样的结果打印出来就不足为奇了。在

通过控制依赖项强制assign_add来实现可变的内部状态是可能的,但这是不直观的,而且容易出错。更好的方法是用更新全局Python变量的process_gradient_layer_counter替换tf.py_func

相关问题 更多 >