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 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))
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.
Sepotong puzzle yang hilang untuk pengguna Tensorflow pemula: Tensorflow memiliki beberapa mekanisme penanganan flag perintah baris bawaan. Anda dapat mendefinisikan flag Anda seperti tf.flags.DEFINE_integer('batch_size', 128, 'Number of images to process in a batch.')dan kemudian jika Anda menggunakannya tf.app.run()akan mengatur semuanya sehingga Anda dapat secara global mengakses nilai-nilai flag yang Anda tetapkan, seperti tf.flags.FLAGS.batch_sizedari mana pun Anda membutuhkannya dalam kode Anda.
isarandi
1
Ini adalah jawaban yang lebih baik dari tiga (saat ini) menurut saya. Ini menjelaskan "Bagaimana cara kerja tf.app.run ()", sedangkan dua jawaban lainnya hanya mengatakan apa fungsinya.
apa artinya "menangani penguraian bendera"? Mungkin Anda bisa menambahkan tautan untuk memberi tahu pemula apa artinya itu?
Pinocchio
4
Itu mem-parsing argumen baris perintah yang disediakan untuk program menggunakan paket flags. (yang menggunakan pustaka 'argparse' standar di bawah sampul, dengan beberapa bungkus). Itu ditautkan dari kode yang saya tautkan dalam jawaban saya.
dga
1
Di app.py, apa artinya main = main or sys.modules['__main__'].maindan sys.exit(main(sys.argv[:1] + flags_passthrough))artinya?
hAcKnRoCk
3
ini terasa aneh bagi saya, mengapa membungkus fungsi utama dalam semua itu jika Anda bisa langsung menyebutnya main()?
Charlie Parker
2
hAcKnRoCk: jika tidak ada main di file, ia malah menggunakan apa pun yang ada di sys.modules [' main '] .main. Sys.exit berarti menjalankan perintah utama yang ditemukan menggunakan args dan flag yang dilewati, dan untuk keluar dengan nilai pengembalian main. @CharlieParker - untuk kompatibilitas dengan pustaka aplikasi python Google yang ada seperti gflags dan google-apputils. Lihat, misalnya, github.com/google/google-apputils
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)
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.
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.abseil
TF yang harus diserap abseil.io/docs/python/guides/flagsIni hanya pembungkus yang sangat cepat yang menangani penguraian bendera dan kemudian dikirim ke utama Anda sendiri. Lihat kodenya .
sumber
main = main or sys.modules['__main__'].main
dansys.exit(main(sys.argv[:1] + flags_passthrough))
artinya?main()
?Tidak ada yang istimewa di
tf.app
. Ini hanya skrip titik masuk umum , yangIni tidak ada hubungannya dengan jaringan saraf dan hanya memanggil fungsi utama, melewati argumen apa pun untuk itu.
sumber
Dalam istilah sederhana, pekerjaan
tf.app.run()
adalah untuk pertama set bendera global untuk penggunaan nanti seperti: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)
Setelah menguraikan argumen menggunakan
argparse
, dengantf.app.run()
Anda menjalankan fungsi "main" yang didefinisikan seperti:Jadi, setelah mengatur flag untuk penggunaan global,
tf.app.run()
jalankan sajamain
fungsi yang Anda berikanargv
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.sumber
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.
sumber
2,0 Kompatibel Jawaban : Jika Anda ingin menggunakan
tf.app.run()
dalamTensorflow 2.0
, kita harus menggunakan perintah,tf.compat.v1.app.run()
atau Anda dapat menggunakantf_upgrade_v2
untuk mengonversi1.x
kode menjadi2.0
.sumber