Làm thế nào để tf.app.run () hoạt động?


148

Làm thế nào để tf.app.run()làm việc trong Tensorflow dịch demo?

Trong tensorflow/models/rnn/translate/translate.py, có một cuộc gọi đến tf.app.run(). Làm thế nào nó được xử lý?

if __name__ == "__main__":
    tf.app.run() 

Câu trả lời:


134
if __name__ == "__main__":

có nghĩa là tệp hiện tại được thực thi dưới vỏ thay vì được nhập dưới dạng mô-đun.

tf.app.run()

Như bạn có thể thấy thông qua các tập tin 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))

Hãy ngắt dòng theo từng dòng:

flags_passthrough = f._parse_flags(args=args)

Điều này đảm bảo rằng đối số bạn chuyển qua dòng lệnh là hợp lệ, ví dụ: python my_model.py --data_dir='...' --max_iteration=10000Trên thực tế, tính năng này được triển khai dựa trên argparsemô-đun chuẩn python .

main = main or sys.modules['__main__'].main

Đầu tiên mainở bên phải =là đối số đầu tiên của hàm hiện tại run(main=None, argv=None) . Trong khi sys.modules['__main__']có nghĩa là tập tin đang chạy hiện tại (ví dụ my_model.py).

Vì vậy, có hai trường hợp:

  1. Bạn không có mainchức năng trong my_model.pySau đó, bạn phải gọitf.app.run(my_main_running_function)

  2. bạn có một mainchức năng trong my_model.py. (Điều này chủ yếu là trường hợp.)

Dòng cuối cùng:

sys.exit(main(sys.argv[:1] + flags_passthrough))

đảm bảo hàm main(argv)hoặc my_main_running_function(argv)hàm của bạn được gọi với các đối số được phân tích cú pháp đúng cách.


67
Một mảnh ghép còn thiếu cho người dùng mới bắt đầu sử dụng Tensorflow: Tensorflow có một số cơ chế xử lý cờ dòng lệnh dựng sẵn. Bạn có thể xác định các cờ của mình như thế nào tf.flags.DEFINE_integer('batch_size', 128, 'Number of images to process in a batch.')và sau đó nếu bạn sử dụng tf.app.run()nó sẽ thiết lập mọi thứ để bạn có thể truy cập toàn cầu các giá trị được thông qua của các cờ bạn đã xác định, như tf.flags.FLAGS.batch_sizetừ bất cứ nơi nào bạn cần trong mã của mình.
isarandi

1
Đây là câu trả lời tốt hơn của ba (hiện tại) theo ý kiến ​​của tôi. Nó giải thích "Làm thế nào để tf.app.run () hoạt động", trong khi hai câu trả lời khác chỉ nói những gì nó làm.
Thomas Fauskanger

Có vẻ như các cờ được xử lý theo abseilđó TF phải hấp thụ abseil.io/docs/python/guides/flags
CpILL

75

Nó chỉ là một trình bao bọc rất nhanh để xử lý phân tích cờ và sau đó gửi đến chính của bạn. Xem .


12
"Xử lý phân tích cờ" nghĩa là gì? Có lẽ bạn có thể thêm một liên kết để thông báo cho người mới bắt đầu điều đó có nghĩa là gì?
Pinocchio

4
Nó phân tích cú pháp các đối số dòng lệnh được cung cấp cho chương trình bằng cách sử dụng gói cờ. (sử dụng thư viện 'argparse' tiêu chuẩn dưới bìa, với một số trình bao bọc). Nó được liên kết từ mã tôi liên kết đến trong câu trả lời của tôi.
DGA

1
Trong app.py, những gì làm main = main or sys.modules['__main__'].mainsys.exit(main(sys.argv[:1] + flags_passthrough))có ý nghĩa?
hAcKnRoCk

3
Điều này có vẻ kỳ lạ với tôi, tại sao lại bọc chức năng chính trong tất cả những điều đó nếu bạn chỉ có thể gọi nó trực tiếp main()?
Charlie Parker

2
hAcKnRoCk: nếu không có tệp chính trong tệp, thay vào đó, nó sử dụng bất cứ thứ gì trong sys.modules [' main '] .main. Sys.exit có nghĩa là chạy lệnh chính do đó được tìm thấy bằng cách sử dụng các đối số và bất kỳ cờ nào được chuyển qua và để thoát với giá trị trả về của hàm chính. @CharlieParker - để tương thích với các thư viện ứng dụng python hiện có của Google như gflags và google-apputils. Xem, ví dụ: github.com/google/google-apputils
dga

8

Không có gì đặc biệt trong tf.app. Đây chỉ là một kịch bản điểm nhập cảnh chung , mà

Chạy chương trình với chức năng 'chính' tùy chọn và danh sách 'argv'.

Nó không có gì để làm với các mạng thần kinh và nó chỉ gọi hàm chính, chuyển qua bất kỳ đối số nào với nó.


5

Trong thuật ngữ đơn giản, công việc của tf.app.run()lần đầu tiên bộ cờ toàn cầu để sử dụng sau này như:

from tensorflow.python.platform import flags
f = flags.FLAGS

và sau đó chạy chức năng chính tùy chỉnh của bạn với một bộ đối số.

Ví dụ: trong cơ sở dữ liệu NMT của TensorFlow , điểm nhập cảnh đầu tiên để thực hiện chương trình đào tạo / suy luận bắt đầu tại thời điểm này (xem mã bên dưới)

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)

Sau khi phân tích cú pháp các đối số bằng cách sử dụng argparse, tf.app.run()bạn chạy hàm "main" được định nghĩa như sau:

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)

Vì vậy, sau khi thiết lập các cờ để sử dụng toàn cầu, tf.app.run()chỉ cần chạy mainchức năng mà bạn truyền cho nó với argvcác tham số.

Tái bút: Như câu trả lời của Salvador Dali nói, đó chỉ là một cách thực hành kỹ thuật phần mềm tốt, tôi đoán, mặc dù tôi không chắc liệu TensorFlow có thực hiện bất kỳ hoạt động tối ưu hóa nào của mainchức năng so với chạy bằng CPython thông thường hay không.


2

Mã Google phụ thuộc rất nhiều vào các cờ toàn cầu đang truy cập trong các thư viện / tệp nhị phân / tập lệnh python và do đó tf.app.run () phân tích các cờ đó để tạo trạng thái toàn cầu trong biến FLAG (hoặc một cái gì đó tương tự) và sau đó gọi chính python ( ) như là nó phải như thế.

Nếu họ không có lệnh gọi này đến tf.app.run (), thì người dùng có thể quên thực hiện phân tích cú pháp FLAG, dẫn đến các thư viện / tệp nhị phân / tập lệnh này không có quyền truy cập vào FLAG mà họ cần.


1

2.0 Tương thích trả lời : Nếu bạn muốn sử dụng tf.app.run()trong Tensorflow 2.0, chúng ta nên sử dụng lệnh,

tf.compat.v1.app.run()hoặc bạn có thể sử dụng tf_upgrade_v2để chuyển đổi 1.xmã sang 2.0.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.