TensorFlow中Dataset迭代器取出的张量ref()对比为False是什么原因?
现象原因解析
核心原因和tf.data迭代器没有关联,本质是Tensor的索引切片特性导致:
- 每次执行
el[0]索引操作时,TensorFlow都会生成一个全新的Python层面Tensor实例,哪怕多个切片实例指向的底层存储数据完全一致,它们也是相互独立的Tensor对象。你可以通过打印id(el[0]) == id(el[0])验证,返回结果同样为False,证明两次el[0]返回的不是同一个实例。 tf.Tensor.ref()返回的引用是和当前Tensor实例绑定的,不同的Tensor实例会生成不同的ref对象,因此两次独立调用el[0].ref(),本质是两个独立的切片Tensor各自生成ref,对比自然返回False。
第二个示例返回True的原因非常简单:
你先把第一个el[0]生成的Tensor对应的ref存到了a_ref,调用a_ref.deref()返回的就是最初生成的那个切片Tensor实例,对同一个实例再次调用ref()生成的引用肯定和原有引用相等,所以对比结果为True。你也可以通过下面的代码验证这个逻辑,运行后会返回你预期的True:
a = el[0] a.ref() == a.ref()
额外注意:
ref()的作用是标识同一个Tensor实例,不能用来判断两个不同Tensor实例的数值是否相等,如果要校验张量数值是否一致,应该使用tf.reduce_all(tf.equal(t1, t2))之类的数值比较API。
内容的提问来源于stack exchange,提问作者Malcolm
相关产品推荐
相关产品推荐

