Bagaimana cara kerja tf.app.run ()?

148

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() 
Anurag Ranjan
sumber

Jawaban:

134
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:

  1. Anda tidak memiliki mainfungsi di my_model.pyKemudian Anda harus menelepontf.app.run(my_main_running_function)

  2. 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.

lei du
sumber
67
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.
Thomas Fauskanger
Sepertinya bendera ditangani oleh abseilTF yang harus diserap abseil.io/docs/python/guides/flags
CpILL
75

Ini hanya pembungkus yang sangat cepat yang menangani penguraian bendera dan kemudian dikirim ke utama Anda sendiri. Lihat kodenya .

dga
sumber
12
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
dga
8

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.

Salvador Dali
sumber
5

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.

kmario23
sumber
2

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.

Mudit Jain
sumber
1

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.

Dukungan Tensorflow
sumber