美文网首页
tf.assign(),tf.assign_add(),tf.i

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

作者: 听风1996 | 来源:发表于2018-05-24 23:42 被阅读335次

    函数原型:
    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()均可将语句变为操作

    相关文章

      网友评论

          本文标题:tf.assign(),tf.assign_add(),tf.i

          本文链接:https://www.haomeiwen.com/subject/ijbejftx.html