tf.assign_ad 和 + 的区别

作者:MapReducer
链接:https://www.jianshu.com/p/8e45549db258
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

 

  • tf.assign是创建一个操作符这个操作符具有这个值变量的值,而=是Python中的赋值,tensorflow函数的操作会新建一个节点,如果用Python的=那么就相当于将变量的引用给到这个新节点上,但是在计算图上并没有相应的赋值操作节点(因为只是python对于等式右边节点的一个引用而已),而如果使用tf.assign的话计算图中有赋值节点。
  • 你只要分清哪些是tensorflow中的操作和哪些是python语言的引用操作,就能分清哪些是在建图,哪些只是在改变引用。

第一个例子:因为op是tensorflow中的一个结点,而assign_add是对原始的节点a进行赋值,所以最终的结果是7。

a = tf.Variable(3)
op = tf.assign_add(a,1)
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    sess.run(op)
    sess.run(op)
    sess.run(op)
    sess.run(op)
    print(sess.run(a))
>>7

第二个例子:注意a = a + 1的实际操作是首先将右边a的节点加上1,这是一个新建节点操作,a+1返回的是这个新建节点,此时a = 新建节点。也就是a引用的节点地址从变量a变成了a+1操作符的引用,我们打印出来可以看到,此时的a是一个add操作。这是run(a)就不会修改原始节点name="a"的值,也就是始终为1也就是关键问题是在计算图上没有给原始的变量a进行赋值,所以他的值始终是1,加了1以后add操作符打印出来是2

a = tf.Variable(3)
a = a + 1

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    sess.run(a)
    sess.run(a)
    sess.run(a)
    sess.run(a)
    print(a)
    print(sess.run(a))
>>Tensor("add:0", shape=(), dtype=int32)
4

 



 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值