Tensorflow:相对于高秩张量计算Hessian矩阵(仅对角线部分)

时间:2016-10-18 06:37:37

标签: tensorflow mathematical-optimization derivative hessian-matrix

我想计算我指定的Loss的第一个和第二个导数(Hessian的对角线部分)相对于vgg16 conv4_3层内核的每个特征映射,它是一个3x3x512x512维矩阵。根据{{​​3}}我知道如何根据低等级衍生物来计算衍生物 然而,当它转向更高级别时,我完成了丢失。

# Inspecting variables under Ipython notebook
In  : Loss 
Out : <tf.Tensor 'local/total_losses:0' shape=() dtype=float32>

In  : conv4_3_kernel.get_shape() 
Out : TensorShape([Dimension(3), Dimension(3), Dimension(512), Dimension(512)])

## Compute derivatives
Grad = tf.compute_gradients(Loss, conv4_3_kernel)
Hessian = tf.compute_gradients(Grad, conv4_3_kernel)

In  : Grad 
Out : [<tf.Tensor 'gradients/vgg/conv4_3/Conv2D_grad/Conv2DBackpropFilter:0' shape=(3, 3, 512, 512) dtype=float32>]

In  : Hessian 
Out : [<tf.Tensor 'gradients_2/vgg/conv4_3/Conv2D_grad/Conv2DBackpropFilter:0' shape=(3, 3, 512, 512) dtype=float32>]

请帮助我查看我的理解。因此,对于conv4_3_kernel,每个dim代表[Kx,Ky,in_channels,out_channels],因此Grad应该是Loss相对于每个元素(像素)的偏导数。特征地图。 Hessian是第二个衍生物。

但是,Hessian计算所有导数,我怎样才能只计算对角线部分?我应该使用tf.diag_part()吗?非常感谢提前!

1 个答案:

答案 0 :(得分:4)

tf.compute_gradients计算标量的导数。如果提供的数量不是标量,则通过总结组件来将其变为标量,这是您示例中发生的事情

要计算完整的Hessian,您需要n调用tf.gradients,例如here。如果您只想要对角线部分,则修改i调用tf.gradients的参数,以区分i变量,而不是所有变量。