2017-07-28 189 views
0

我想在函数之间传递一个可变值用于调试目的。共享变量不起作用,因为他们的任务需要调用.eval()sess.run(),而我位于我的程序和输出值的深处,使用tf.Print()Tensorflow:共享可变张量

假设我要输出其梯度的时刻计算层的数量,所以我试图用张量做到这一点:

# 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

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

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

+0

谢谢!然而,py_func实际上歼灭了我的GPU,或者至少显着减慢了速度。梯度绝对是按顺序调用的,我也注意到张量名称是“sharedtensor:0”。那么也许我可以每次创建一个新节点并从这些节点访问最后一个节点?一些内存泄漏是可以接受的调试... – Slowpoke

+0

如果没有其他的方式,那么我会去与CPU和pyfunc解决方案... – Slowpoke

+1

,而不是添加到'sharedtensor'你可以添加到一些全球性的python变量包含最后另外 –