tensorflow - Tensorflow 中 v.assign(v + 1) 和 v = v + 1 的区别
问题描述
以下 TensorFlow 代码可以正常工作并v1
变为 [1., 1., 1.]
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
变成 [1., 1., 1.] 如果我们运行sess.run(inc_v1)
.
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())
但是,以下代码会导致错误。
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())
错误如下:
AttributeError: 'Tensor' object has no attribute 'assign'
你能告诉我为什么它会导致错误吗?
解决方案
张量和变量是 TensorFlow 中的不同对象
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)
给
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
is 不再是一个变量,你不能给v2
. add
在这种情况下,您希望更新哪个操作数?每当您使用时,请v1
考虑使用的read_value()
操作v1
:
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)
给
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
推荐阅读
- javascript - 在继续之前等待对 Dexie 表查找的响应
- android - 更新到 android studio 后用户无法登录
- typescript - 在 Typescript 中使用 forEach 时如何分配类型(类型未知的对象)
- python - Matplotlib 绘图显示太小,更改 matplotlib 绘图的尺寸或大小
- python - Elasticsearch - 如果单个术语出现在字段中,则提升它
- haskell - 表达 StateT Functor 实例定义的替代方法
- angular - 下拉值未在模板驱动的表单中注册
- azure - 用于容器的 Azure Web 应用程序 - 正确的端口设置和日志记录问题
- c++ - 如何使现有的 DCOM (OPC) 应用程序作为服务运行?
- sqlite - SQL:根据指定日期求和