当我用下面的方式计算x^2的梯度时。
x = tf.convert_to_tensor(np.linspace(-5,5,10))
y=np.zeros(10)
with tf.GradientTape() as g:
g.watch(x)
y=x*x
y = tf.convert_to_tensor(y)
x=tf.convert_to_tensor(x)
dy_dx = g.gradient(y, x)
print(dy_dx)
我得到了预期的梯度值。 TF.tensor([-10.-8.-6.-4.-2.0.2.4.6.8.10.],shape=(11,),dtype=float64)
相反,我想把计算打散,不使用张量乘法。
天真的我试过了
x=tf.Variable(-5.0)
y=tf.Variable(0.0)
with tf.GradientTape(persistent=True) as g:
g.watch(x)
for i in range(10):
y.assign(x*x)
x.assign_add(1.0)
dy_dx = g.gradient(y, x)
print(dy_dx)
但这只返回[无]。
有没有一种方法将计算分开,使用for循环,而不是像第一个例子那样在1 go中做所有的计算?
像这样?
x = tf.convert_to_tensor(np.linspace(-5,5,10))
y=np.zeros(10)
for inp, out in zip(x, y):
with tf.GradientTape() as g:
g.watch(inp)
out=inp*inp
out = tf.convert_to_tensor(out)
inp=tf.convert_to_tensor(inp)
dy_dx = g.gradient(out, inp)
print(dy_dx.numpy())
-10.0
-7.777777777777778
-5.555555555555555
-3.333333333333333
-1.1111111111111107
1.1111111111111107
3.333333333333334
5.555555555555557
7.777777777777779
10.0