Lưu ngày! Google I / O hoạt động trở lại từ ngày 18 đến 20 tháng 5 Đăng ký ngay
Trang này được dịch bởi Cloud Translation API.
Switch to English

Di chuyển mức sử dụng tf.summary sang TF 2.0

Xem trên TensorFlow.org Chạy trong Google Colab Xem nguồn trên GitHub Tải xuống sổ ghi chép
import tensorflow as tf

TensorFlow 2.0 bao gồm những thay đổi đáng kể đối với API tf.summary được sử dụng để viết dữ liệu tóm tắt để hiển thị trong TensorBoard.

Có gì thay đổi

Thật hữu ích khi tf.summary API tf.summary là hai API phụ:

  • Một tập hợp các hoạt động để ghi tóm tắt riêng lẻ - summary.scalar() , summary.histogram() , summary.image() , summary.audio()summary.text() - được gọi là nội tuyến từ mã mô hình của bạn.
  • Viết logic thu thập các bản tóm tắt riêng lẻ này và ghi chúng vào tệp nhật ký được định dạng đặc biệt (sau đó TensorBoard đọc để tạo hình ảnh trực quan).

Trong TF 1.x

Hai nửa phải được nối dây thủ công với nhau - bằng cách tìm nạp các đầu ra op tóm tắt thông qua Session.run() và gọi FileWriter.add_summary(output, step) . v1.summary.merge_all() đã làm điều này dễ dàng hơn bằng cách sử dụng bộ sưu tập đồ thị để tổng hợp tất cả các đầu ra op tóm tắt, nhưng cách tiếp cận này vẫn hoạt động kém đối với luồng điều khiển và thực thi mong muốn, khiến nó đặc biệt không phù hợp với TF 2.0.

Trong TF 2.X

Hai nửa được tích hợp chặt chẽ và bây giờ các hoạt động tf.summary riêng lẻ ghi dữ liệu của họ ngay lập tức khi được thực thi. Sử dụng API từ mã mô hình của bạn trông vẫn quen thuộc, nhưng giờ đây nó thân thiện với việc thực thi mong muốn trong khi vẫn tương thích với chế độ đồ thị. Lồng ghép cả hai nửa của phương tiện API summary.FileWriter hiện là một phần của bối cảnh thực hiện TensorFlow và được truy cập trực tiếp bởi tf.summary ops, vì vậy cấu hình nhà văn là phần chính mà vẻ bề ngoài khác nhau.

Ví dụ sử dụng với thực thi háo hức, mặc định trong TF 2.0:

writer = tf.summary.create_file_writer("/tmp/mylogs/eager")

with writer.as_default():
  for step in range(100):
    # other model code would go here
    tf.summary.scalar("my_metric", 0.5, step=step)
    writer.flush()
ls /tmp/mylogs/eager
events.out.tfevents.1617793798.kokoro-gcp-ubuntu-prod-2000985207.3796.5.v2

Cách sử dụng ví dụ với thực hiện đồ thị hàm tf.

writer = tf.summary.create_file_writer("/tmp/mylogs/tf_function")

@tf.function
def my_func(step):
  with writer.as_default():
    # other model code would go here
    tf.summary.scalar("my_metric", 0.5, step=step)

for step in tf.range(100, dtype=tf.int64):
  my_func(step)
  writer.flush()
ls /tmp/mylogs/tf_function
events.out.tfevents.1617793799.kokoro-gcp-ubuntu-prod-2000985207.3796.1013.v2

Ví dụ về cách sử dụng với thực thi đồ thị TF 1.x cũ:

g = tf.compat.v1.Graph()
with g.as_default():
  step = tf.Variable(0, dtype=tf.int64)
  step_update = step.assign_add(1)
  writer = tf.summary.create_file_writer("/tmp/mylogs/session")
  with writer.as_default():
    tf.summary.scalar("my_metric", 0.5, step=step)
  all_summary_ops = tf.compat.v1.summary.all_v2_summary_ops()
  writer_flush = writer.flush()


with tf.compat.v1.Session(graph=g) as sess:
  sess.run([writer.init(), step.initializer])

  for i in range(100):
    sess.run(all_summary_ops)
    sess.run(step_update)
    sess.run(writer_flush)
ls /tmp/mylogs/session
events.out.tfevents.1617793799.kokoro-gcp-ubuntu-prod-2000985207.3796.1446.v2

Chuyển đổi mã của bạn

Việc chuyển đổi cách sử dụng tf.summary hiện có sang TF 2.0 API không thể tự động một cách đáng tin cậy, vì vậy tập lệnh tf_upgrade_v2 chỉ cần viết lại tất cả thành tf.compat.v1.summary . Để chuyển sang TF 2.0, bạn cần điều chỉnh mã của mình như sau:

  1. Người viết mặc định được đặt qua .as_default() phải có mặt để sử dụng các hoạt động tóm tắt

    • Điều này có nghĩa là thực hiện các hoạt động một cách hăng hái hoặc sử dụng các hoạt động trong xây dựng biểu đồ
    • Không có người viết mặc định, các hoạt động tóm tắt trở thành các hoạt động im lặng
    • Các trình viết mặc định không (chưa) truyền qua ranh giới thực thi @tf.function - chúng chỉ được phát hiện khi hàm được theo dõi - vì vậy phương pháp hay nhất là gọi writer.as_default() trong thân hàm và để đảm bảo rằng đối tượng của hàm tiếp tục tồn tại miễn là chức năng @tf.function đang được sử dụng
  2. Giá trị "bước" phải được chuyển vào mỗi lần chọn thông qua đối số step

    • TensorBoard yêu cầu giá trị bước để hiển thị dữ liệu dưới dạng chuỗi thời gian
    • Chuyển một cách rõ ràng là cần thiết vì bước tổng thể từ TF 1.x đã bị loại bỏ, vì vậy mỗi op phải biết biến bước mong muốn để đọc
    • Để giảm phần tạo sẵn, hỗ trợ thử nghiệm để đăng ký giá trị bước mặc định có sẵn dưới dạng tf.summary.experimental.set_step() , nhưng đây là chức năng tạm thời có thể được thay đổi mà không cần thông báo
  3. Chữ ký chức năng của các hoạt động tóm tắt riêng lẻ đã thay đổi

    • Giá trị trả về bây giờ là một boolean (cho biết liệu bản tóm tắt có thực sự được viết hay không)
    • Tên tham số thứ hai (nếu được sử dụng) đã thay đổi từ tensor thành data
    • Tham số collections đã bị xóa; bộ sưu tập chỉ là TF 1.x
    • Tham số family đã bị xóa; chỉ cần sử dụng tf.name_scope()
  4. [Chỉ dành cho người dùng thực thi phiên / chế độ biểu đồ kế thừa]

    • Đầu tiên hãy khởi tạo trình viết bằng v1.Session.run(writer.init())

    • Sử dụng v1.summary.all_v2_summary_ops() để nhận tất cả các hoạt động tóm tắt TF 2.0 cho biểu đồ hiện tại, ví dụ: để thực thi chúng qua Session.run()

    • Xóa người viết bằng v1.Session.run(writer.flush()) và tương tự đối với close()

Nếu mã TF 1.x của bạn thay vào đó sử dụng API tf.contrib.summary , thì nó giống với API TF 2.0 hơn nhiều, do đó, tập lệnh tf_upgrade_v2 sẽ tự động hóa hầu hết các bước di chuyển (và đưa ra cảnh báo hoặc lỗi cho bất kỳ cách sử dụng nào không thể hoàn thành di cư). Đối với hầu hết các phần, nó chỉ viết lại các lệnh gọi API tới tf.compat.v2.summary ; nếu bạn chỉ cần khả năng tương thích với TF 2.0+, bạn có thể bỏ compat.v2 và chỉ tham chiếu nó dưới dạng tf.summary .

Lời khuyên bổ sung

Ngoài các lĩnh vực quan trọng ở trên, một số khía cạnh phụ trợ cũng đã thay đổi:

  • Bản ghi có điều kiện (như "ghi mỗi 100 bước") có giao diện mới

    • Để kiểm soát các hoạt động và mã liên quan, hãy bọc chúng trong một câu lệnh if thông thường (hoạt động ở chế độ háo hức và chức năng @tf.function qua chữ ký ) hoặc tf.cond
    • Để chỉ kiểm soát các bản tóm tắt, hãy sử dụng trình quản lý ngữ cảnh tf.summary.record_if() mới và chuyển nó điều kiện boolean mà bạn chọn
    • Chúng thay thế mẫu TF 1.x:

      if condition:
        writer.add_summary()
      
  • Không viết trực tiếp tf.compat.v1.Graph - thay vào đó hãy sử dụng các hàm theo dõi

    • Thực thi đồ thị trong TF 2.0 sử dụng @tf.function thay vì Graph rõ ràng
    • Trong TF 2.0, sử dụng các API kiểu theo dõi mới tf.summary.trace_on()tf.summary.trace_export() để ghi lại các đồ thị hàm đã thực thi
  • Không còn bộ nhớ đệm toàn cầu của người viết trên mỗi logdir với tf.summary.FileWriterCache

    • Người dùng nên triển khai bộ nhớ đệm / chia sẻ đối tượng người viết của riêng họ hoặc chỉ sử dụng người viết riêng biệt (hỗ trợ TensorBoard cho đối tượng thứ hai đang được tiến hành )
  • Biểu diễn nhị phân tệp sự kiện đã thay đổi

    • TensorBoard 1.x đã hỗ trợ định dạng mới; sự khác biệt này chỉ ảnh hưởng đến những người dùng đang phân tích dữ liệu tóm tắt theo cách thủ công từ các tệp sự kiện
    • Dữ liệu tóm tắt hiện được lưu trữ dưới dạng tensor byte; bạn có thể sử dụng tf.make_ndarray(event.summary.value[0].tensor) để chuyển đổi nó thành numpy