-
Oui, "tracer" signifie exécuter une fonction Python et "enregistrer" ses opérations TensorFlow dans un graphique. Notez que le code tracé peut ne pas correspondre exactement au code Python écrit, si Autograph a effectué une transformation. Idéalement, le traçage n'est effectué qu'une seule fois, la première fois que la fonction est appelée, de sorte que les appels ultérieurs puissent utiliser directement le graphe tracé et sauvegarder l'exécution du code Python. Comme vous le dites, cependant, les appels ultérieurs peuvent nécessiter de retracer la fonction en fonction des arguments donnés, comme expliqué dans le lien que vous avez posté.
-
Vous pouvez appeler un @tf.function
à partir d'une fonction qui fonctionne en mode "eager", auquel cas, oui, elle "mélangera" en quelque sorte les deux modes. Mais si vous appelez une fonction non annotée depuis une fonction @tf.function
En d'autres termes, il n'est pas possible de revenir temporairement au mode eager/Python à partir d'un fichier de type @tf.function
. C'est la raison pour laquelle, à un moment donné, il a été suggéré que l'on ne devait annoter que les fonctions de niveau supérieur, car les fonctions de niveau inférieur seraient de toute façon "grapillées" également - bien qu'il ne soit pas si évident de savoir si l'on doit ou non annoter une fonction, cf. Dois-je utiliser @tf.function pour toutes les fonctions ? y cette discussion sur GitHub .
EDIT : Lorsque je dis "vous ne pouvez pas revenir temporairement au mode eager/Python à partir d'une @tf.function
", je veux dire @tf.function
ne peut pas sortir du mode "tracé". Bien sûr, en utilisant tf.numpy_function
o tf.py_function
vous pouvez avoir une fonction tracée qui utilise le mode eager/Python, qui sera encapsulée dans une opération faisant partie du graphe tracé.