Tensorflow:共享可变张量

时间:2017-07-28 19:52:59

标签: python tensorflow

我想在函数之间传递一个可变值以进行调试。共享变量不起作用,因为他们的作业需要调用.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.如何在不破坏工作流程的情况下在不同功能之间共享可变值?

1 个答案:

答案 0 :(得分:1)

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

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