Python 张量流只区分向量的元素
我想了解张量流微分在向量元素上的行为。 这是我的密码Python 张量流只区分向量的元素,python,tensorflow,Python,Tensorflow,我想了解张量流微分在向量元素上的行为。 这是我的密码 w=tf.Variable([[1.0,2.3],[4.5,6.7]],dtype=tf.float32) x=tf.constant([[1.2],[2.3]],dtype=tf.float32) with tf.GradientTape() as tape: y=tf.matmul(w,x) d=tape.gradient(y[0],w) y是2x1张量。当区分y[0]w.r.t w即y的单个元素时,我得到None。 d这里没有
w=tf.Variable([[1.0,2.3],[4.5,6.7]],dtype=tf.float32)
x=tf.constant([[1.2],[2.3]],dtype=tf.float32)
with tf.GradientTape() as tape:
y=tf.matmul(w,x)
d=tape.gradient(y[0],w)
y是2x1张量。当区分y[0]w.r.t w即y的单个元素时,我得到None。
d这里没有。
我不能理解这种行为y[0]取决于w,为什么我仍然得到None?你没有得到,因为访问张量的子元素实际上是一个需要在
tf.GradientTape
上下文中完成的操作。否则,磁带不知道导致该变量的历史记录
您的示例类似于这样做:
w=tf.Variable([[1.0,2.3],[4.5,6.7]],dtype=tf.float32)
x=tf.constant([[1.2],[2.3]],dtype=tf.float32)
with tf.GradientTape() as tape:
y=tf.matmul(w,x)
d=tape.gradient(y+2,w)
磁带没有观察操作y+2
,因此无法计算梯度
要仅获取一个元素的渐变,需要在磁带的上下文中显式获取该元素:
w=tf.Variable([[1.0,2.3],[4.5,6.7]],dtype=tf.float32)
x=tf.constant([[1.2],[2.3]],dtype=tf.float32)
with tf.GradientTape() as tape:
y=tf.matmul(w,x)
y0 = y[0]
d=tape.gradient(y0,w)
然后,得到y[0]
w.r.tw
的梯度:
>>> d
<tf.Tensor: shape=(2, 2), dtype=float32, numpy=
array([[1.2, 2.3],
[0. , 0. ]], dtype=float32)>
>>d