Tensorflow:关于高阶张量计算 Hessian 矩阵(仅对角线部分)
Tensorflow: Compute Hessian matrix (only diagonal part) with respect to a high rank tensor
我想针对 vgg16 conv4_3 层内核(3x3x512x512 维矩阵)的每个特征图计算指定损失的一阶和二阶导数(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
,每个 dim 代表 [Kx, Ky, in_channels, out_channels],因此 Grad
应该是 Loss
的偏导数每个特征图中的每个元素(像素)。而Hessian
是二阶导数。
但是,Hessian
计算了所有的导数,我怎么只计算对角线部分呢?我应该使用 tf.diag_part()
吗?非常感谢!
tf.compute_gradients
计算标量的导数。如果提供的数量不是标量,它会通过对您的示例中发生的组件求和将其变成标量
要计算完整的 Hessian,您需要 n
调用 tf.gradients
,示例是 here。如果您只想要对角线部分,则修改对 tf.gradients
的第 i
次调用的参数,以区分第 i
个变量,而不是所有变量。
我想针对 vgg16 conv4_3 层内核(3x3x512x512 维矩阵)的每个特征图计算指定损失的一阶和二阶导数(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
,每个 dim 代表 [Kx, Ky, in_channels, out_channels],因此 Grad
应该是 Loss
的偏导数每个特征图中的每个元素(像素)。而Hessian
是二阶导数。
但是,Hessian
计算了所有的导数,我怎么只计算对角线部分呢?我应该使用 tf.diag_part()
吗?非常感谢!
tf.compute_gradients
计算标量的导数。如果提供的数量不是标量,它会通过对您的示例中发生的组件求和将其变成标量
要计算完整的 Hessian,您需要 n
调用 tf.gradients
,示例是 here。如果您只想要对角线部分,则修改对 tf.gradients
的第 i
次调用的参数,以区分第 i
个变量,而不是所有变量。