0

Je voudrais calculer le premier et le second dérivés (partie diagonale de hessois) de ma perte déterminée par rapport à chaque carte de caractéristique d'un vgg16 le noyau de la couche conv4_3 qui est une matrice dimensionnelle 3x3x512x512. Je sais comment calculer des dérivés si elle est respectée à un rang inférieur selon How to compute all second derivatives (only the diagonal of the Hessian matrix) in Tensorflow? Cependant, quand il se tourne vers un rang supérieur, je me suis perdu complet.tensorflow: Compute Hessien (seule partie diagonale) par rapport à un tenseur de rang élevé

# 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>] 

S'il vous plaît aidez-moi à vérifier mes compréhensions. Ainsi, pour conv4_3_kernel, chaque cage obscure pour [Kx, Ky, in_channels, out_channels], de sorte que Grad devrait être dérivées partielles de Loss par rapport à l'élément (pixel) dans l'chacune des cartes de fonction. Et Hessian est la deuxième dérivés.

Mais, Hessian calcule tous les dérivés, comment puis-je calculer que seule la partie diagonale? devrais-je utiliser tf.diag_part()? Merci d'avance!

Répondre

4

tf.compute_gradients calcule dérivée d'une grandeur scalaire. Si la quantité fournie est pas scalaire, il transforme en scalaire en additionnant les composants qui est ce qui se passe dans votre exemple

Pour calculer hessois dont vous aurez besoin n appels à tf.gradients, L'exemple est here. Si vous voulez juste la partie diagonale, puis modifier les arguments à i appelez tf.gradients pour différencier par rapport à i th variable, plutôt que toutes les variables.

+0

Merci Yaroslav! – Xer

+0

J'ai utilisé 'tf.gradients' pour calculer des dérivées, mais il donne toujours' None' à chaque fois qu'il est différencié par rapport à une variable spécifiée. par exemple, 'Grad = tf.gradients (Loss, conv4_3_kernel)' puis 'Hessian0' = tf.gradients (Grad [..., 0], conv4_3_kernel [..., 0])' donne 'None' pour tous les 512 dims. Ai-je tort quelque part? – Xer

+0

De votre réponse dans [link] (http://stackoverflow.com/questions/38200982/how-to-compute-all-second-derivatives-only-the-diagonal-of-the-hessian-matrix), j'ai enfin réalisé mon problème était ma perte ne dépend pas de «tranche» op. J'ai donc besoin de reconstruire ma perte avec les variables tf.pack-ed. Merci beaucoup encore! – Xer