tensorflow:Input 'ref' of 'Assign' Op requires l-value input

这种错误出现在我在用tf.assign操作时,在google上查找了两个靠谱的解答,都是说tf.assign(a,b)把b赋给a时,a必须是variable对象,于是写了如下代码验证此功能:

import tensorflow as tf
sess = tf.Session()
one = tf.constant(1, dtype=tf.int32, name='one')
def ass_fun(var1,var2):
   tf.assign(var1,var2)
   return one
class B:
  def __init__(self,var1,var2):
    self.var1 = var1
    self.var2 = var2
  def __call__(self):
    tf.assign(self.var1,self.var2)
    return one

a=2
b=1
var1 = tf.Variable([1.0,1,0],trainable=False)
var2 = tf.Variable([2.0,2.0],trainable=False)
#indexs =  tf.IndexedSlices([1,2,3],0)
var11 = tf.convert_to_tensor(var1)
var22 = tf.convert_to_tensor(var2)
init_op = tf.global_variables_initializer()
#ass = tf.assign(var1,var22)
list_test = [var1]
#print callable(ass_fun(var1,var22))
cond = tf.cond(tf.greater(a,b),lambda:ass_fun(list_test[0][0],var2[0]),lambda:ass_fun(list_test[0][0],var2[0]))
#sess.run(init_op)
print sess.run(cond)
sess.close()

发现报错

Traceback (most recent call last):
  File "test_assign.py", line 28, in <module>
    cond = tf.cond(tf.greater(a,b),lambda:ass_fun(list_test[0][0],var2[0]),lambda:ass_fun(list_test[0][0],var2[0]))
  File "/data/virtualenvs/tf1.0_3/local/lib/python2.7/site-packages/tensorflow/python/ops/control_flow_ops.py", line 1759, in cond
    orig_res, res_t = context_t.BuildCondBranch(fn1)
  File "/data/virtualenvs/tf1.0_3/local/lib/python2.7/site-packages/tensorflow/python/ops/control_flow_ops.py", line 1660, in BuildCondBranch
    r = fn()
  File "test_assign.py", line 28, in <lambda>
    cond = tf.cond(tf.greater(a,b),lambda:ass_fun(list_test[0][0],var2[0]),lambda:ass_fun(list_test[0][0],var2[0]))
  File "test_assign.py", line 5, in ass_fun
    tf.assign(var1,var2)
  File "/data/virtualenvs/tf1.0_3/local/lib/python2.7/site-packages/tensorflow/python/ops/gen_state_ops.py", line 47, in assign
    use_locking=use_locking, name=name)
  File "/data/virtualenvs/tf1.0_3/local/lib/python2.7/site-packages/tensorflow/python/framework/op_def_library.py", line 617, in apply_op
    (input_name, op_type_name))
TypeError: Input 'ref' of 'Assign' Op requires l-value input

因为var1是variable对象,而var1[0]或者var1[1]不是,要赋值只能整体赋值。
这个问题是在项目中遇到的问题,首先拿到这个问题,先上google搜了一下,得到左值必须是variable的答案,但并不知道为什么,查看官方文档发现tf.assign的操作如此要求;于是写例子程序验证,发现正常执行,但是项目程序就是报错,而且左值定义的就是variable;比对测试程序和项目程序两者的不同,重现了该错误。
解决问题一定要依赖于官方文档,多用google,写测试程序,另外,要尽量写bug少的代码,多读些经典书籍,如《代码大全》代码设计方面的东西。
附上Stack Overflow的解答:
https://stackoverflow.com/questions/36898156/tensorflow-apply-gradients-throws-error
https://stackoverflow.com/questions/38297193/tensorflow-learning-rate-decay-how-to-properly-supply-the-step-number-for-deca

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值