Tensorflow 由tf.concat()返回的变量的hessian值为None

Tensorflow 由tf.concat()返回的变量的hessian值为None,tensorflow,Tensorflow,设x和y是长度为N的向量,z是函数z=fx,y。在Tensorflow v1.0.0中,tf.hessiansz,x和tf.hessiansz,y都返回一个N乘N的矩阵,这是我所期望的 但是,当我使用tf.concat将x和y连接成大小为2*N的向量p,并运行tf.hessianz,p时,它返回错误值error:None值不受支持 我理解这是因为在计算图x,y->z和x,y->p中,p和z之间没有梯度。为了避免这个问题,我可以先创建p,将它分割成x和y,但我必须修改大量代码。还有更优雅的方式吗

设x和y是长度为N的向量,z是函数z=fx,y。在Tensorflow v1.0.0中,tf.hessiansz,x和tf.hessiansz,y都返回一个N乘N的矩阵,这是我所期望的

但是,当我使用tf.concat将x和y连接成大小为2*N的向量p,并运行tf.hessianz,p时,它返回错误值error:None值不受支持

我理解这是因为在计算图x,y->z和x,y->p中,p和z之间没有梯度。为了避免这个问题,我可以先创建p,将它分割成x和y,但我必须修改大量代码。还有更优雅的方式吗

相关问题:


根据hessian的定义计算hessian

gxy = tf.gradients(z, [x, y])
gp = tf.concat([gxy[0], gxy[1]], axis=0)
hp = []
for i in range(2*N):
    hp.append(tf.gradients(gp[i], [x, y]))
因为tf.gradients计算dy/dx之和,所以在计算二阶偏导数时,应该将向量切片成标量,然后计算梯度。在tf1.0和python2上测试

gxy = tf.gradients(z, [x, y])
gp = tf.concat([gxy[0], gxy[1]], axis=0)
hp = []
for i in range(2*N):
    hp.append(tf.gradients(gp[i], [x, y]))