函数原型:
tf.assign(ref, value, validate_shape=None, use_locking=None, name=None)
Defined in tensorflow/python/ops/state_ops.py.
将 value 赋值给 ref,并输出 ref,即 ref = value;
这使得需要使用复位值的连续操作变简单
Defined in tensorflow/python/framework/tensor_shape.py.
函数原型:
tf.assign_add(
ref,
value,
use_locking=None,name=None
)
Defined in tensorflow/python/ops/state_ops.py
.
See the guide: Variables > Variable helper functions
Update 'ref' by adding 'value' to it.
更新ref的值,通过增加value,即:ref = ref + value;
函数原型:tf.identity
tf.identity(
input,
name=None
)
Return a tensor with the same shape and contents as input.
返回一个具有相同形状张量和内容作为输入;
Args:
-
input
: ATensor
. -
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,并且没有加入到整个图中,则不会执行;
Defined in tensorflow/python/framework/ops.py
.
See the guide: Building Graphs > Utility functions
Wrapper for Graph.control_dependencies()
using the default graph.
See tf.Graph.control_dependencies
for more details.
下面程序要做的是,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(sess.run(y))
<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中。