函数原型:
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:
- input: A Tensor.
- name: A name for the operation (optional).
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()均可将语句变为操作
网友评论