2017-10-01 3 views
0

Question rapide comme je suis un peu confus ici.Tensorflow: quoi exactement tf.gradients() retourner

Disons que nous avons un graphique simple:

a = tf.Variable(tf.truncated_normal(shape=[200, 1], mean=0., stddev=.5)) 
b = tf.Variable(tf.truncated_normal(shape=[200, 100], mean=0., stddev=.5)) 
add = a+b 

add 
<tf.Tensor 'add:0' shape=(200, 100) dtype=float32> #shape is because of broadcasting 

J'ai un nœud qui prend en 2 tenseurs, et produit 1 tenseur en sortie. Passons maintenant à tf.gradients

tf.gradients(add, [a, b]) 
[<tf.Tensor 'gradients/add_grad/Reshape:0' shape=(200, 1) dtype=float32>, 
<tf.Tensor 'gradients/add_grad/Reshape_1:0' shape=(200, 100) dtype=float32>] 

Nous obtenons donc des gradients exactement sous la forme des tenseurs d'entrée. Mais pourquoi? Pas comme s'il y avait une seule métrique par rapport à laquelle nous pouvons prendre la dérivée partielle. Les gradients ne devraient-ils pas correspondre à chaque valeur unique des tenseurs d'entrée pour chaque valeur unique du tenseur de sortie, donnant ainsi un gradient de 200x1x200x100 pour l'entrée a? Ceci est juste un exemple simple où chaque élément du tenseur de sortie ne dépend que d'une valeur du tenseur b et d'une ligne du tenseur a. Cependant, si nous faisions quelque chose de plus compliqué, comme faire un flou gaussien sur un tenseur, alors les gradients devraient sûrement être plus gros que le tenseur d'entrée.

Qu'est-ce qui m'arrive ici?

Répondre

1

Par défaut, tf.gradients prend le gradient du scalaire obtenu en additionnant tous les éléments de tous les tenseurs passés à tf.gradients en tant que sorties.