0

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()을 사용해야합니까? 미리 많은 감사드립니다!

답변

4

tf.compute_gradients 스칼라 수량의 미분을 계산합니다. 제공되는 양이 스칼라가 아닌 경우,이 예제는 here, 당신은 tf.gradients-n 호출을 필요로 전체 헤 시안을 계산하려면

당신의 예에서 일어나고있는 어떤 구성 요소를 합산하여 스칼라로 바뀝니다. 대각선 부분 만 원하면 i 인수를 수정하여 tf.gradients을 호출하여 모든 변수가 아닌 i 번째 변수를 구별합니다.

+0

감사합니다. 야로 슬라브! – Xer

+0

'tf.gradients'를 사용하여 파생 상품을 계산했지만 지정된 변수를 기준으로 할 때마다 항상 '없음'을 제공합니다. 예를 들어'Grad = tf.gradients (Loss, conv4_3_kernel)'이면'Hessian0' = tf.gradients (Grad [..., 0], conv4_3_kernel [..., 0])'는 모든 512 희미하다. 내가 어딘가 틀렸어? – Xer

+0

[link] (http://stackoverflow.com/questions/38200982/how-to-compute-all-second-derivatives-only-the-diagonal-of-the-hessian-matrix)에서 귀하의 답변을 통해, 마침내 나는 내 문제는 내 손실이'슬라이스'운영에 의존하지 않는다는 것을 깨달았다. 그래서 tf.pack-ed 변수로 손실을 재구성해야합니다. 다시 한 번 감사드립니다! – Xer