令x和y为长度为N的向量,z为函数z = f(x,y)。在Tensorflow v1.0.0中,tf.hessians(z,x)和tf.hessians(z,y)都返回N×N矩阵,这正是我的预期。
但是,当我使用tf.concat将x和y连接成大小为2 * N的向量p,并运行tf.hessian(z,p)时,它返回错误“ValueError:None values not supported。” / p>
我理解这是因为在计算图x中,y - > z和x,y - > p,所以p和z之间没有梯度。为了避免这个问题,我可以先创建p,将其切成x和y,但我必须更改大量的代码。有更优雅的方式吗?
相关问题:Slice of a variable returns gradient None
import tensorflow as tf
import numpy as np
N = 2
A = tf.Variable(np.random.rand(N,N).astype(np.float32))
B = tf.Variable(np.random.rand(N,N).astype(np.float32))
x = tf.Variable(tf.random_normal([N]) )
y = tf.Variable(tf.random_normal([N]) )
#reshape to N by 1
x_1 = tf.reshape(x,[N,1])
y_1 = tf.reshape(y,[N,1])
#concat x and y to form a vector with length of 2*N
p = tf.concat([x,y],axis = 0)
#define the function
z = 0.5*tf.matmul(tf.matmul(tf.transpose(x_1), A), x_1) + 0.5*tf.matmul(tf.matmul(tf.transpose(y_1), B), y_1) + 100
#works , hx and hy are both N by N matrix
hx = tf.hessians(z,x)
hy = tf.hessians(z,y)
#this gives error "ValueError: None values not supported."
#expecting a matrix of size 2*N by 2*N
hp = tf.hessians(z,p)
答案 0 :(得分:1)
根据其定义计算粗麻布。
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上测试过。