计算关于高阶张量的 Hessian 矩阵(仅对角线部分)

问题描述 投票:0回答:1

我想计算我指定的损失相对于 vgg16 conv4_3 层内核(3x3x512x512 维矩阵)的每个特征图的一阶和二阶导数(Hessian 的对角部分)。我知道如何计算导数(如果它尊重低阶导数)如何计算 Tensorflow 中的所有二阶导数(仅 Hessian 矩阵的对角线)? 然而,当转到更高级别时,我彻底迷失了。

# 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
,每个暗淡代表[Kx,Ky,in_channels,out_channels],因此
Grad
应该是
Loss
相对于每个特征图中每个元素(像素)的偏导数。
Hessian
是二阶导数。

但是,

Hessian
计算所有的导数,我怎样才能只计算对角线部分呢?我应该使用
tf.diag_part()
吗?

tensorflow mathematical-optimization derivative hessian-matrix
1个回答
4
投票

tf.compute_gradients
计算标量的导数。如果提供的数量不是标量,它会通过对示例中发生的组件求和来将其转换为标量

要计算完整的 Hessian 矩阵,您需要

n
调用
tf.gradients
,示例为 here。如果您只想要对角线部分,则修改对
i
的第
tf.gradients
调用的参数,以区分第
i
th 变量,而不是所有变量。

© www.soinside.com 2019 - 2024. All rights reserved.