提问者:小点点

Tensorflow梯度磁带通过给出1乘1的值而不是成批给出的值来计算梯度


当我用下面的方式计算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中做所有的计算?


共1个答案

匿名用户

像这样?

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