我正在尝试计算一个函数(3*x^2+y^2)关于两列矩阵排序的两个变量的二阶导数,由于某种原因,一阶导数是可以的,但二阶导数是完全错误的
import tensorflow as tf
import numpy as np
x = np.array([[-6.0,1.0,2.0,4.0,]])
y = np.array([[-3.0,8.0,9.0,12.0,]])
xy = tf.convert_to_tensor(np.concatenate([x.T,y.T],axis=1))
with tf.GradientTape() as tape2:
tape2.watch(xy)
with tf.GradientTape() as tape:
tape.watch(xy)
f = 3 * xy[:, 0] ** 2 * xy[:, 1] + xy[:, 1] ** 2
df = tape.gradient(f, xy)
d2f = tape2.gradient(df, xy)
我得到的d2f
是:
<tf.Tensor: shape=(4, 2), dtype=float64, numpy=
array([[-54., -34.],
[ 54., 8.],
[ 66., 14.],
[ 96., 26.]])>
这显然是错误的,因为关于y的二阶导数是常数2。
我在这里做错了什么?
发布于 2020-11-29 19:37:55
我发现这样做的方法是:
with tf.GradientTape(persistent=True) as tape2:
tape2.watch(xy)
with tf.GradientTape() as tape:
tape.watch(xy)
f = 3 * xy[:, 0] ** 2 * xy[:, 1] + xy[:, 1] **2
df = tape.gradient(f,xy)
df_dx = df[:, 0]
df_dy = df[:, 1]
d2f_dx2 = tape2.gradient(df_dx,xy)[:,0]
d2f_dy2 = tape2.gradient(df_dy,xy)[:,1]
del tape2
https://stackoverflow.com/questions/65058600
复制