Tensorflow dense gradient explication?
J'ai récemment mis en œuvre un modèle et quand je l'ai couru, j'ai reçu cet avertissement:
UserWarning: Converting sparse IndexedSlices to a dense Tensor of unknown shape.
This may consume a large amount of memory.
"Converting sparse IndexedSlices to a dense Tensor of unknown shape. "
Avec certains paramètres (intégration dimensionnalités) tout à coup, le modèle est ridiculement lent.
- Ce qui fait de cet avertissement, cela implique? Il semble que quelque chose que j'ai fait a causé tous les dégradés pour être dense et donc backprop fait dense de la matrice des calculs
- Si c'est qu'il y a un problème avec le modèle qui est à l'origine de ce, comment puis-je identifier et de résoudre ce problème?
Vous devez vous connecter pour publier un commentaire.
Ce message d'avertissement est affiché lorsque éparse
tf.IndexedSlices
objet est implicitement converti en un densetf.Tenseur
. Cela se produit généralement lorsque l'un op (généralementtf.gather()
) backpropagates éparse dégradé, mais l'op qui le reçoit n'a pas spécialisé dégradé la fonction qui peut gérer éparses dégradés. En conséquence, TensorFlow automatiquement densifie latf.IndexedSlices
, ce qui peut avoir un effet dévastateur sur les performances si le tenseur est grande.Pour résoudre ce problème, vous devriez essayer de faire en sorte que le
params
d'entrée àtf.gather()
(ou leparams
entrées àtf.nn.embedding_lookup()
) est untf.Variable
. Les Variables peuvent recevoir du peu de mises à jour directement, donc aucune conversion n'est nécessaire. Bien quetf.gather()
(ettf.nn.embedding_lookup()
) accepter l'arbitraire tenseurs comme entrées, ce qui peut conduire à une plus compliqué les graphique, résultant de la conversion implicite.tf.gather()
outf.nn.embedding_lookup()
invocations, trouver le tenseurt
qui est leparams
(premier argument) soit de ceux de la fpo, et imprimert.op
. En général, vous obtiendrez les meilleures performances sit
est untf.Variable
, mais certains ops commetf.concat()
ont des spécialisations qui font les gradients efficace.boolean_mask
avec unreshape
. Il est utilisé dans un calcul de la perte de la mesure sur le graphe après plusieursreshape
s,pack
s,tile
s,expand_dim
s,squeeze
s,batch_matmul
s, etc. Est-il un moyen pour identifier les op(s) ne peut pas accepter éparses dégradés?tf.gather
est unreshape
de sortie. Comment puis-je convertirVariable
? Merci.embedding_lookup
, c'est bon pour avoirtf.placeholder
comme param ? Je ne suis pas sûr si elles remplissent le rôle detf.Variable
boolean_mask
mais c'est juste d'être nourris de variables normales--rien n'est modifié.Dense Tenseur peut être considéré comme un standard de python tableau. Un éparses peut être considérée comme un ensemble d'indices et de valeurs par exemple
Donc, comme vous pouvez le voir si vous avez beaucoup de vide entrées d'un tableau fragmenté sera beaucoup plus efficace qu'une denses d'une. Mais si toutes les entrées sont remplies, denses est de loin plus efficace. Dans votre cas, quelque part dans le tenseur du graphe de flot de éparse tableau est converti en un dense indéterminée taille. L'avertissement est juste dire qu'il est possible que vous pouvez perdre beaucoup de mémoire comme ça. Mais il ne pourrait pas être un problème si le tableau fragmenté n'est pas trop grand/déjà assez dense.
Si vous souhaitez en faire le diagnostic, je vous conseille de nommage de vos différents tenseur des objets, alors il sera imprimé exactement quels sont ceux qui sont utilisés dans cette conversion et vous pouvez travailler sur ce que vous pourriez être en mesure de s'adapter à l'enlever.
Tout à fait d'accord avec la réponse de
mrry
.En fait, je vais poster une autre solution pour ce problème.
Vous pouvez utiliser
tf.dynamic_partition()
au lieu detf.gather()
pour éliminer l'avertissement.L'exemple de code ci-dessous:
Espère que cela pourra vous aider.
tf.dynamic_partition
produit dense dégradés?