我想计算我指定的损失相对于 vgg16 conv4_3 层内核(3x3x512x512 维矩阵)的每个特征图的一阶和二阶导数(Hessian 的对角部分)。如果根据以下公式尊重低阶导数,我知道如何计算导数如何在Tensorflow中计算所有二阶导数(仅Hessian矩阵的对角线)? https://stackoverflow.com/questions/38200982/how-to-compute-all-second-derivatives-only-the-diagonal-of-the-hessian-matrix然而,当涉及到更高级别时,我彻底迷失了。
# 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
是二阶导数。
But, Hessian
计算所有导数,我怎样才能只计算对角线部分?我应该使用tf.diag_part()
?提前谢谢了!