vgg16의 각 기능 맵과 관련하여 지정된 손실의 첫 번째 및 두 번째 미분 (헤 시안의 대각선 부분)을 계산하고 싶습니다. conv4_3 레이어의 커널은 3x3x512x512 크기의 매트릭스입니다. How to compute all second derivatives (only the diagonal of the Hessian matrix) in Tensorflow? 에 따르면 낮은 순위의 사람들에게 존중한다면 파생 상품을 계산하는 방법을 알고 있습니다. 그러나 상위에 올라서면 나는 완전히 잃어버린 것입니다.Tensorflow : 높은 순위의 텐서에 대한 헤 시안 행렬 (대각선 부분 만)
# 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()
을 사용해야합니까? 미리 많은 감사드립니다!
감사합니다. 야로 슬라브! – Xer
'tf.gradients'를 사용하여 파생 상품을 계산했지만 지정된 변수를 기준으로 할 때마다 항상 '없음'을 제공합니다. 예를 들어'Grad = tf.gradients (Loss, conv4_3_kernel)'이면'Hessian0' = tf.gradients (Grad [..., 0], conv4_3_kernel [..., 0])'는 모든 512 희미하다. 내가 어딘가 틀렸어? – Xer
[link] (http://stackoverflow.com/questions/38200982/how-to-compute-all-second-derivatives-only-the-diagonal-of-the-hessian-matrix)에서 귀하의 답변을 통해, 마침내 나는 내 문제는 내 손실이'슬라이스'운영에 의존하지 않는다는 것을 깨달았다. 그래서 tf.pack-ed 변수로 손실을 재구성해야합니다. 다시 한 번 감사드립니다! – Xer