问题
The difference between the two is muddled in my head, notwithstanding the nuances of what is eager and what isn't. From what I gather, the @tf.function decorator has two benefits in that
- it converts functions into TensorFlow graphs for performance, and
- allows for a more Pythonic style of coding by interpreting many (but not all) common-place Python operations into tensor operations, e.g.
ifintotf.cond, etc.
From the definition of tf.py_function, it seems that it does just #2 above. Hence, why bother with tf.py_function when tf.function does the job with a performance improvement to boot and without the inability of the former to serialize?
回答1:
They do indeed start to resemble each other as they are improved, so it is useful to see where they come from. Initially, the difference was that:
@tf.functionturns python code into a series of TensorFlow graph nodes.tf.py_functionwraps an existing python function into a single graph node.
This means that tf.function requires your code to be relatively simple while tf.py_function can handle any python code, no matter how complex.
While this line is indeed blurring, with tf.py_function doing more interpretation and tf.function accepting lot's of complex python commands, the general rule stays the same:
- If you have relatively simple logic in your python code, use
tf.function. - When you use complex code, like large external libraries (e.g. connecting to a database, or loading a large external NLP package) use
tf.py_function.
来源:https://stackoverflow.com/questions/61564748/what-is-the-difference-in-purpose-between-tf-py-function-and-tf-function