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 elseNone# 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 argparsemódulo estándar de Python .
main = main or sys.modules['__main__'].main
El primero mainen 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 mainfunción en my_model.pyEntonces tienes que llamartf.app.run(my_main_running_function)
tienes una mainfunció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.
Una pieza faltante del rompecabezas para usuarios principiantes de Tensorflow: Tensorflow tiene algún mecanismo de manejo de banderas de línea de comando incorporado. Puede definir sus indicadores como tf.flags.DEFINE_integer('batch_size', 128, 'Number of images to process in a batch.')y luego, si lo usa tf.app.run(), configurará las cosas para que pueda acceder globalmente a los valores pasados de los indicadores que definió, como tf.flags.FLAGS.batch_sizedesde donde lo necesite en su código.
isarandi
1
Esta es la mejor respuesta de los tres (actuales) en mi opinión. Explica el "Cómo funciona tf.app.run ()", mientras que las otras dos respuestas solo dicen lo que hace.
¿Qué significa "maneja el análisis de la bandera"? ¿Quizás podría agregar un enlace para informar a los principiantes lo que eso significa?
Pinocho
44
Analiza los argumentos de la línea de comandos suministrados al programa utilizando el paquete flags. (que utiliza la biblioteca estándar 'argparse' debajo de las cubiertas, con algunos contenedores). Está vinculado desde el código al que lo hice en mi respuesta.
dga
1
En app.py, ¿qué significa main = main or sys.modules['__main__'].mainy qué sys.exit(main(sys.argv[:1] + flags_passthrough))significa?
HAcKnRoCk
3
esto me parece extraño, ¿por qué envolver la función principal en todo eso si puedes llamarlo directamente main()?
Charlie Parker el
2
hAcKnRoCk: si no hay main en el archivo, en su lugar usa lo que esté en sys.modules [' main '] .main. El sys.exit significa ejecutar el comando principal que se encuentra usando los args y cualquier indicador que haya pasado, y salir con el valor de retorno de main. @CharlieParker: para compatibilidad con las bibliotecas de aplicaciones Python existentes de Google, como gflags y google-apputils. Ver, por ejemplo, github.com/google/google-apputils
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)
Entonces, después de configurar las banderas para uso global, tf.app.run()simplemente ejecuta esa mainfunción que le pasa argvcomo 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 mainfunció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.
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.abseil
cuales TF debe haber absorbido abseil.io/docs/python/guides/flagsEs 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 .
fuente
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 , queNo tiene nada que ver con las redes neuronales y solo llama a la función principal, pasando por cualquier argumento.
fuente
En términos simples, el trabajo de
tf.app.run()
es establecer primero las banderas globales para su uso posterior como: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)
Después de analizar los argumentos usando
argparse
,tf.app.run()
ejecuta la función "main" que se define como:Entonces, después de configurar las banderas para uso global,
tf.app.run()
simplemente ejecuta esamain
función que le pasaargv
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.fuente
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.
fuente
2.0 Respuesta Compatible : Si desea utilizar
tf.app.run()
enTensorflow 2.0
, debemos utilizar el comando,tf.compat.v1.app.run()
o puede usartf_upgrade_v2
para convertir1.x
código a2.0
.fuente