tf.assign(),tf.assign_add(),tf.i

2018-05-24  本文已影响335人  听风1996

函数原型:
tf.assign(ref, value, validate_shape=None, use_locking=None, name=None)
将value 赋值给ref,并输出 ref,即 ref = value;
这使得需要使用复位值的连续操作变简单


函数原型:

tf.assign_add(ref,value,use_locking=None,name=None)

更新ref的值,通过增加value,即:ref = ref + value;

This operation outputs "ref" after the update is done. This makes it easier to chain operations that need to use the reset value.
函数原型:

tf.identity(input,name=None)

Return a tensor with the same shape and contents as input.

返回一个具有相同形状张量和内容作为输入;

Args:

Returns:

A Tensor. Has the same type as input.

函数原型:tf.control_dependencies

tf.control_dependencies(control_inputs)

tf.control_dependencies()设计是用来控制计算流图的,给图中的某些计算指定顺序。比如:我们想要获取参数更新后的值,那么我们可以这么组织我们的代码。
自己的理解:如果不是tf的tensor,并且没有加入到整个图中,则不会执行;

举个例子:

下面程序要做的是,5次循环,每次循环给x加1,赋值给y,然后打印出来,

x = tf.Variable(0.0)
#返回一个op,表示给变量x加1的操作
x_plus_1 = tf.assign_add(x, 1)
  
#control_dependencies的意义是,在执行with包含的内容(在这里就是 y = x)前
#先执行control_dependencies中的内容(在这里就是 x_plus_1)
with tf.control_dependencies([x_plus_1]):
    y = x
init = tf.initialize_all_variables()
  
with tf.Session() as session:
    init.run()
    for i in xrange(5):
        print(y.eval())

由于control_dependencies的所以执行print前都会先执行x_plus_1。

这个打印的是0,0,0,0,0 ,也就是说没有达到我们预期的效果,这是因为此时的y是一个复制了x变量的变量,并未和图上的节点相联系不接受流程控制函数的调遣,

改成如下

import tensorflow as tf
x = tf.Variable(0.0)
print(x)
x_plus_1 = tf.assign_add(x, 1)
with tf.control_dependencies([x_plus_1]):
    y = x + 0.0
    print(y) #z=tf.identity(x,name='x')
init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    for i in range(5):
        print(y.eval())
 <tf.Variable 'Variable:0' shape=() dtype=float32_ref>

Tensor("add:0", shape=(), dtype=float32)

1.0  2.0  3.0  4.0  5.0

可以看到当y定义为节点的输出后,就可以顺利执行操作了,此时y成为节点的输出,可以被图识别。

x = tf.Variable(0.0)
x_plus_1 = tf.assign_add(x, 1)
  
with tf.control_dependencies([x_plus_1]):
    y = tf.identity(x)#修改部分
init = tf.initialize_all_variables()
  
with tf.Session() as session:
    init.run()
    for i in range(5):
        print(y.eval())
This works: it prints 1, 2, 3, 4, 5.

这时候打印的是1,2,3,4,5

解释:

查询y为:Tensor("Identity_1:0", shape=(), dtype=float32),和节点联系起来了。
tf.identity是返回了一个一模一样新的tensor,再control_dependencies的作用块下,需要增加一个新节点到gragh中。

tf.identity()与tf.group()

1. tf.identity():

import tensorflow as tf  
x = tf.Variable(0.0)  
x_plus = tf.assign_add(x, 1)  
with tf.control_dependencies([x_plus]):#只有当内部为操作时以来才会生效  
    y = tf.identity(x)#将该语句变为操作  
init = tf.global_variables_initializer()  
with tf.Session() as session:  
    init.run()  
    for i in range(5):  
        print(y.eval())  
    print(x.eval())#5  

2.tf.group():

import tensorflow as tf  
x = tf.Variable(0.0)  
x_plus = tf.assign_add(x, 1)  
with tf.control_dependencies([x_plus]):#只有当内部为操作时以来才会生效  
    #y = tf.identity(x)#将该语句变为操作  
    y = x  
    update = tf.group(y)#将该语句变为操作  
init = tf.global_variables_initializer()  
with tf.Session() as session:  
    init.run()  
    for i in range(5):  
        session.run(update)  
        print(y.eval())  
    print(x.eval())#5  

总结:tf.identity()和tf.group()均可将语句变为操作

上一篇下一篇

猜你喜欢

热点阅读