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=10000
Sebenarnya, fitur ini diimplementasikan berdasarkan argparse
modul standar python .
main = main or sys.modules['__main__'].main
Yang pertama main
di 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 main
fungsi di my_model.py
Kemudian Anda harus menelepontf.app.run(my_main_running_function)
Anda memiliki main
fungsi 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.
abseil
TF 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__'].main
dan 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 main
fungsi yang Anda berikan argv
sebagai 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 main
fungsi 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_v2
untuk mengonversi 1.x
kode 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_size
dari mana pun Anda membutuhkannya dalam kode Anda.