我要了解张量流微分在应用于向量元素时的行为。这是我的代码
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的单个元素,我得到无。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)>