0

我想计算我指定的损失的一阶和二阶导数(Hessian 的对角线部分)关于 vgg16 conv4_3 层的内核的每个特征图,它是一个 3x3x512x512 维矩阵。如果根据如何计算 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,每个 dim 代表 [Kx, Ky, in_channels, out_channels],因此Grad应该是Loss每个特征图中每个元素(像素)的偏导数。并且Hessian是二阶导数。

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

4

1 回答 1

4

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

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

于 2016-10-18T18:30:34.510 回答