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()
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:
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=10000
Trên thực tế, tính năng này được triển khai dựa trên argparse
mô-đ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:
Bạn không có main
chức năng trong my_model.py
Sau đó, bạn phải gọitf.app.run(my_main_running_function)
bạn có một main
chứ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.
abseil
đó TF phải hấp thụ abseil.io/docs/python/guides/flags
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 mã .
main = main or sys.modules['__main__'].main
và sys.exit(main(sys.argv[:1] + flags_passthrough))
có ý nghĩa?
main()
?
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ó.
Trong thuật ngữ đơn giản, công việc của tf.app.run()
là 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 main
chức năng mà bạn truyền cho nó với argv
cá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 main
chức năng so với chạy bằng CPython thông thường hay không.
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.
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.x
mã sang 2.0
.
tf.flags.DEFINE_integer('batch_size', 128, 'Number of images to process in a batch.')
và sau đó nếu bạn sử dụngtf.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_size
từ bất cứ nơi nào bạn cần trong mã của mình.