为何tf.Variable用[0][0].assign报错,[0,0].assign却成功?
问题原因解析
核心差异:索引返回的EagerTensor本质不同
虽然两种索引方式返回的类型都是EagerTensor,但它们和原tf.Variable的关联关系完全不同:
changeAbleTensor[0][0]是两次独立索引操作:- 第一次
changeAbleTensor[0]会生成一个新的EagerTensor,它是原变量第一行的副本视图,已经和原变量的可更新绑定关系断开。 - 第二次对这个副本视图做
[0]索引,得到的是脱离原变量的普通张量——普通张量是不可变的,自然没有assign方法(assign是tf.Variable专属的可更新接口)。
- 第一次
changeAbleTensor[0,0]是一次多维切片索引:
这种写法直接对原tf.Variable做多维定位,返回的EagerTensor是原变量对应位置的绑定视图,它依然保留着和原变量的关联,因此可以调用assign方法修改原变量的对应值。
直观验证方法
可以通过打印内部关联标识区分两者:
import tensorflow as tf changeAbleTensor = tf.Variable([[10,9],[9,8]]) # 两次索引的结果 t1 = changeAbleTensor[0][0] # 一次多维索引的结果 t2 = changeAbleTensor[0,0] print(t1._handle) # 报错,普通张量无_handle属性 print(t2._handle) # 输出与原变量绑定的句柄
内容的提问来源于stack exchange,提问作者Muhammad Farras Ma'ruf
相关产品推荐
相关产品推荐

