TensorFlow报错InvalidArgumentError:输入与预期float_ref不兼容原因咨询
TensorFlow Assign Op 报错:InvalidArgumentError 原因解析
先看你这段触发报错的代码:
import tensorflow as tf x = tf.Variable(tf.constant(0.), name="x") with tf.Session() as s: val = s.run(x.assign(1)) print(val) # 1 val = s.run(x, {x: 2}) print(val) # 2 val = s.run(x.assign(1), {x: 0.}) # InvalidArgumentError
对应的报错信息:
tensorflow.python.framework.errors_impl.InvalidArgumentError: Input 0 of node Assign_1 was passed float from _arg_x_0_0:0 incompatible with expected float_ref.
报错产生的核心原因
我来给你拆解这个问题的本质:
x是一个tf.Variable,它本质是一个带可修改状态的引用型张量(类型为float_ref),和普通的tf.Tensor(不可修改的值型张量)是完全不同的东西。- 当你执行
s.run(x, {x: 2})时,你只是临时用普通张量2替换了x的读取节点输出,这一步没问题——因为读取操作只需要获取值,不管来源是变量还是普通张量。 - 但到了
s.run(x.assign(1), {x: 0.})就不一样了:x.assign(1)是一个赋值操作节点,它的设计目的是修改x这个变量的底层状态,所以它要求输入必须是x的引用(float_ref类型)。而你通过{x: 0.}把x替换成了一个普通的float张量(值型,没有可修改的引用),赋值操作找不到它需要修改的变量容器,自然就抛出了类型不兼容的错误。
简单来说:赋值操作必须作用于变量的引用,而你用普通张量临时替换了变量节点,导致赋值操作失去了可修改的目标。
内容的提问来源于stack exchange,提问作者reubenjohn
相关产品推荐
相关产品推荐

