¿Cómo tf.app.run()
funciona la demostración de traducción de Tensorflow?
En tensorflow/models/rnn/translate/translate.py
, hay una llamada a tf.app.run()
. ¿Cómo se está manejando?
if __name__ == "__main__":
tf.app.run()
¿Cómo tf.app.run()
funciona la demostración de traducción de Tensorflow?
En tensorflow/models/rnn/translate/translate.py
, hay una llamada a tf.app.run()
. ¿Cómo se está manejando?
if __name__ == "__main__":
tf.app.run()
Respuestas:
if __name__ == "__main__":
significa que el archivo actual se ejecuta bajo un shell en lugar de importarse como un módulo.
tf.app.run()
Como puedes ver a través del archivo app.py
def run(main=None, argv=None):
"""Runs the program with an optional 'main' function and 'argv' list."""
f = flags.FLAGS
# Extract the args from the optional `argv` list.
args = argv[1:] if argv else None
# Parse the known flags from that list, or from the command
# line otherwise.
# pylint: disable=protected-access
flags_passthrough = f._parse_flags(args=args)
# pylint: enable=protected-access
main = main or sys.modules['__main__'].main
# Call the main function, passing through any arguments
# to the final program.
sys.exit(main(sys.argv[:1] + flags_passthrough))
Vamos a romper línea por línea:
flags_passthrough = f._parse_flags(args=args)
Esto asegura que el argumento que pasa a través de la línea de comando es válido, por ejemplo
python my_model.py --data_dir='...' --max_iteration=10000
, en realidad, esta característica se implementa en base al argparse
módulo estándar de Python .
main = main or sys.modules['__main__'].main
El primero main
en el lado derecho de =
es el primer argumento de la función actual run(main=None, argv=None)
. Mientras que sys.modules['__main__']
significa el archivo actual en ejecución (por ejemplo my_model.py
).
Entonces hay dos casos:
No tienes una main
función en my_model.py
Entonces tienes que llamartf.app.run(my_main_running_function)
tienes una main
función en my_model.py
. (Este es principalmente el caso).
Última línea:
sys.exit(main(sys.argv[:1] + flags_passthrough))
garantiza que se llame a su función main(argv)
o my_main_running_function(argv)
con argumentos analizados correctamente.
abseil
cuales TF debe haber absorbido abseil.io/docs/python/guides/flags
Es solo un contenedor muy rápido que maneja el análisis de banderas y luego se envía a su propio main. Mira el código .
main = main or sys.modules['__main__'].main
y qué sys.exit(main(sys.argv[:1] + flags_passthrough))
significa?
main()
?
No hay nada especial en tf.app
. Esto es solo un script de punto de entrada genérico , que
Ejecuta el programa con una función opcional 'main' y una lista 'argv'.
No tiene nada que ver con las redes neuronales y solo llama a la función principal, pasando por cualquier argumento.
En términos simples, el trabajo de tf.app.run()
es establecer primero las banderas globales para su uso posterior como:
from tensorflow.python.platform import flags
f = flags.FLAGS
y luego ejecuta tu función principal personalizada con un conjunto de argumentos.
Por ejemplo, en la base de código NMT de TensorFlow , el primer punto de entrada para la ejecución del programa de capacitación / inferencia comienza en este punto (ver el código a continuación)
if __name__ == "__main__":
nmt_parser = argparse.ArgumentParser()
add_arguments(nmt_parser)
FLAGS, unparsed = nmt_parser.parse_known_args()
tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)
Después de analizar los argumentos usando argparse
, tf.app.run()
ejecuta la función "main" que se define como:
def main(unused_argv):
default_hparams = create_hparams(FLAGS)
train_fn = train.train
inference_fn = inference.inference
run_main(FLAGS, default_hparams, train_fn, inference_fn)
Entonces, después de configurar las banderas para uso global, tf.app.run()
simplemente ejecuta esa main
función que le pasa argv
como parámetros.
PD: Supongo que, como dice la respuesta de Salvador Dalí , es solo una buena práctica de ingeniería de software, aunque no estoy seguro de si TensorFlow realiza alguna ejecución optimizada de la main
función de la que se realizó utilizando CPython normal.
El código de Google depende en gran medida de que las banderas globales estén accediendo en bibliotecas / binarios / scripts de python, por lo que tf.app.run () analiza esas banderas para crear un estado global en la variable FLAGs (o algo similar) y luego llama a python main ( ) como debería.
Si no tenían esta llamada a tf.app.run (), los usuarios podrían olvidarse de analizar los FLAG, lo que llevaría a que estas bibliotecas / binarios / scripts no tuvieran acceso a los FLAG que necesitan.
2.0 Respuesta Compatible : Si desea utilizar tf.app.run()
en Tensorflow 2.0
, debemos utilizar el comando,
tf.compat.v1.app.run()
o puede usar tf_upgrade_v2
para convertir 1.x
código a 2.0
.
tf.flags.DEFINE_integer('batch_size', 128, 'Number of images to process in a batch.')
y luego, si lo usatf.app.run()
, configurará las cosas para que pueda acceder globalmente a los valores pasados de los indicadores que definió, comotf.flags.FLAGS.batch_size
desde donde lo necesite en su código.