张量流只微分向量的元素



我要了解张量流微分在应用于向量元素时的行为。这是我的代码

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)

y2x1张量。当区分y[0]w.r.t w时,即y的单个元素,我得到d此处为"无"。我不能理解这种行为y[0]取决于w,为什么我仍然得到

您没有得到任何结果,因为访问张量的子元素实际上是一项需要在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:的梯度

>>> d
<tf.Tensor: shape=(2, 2), dtype=float32, numpy=
array([[1.2, 2.3],
[0. , 0. ]], dtype=float32)>

最新更新