首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >v.assign(v + 1)与v=v+1在Tensorflow中的差异

v.assign(v + 1)与v=v+1在Tensorflow中的差异
EN

Stack Overflow用户
提问于 2018-07-04 05:12:31
回答 1查看 105关注 0票数 0

下面的Tensorflow代码工作良好,v1变为1.、1.、1。

代码语言:javascript
运行
复制
v1 = tf.get_variable('v1', shape=[3], initializer=tf.zeros_initializer)
v1 = v1 + 1 

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print (v1.eval())

下面的代码段也给出了与上面的结果完全相同的结果。如果我们运行v1,那么sess.run(inc_v1)就变成1.,1,1。

代码语言:javascript
运行
复制
v1 = tf.get_variable('v1', shape=[3], initializer=tf.zeros_initializer)
inc_v1 = v1.assign(v1 + 1)


with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    sess.run(inc_v1)
    print (v1.eval())

但是,下面的代码会导致错误。

代码语言:javascript
运行
复制
v1 = tf.get_variable('v1', shape=[3], initializer=tf.zeros_initializer)
v1 = v1 + 1 
inc_v1 = v1.assign(v1 + 1)


with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    sess.run(inc_v1)
    print (v1.eval())

错误如下:

代码语言:javascript
运行
复制
AttributeError: 'Tensor' object has no attribute 'assign'

你能告诉我为什么会出错吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-04 06:35:41

张量和变量是TensorFlow中的不同对象。

代码语言:javascript
运行
复制
import tensorflow as tf


def inspect(t):
    print('\n %s\n-------' % t.name)
    print(type(t))
    print(t.op.outputs)
    print('has assign method' if 'assign' in dir(t) else 'has no assign method')


v1 = tf.get_variable('v1', shape=[3], initializer=tf.zeros_initializer)
inspect(v1)
v2 = v1 + 1
inspect(v2)

给出

代码语言:javascript
运行
复制
 v1:0
-------
<class 'tensorflow.python.ops.variables.Variable'>
[<tf.Tensor 'v1:0' shape=(3,) dtype=float32_ref>]
has assign method

 add:0
-------
<class 'tensorflow.python.framework.ops.Tensor'>
[<tf.Tensor 'add:0' shape=(3,) dtype=float32>]
has no assign method

因此,v1:0本身就是变量,而v1有方法assign。这是有意义的,因为它只是对浮点值的引用。另一方面,v2 = v1 + 1会导致add操作的输出。因此,v2不再是一个变量,您不能将一个新值赋给v2。在这种情况下,您希望更新add的哪个操作数?每当您使用v1时,请考虑使用v1中的read_value()操作:

代码语言:javascript
运行
复制
v1 = tf.get_variable('v1', shape=[3], initializer=tf.zeros_initializer)
inspect(v1)
w = v1.read_value()
inspect(w)
v2 = v1.read_value() + 1
inspect(v2)

给出

代码语言:javascript
运行
复制
 v1:0
-------
<class 'tensorflow.python.ops.variables.Variable'>
[<tf.Tensor 'v1:0' shape=(3,) dtype=float32_ref>]
has assign method

 read:0
-------
<class 'tensorflow.python.framework.ops.Tensor'>
[<tf.Tensor 'read:0' shape=(3,) dtype=float32>]
has no assign method

 add:0
-------
<class 'tensorflow.python.framework.ops.Tensor'>
[<tf.Tensor 'add:0' shape=(3,) dtype=float32>]
has no assign method
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51166162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档