Bagaimana cara tf.app.run()kerja di Tensorflow menerjemahkan demo?
Di tensorflow/models/rnn/translate/translate.py, ada panggilan ke tf.app.run(). Bagaimana cara penanganannya?
if __name__ == "__main__":
tf.app.run()
Bagaimana cara tf.app.run()kerja di Tensorflow menerjemahkan demo?
Di tensorflow/models/rnn/translate/translate.py, ada panggilan ke tf.app.run(). Bagaimana cara penanganannya?
if __name__ == "__main__":
tf.app.run()
Jawaban:
if __name__ == "__main__":
berarti file saat ini dieksekusi di bawah shell daripada diimpor sebagai modul.
tf.app.run()
Seperti yang Anda lihat melalui file 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))
Mari kita pecahkan baris demi baris:
flags_passthrough = f._parse_flags(args=args)
Ini memastikan bahwa argumen yang Anda lewati baris perintah valid, mis.
python my_model.py --data_dir='...' --max_iteration=10000Sebenarnya, fitur ini diimplementasikan berdasarkan argparsemodul standar python .
main = main or sys.modules['__main__'].main
Yang pertama maindi sisi kanan =adalah argumen pertama dari fungsi saat ini run(main=None, argv=None)
. Sementara itu sys.modules['__main__']berarti file yang sedang berjalan (mis my_model.py.).
Jadi ada dua kasus:
Anda tidak memiliki mainfungsi di my_model.pyKemudian Anda harus menelepontf.app.run(my_main_running_function)
Anda memiliki mainfungsi dalam my_model.py. (Ini sebagian besar terjadi.)
Baris terakhir:
sys.exit(main(sys.argv[:1] + flags_passthrough))
memastikan fungsi main(argv)atau Anda my_main_running_function(argv)dipanggil dengan argumen parsing dengan benar.
abseilTF yang harus diserap abseil.io/docs/python/guides/flags
Ini hanya pembungkus yang sangat cepat yang menangani penguraian bendera dan kemudian dikirim ke utama Anda sendiri. Lihat kodenya .
main = main or sys.modules['__main__'].maindan sys.exit(main(sys.argv[:1] + flags_passthrough))artinya?
main()?
Tidak ada yang istimewa di tf.app. Ini hanya skrip titik masuk umum , yang
Menjalankan program dengan fungsi 'utama' opsional dan daftar 'argv'.
Ini tidak ada hubungannya dengan jaringan saraf dan hanya memanggil fungsi utama, melewati argumen apa pun untuk itu.
Dalam istilah sederhana, pekerjaan tf.app.run()adalah untuk pertama set bendera global untuk penggunaan nanti seperti:
from tensorflow.python.platform import flags
f = flags.FLAGS
dan kemudian jalankan fungsi utama kustom Anda dengan serangkaian argumen.
Untuk misalnya dalam basis kode TensorFlow NMT , titik masuk pertama untuk pelaksanaan program untuk pelatihan / inferensi dimulai pada titik ini (lihat kode di bawah ini)
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)
Setelah menguraikan argumen menggunakan argparse, dengan tf.app.run()Anda menjalankan fungsi "main" yang didefinisikan seperti:
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)
Jadi, setelah mengatur flag untuk penggunaan global, tf.app.run()jalankan saja mainfungsi yang Anda berikan argvsebagai parameternya.
PS: Seperti jawaban Salvador Dali mengatakan, itu hanya praktik rekayasa perangkat lunak yang baik, saya kira, meskipun saya tidak yakin apakah TensorFlow melakukan setiap mainfungsi yang dioptimalkan daripada yang dijalankan menggunakan CPython normal.
Kode Google sangat tergantung pada flag global yang diakses di library / binaries / python scripts dan tf.app.run () mem-parsing flag-flag itu untuk membuat status global dalam variabel FLAGs (atau yang serupa) kemudian memanggil python main ( ) seperti seharusnya.
Jika mereka tidak memiliki panggilan ini ke tf.app.run (), maka pengguna mungkin lupa untuk melakukan penguraian FLAG, yang mengarah ke pustaka / binari / skrip ini yang tidak memiliki akses ke FLAG yang mereka butuhkan.
2,0 Kompatibel Jawaban : Jika Anda ingin menggunakan tf.app.run()dalam Tensorflow 2.0, kita harus menggunakan perintah,
tf.compat.v1.app.run()atau Anda dapat menggunakan tf_upgrade_v2untuk mengonversi 1.xkode menjadi 2.0.
tf.flags.DEFINE_integer('batch_size', 128, 'Number of images to process in a batch.')dan kemudian jika Anda menggunakannyatf.app.run()akan mengatur semuanya sehingga Anda dapat secara global mengakses nilai-nilai flag yang Anda tetapkan, sepertitf.flags.FLAGS.batch_sizedari mana pun Anda membutuhkannya dalam kode Anda.