TensorFlow 2.0 hiệu quả: Thực tiễn tốt nhất và những gì Thay đổi

Đăng bởi Nhóm TensorFlow

Trong một bài viết gần đây, chúng tôi đã đề cập rằng TensorFlow 2.0 đã được thiết kế lại với trọng tâm là năng suất của nhà phát triển, sự đơn giản và dễ sử dụng.

Để xem xét kỹ hơn những gì mà Thay đổi, và để tìm hiểu về các thực tiễn tốt nhất, hãy xem hướng dẫn mới về TensorFlow 2.0 hiệu quả (được xuất bản trên GitHub). Bài viết này cung cấp một bản tóm tắt nhanh chóng về nội dung mà bạn sẽ tìm thấy ở đó. Nếu bất kỳ chủ đề nào trong số này làm bạn quan tâm, hãy đến hướng dẫn để tìm hiểu thêm!

Một bản tóm tắt ngắn gọn về những thay đổi lớn

Có nhiều thay đổi trong TensorFlow 2.0 để giúp người dùng làm việc hiệu quả hơn, bao gồm loại bỏ các API dư thừa, làm cho API trở nên nhất quán hơn (RNNs hợp nhất, Tối ưu hóa hợp nhất) và tích hợp tốt hơn với thời gian chạy Python với thực thi Eager.

Nhiều RFC (kiểm tra xem chúng, nếu bạn là người mới đối với chúng!) Đã giải thích những thay đổi và suy nghĩ đã tạo ra TensorFlow 2.0. Hướng dẫn này trình bày một tầm nhìn cho sự phát triển trong TensorFlow 2.0 sẽ như thế nào. Nó giả định rằng bạn có một số quen thuộc với TensorFlow 1.x.

Dọn dẹp API

Nhiều API đã biến mất hoặc di chuyển trong TF 2.0 và một số API đã được thay thế bằng các tương đương 2.0 của chúng - tf.summary, tf.keras.metrics và tf.keras.optimulators. Cách dễ nhất để tự động áp dụng các đổi tên này là sử dụng tập lệnh nâng cấp v2.

Thực hiện háo hức

TensorFlow 1.X yêu cầu người dùng tự ghép một cây cú pháp trừu tượng (biểu đồ) bằng cách thực hiện các lệnh gọi tf. * API. Sau đó, nó yêu cầu người dùng biên dịch thủ công cây cú pháp trừu tượng bằng cách chuyển một tập hợp các tenxơ đầu ra và các tenx đầu vào cho một lệnh gọi session.run (). Ngược lại, TensorFlow 2.0 thực thi một cách háo hức (như Python thường làm) và trong 2.0, các biểu đồ và phiên sẽ có cảm giác như chi tiết triển khai.

Không còn toàn cầu

TensorFlow 1.X phụ thuộc rất nhiều vào không gian tên toàn cầu. Khi bạn gọi tf.Variable (), nó sẽ được đưa vào biểu đồ mặc định và nó sẽ vẫn ở đó, ngay cả khi bạn mất dấu vết của biến Python chỉ vào nó. Sau đó, bạn có thể khôi phục tf.Variable đó, nhưng chỉ khi bạn biết tên mà nó đã được tạo. Điều này rất khó thực hiện nếu bạn không kiểm soát việc tạo ra biến đổi. Kết quả là, tất cả các loại cơ chế tăng sinh để cố gắng giúp người dùng tìm lại biến của họ.

TensorFlow 2.0 loại bỏ tất cả các cơ chế này (Biến 2.0 RFC) theo hướng có lợi cho cơ chế mặc định: Theo dõi các biến của bạn! Nếu bạn mất dấu vết của một tf. Biến, nó sẽ được thu gom rác. Xem hướng dẫn để biết thêm chi tiết.

Chức năng, không phải phiên

Cuộc gọi session.run () gần giống như một cuộc gọi hàm: Bạn chỉ định các đầu vào và hàm sẽ được gọi và bạn nhận lại một tập hợp các đầu ra. Trong TensorFlow 2.0, bạn có thể trang trí một hàm Python bằng cách sử dụng tf.function () để đánh dấu nó cho quá trình biên dịch JIT để TensorFlow chạy nó dưới dạng một biểu đồ duy nhất (Hàm 2.0 RFC).

Cơ chế này cho phép TensorFlow 2.0 đạt được tất cả các lợi ích của chế độ biểu đồ:

  • Hiệu suất: Chức năng có thể được tối ưu hóa (cắt tỉa nút, tổng hợp hạt nhân, v.v.)
  • Tính di động: Chức năng có thể được xuất / nhập lại (SavingModel 2.0 RFC), cho phép người dùng sử dụng lại và chia sẻ các chức năng TensorFlow mô-đun.

Với khả năng tự do xen kẽ mã Python và TensorFlow, bạn có thể tận dụng tối đa tính biểu cảm của Python. Nhưng TensorFlow di động thực thi trong các ngữ cảnh mà không cần trình thông dịch Python - mobile, C ++ và JS. Để giúp người dùng tránh phải viết lại mã của họ khi thêm @ tf.feft, AutoGraph sẽ chuyển đổi một tập hợp con của các cấu trúc Python thành tương đương TensorFlow của họ.

Xem hướng dẫn để biết thêm chi tiết.

Các khuyến nghị cho TenorFlow 2.0 thành ngữ

Tái cấu trúc mã của bạn thành các hàm nhỏ hơn

Một mô hình sử dụng phổ biến trong TensorFlow 1.X là chiến lược bồn rửa nhà bếp, trong đó sự kết hợp của tất cả các tính toán có thể được đặt ra trước, và sau đó các thang đo được chọn được đánh giá qua session.run (). Trong TensorFlow 2.0, người dùng nên cấu trúc lại mã của mình thành các hàm nhỏ hơn được gọi là cần thiết. Nói chung, nó không cần thiết phải trang trí từng chức năng nhỏ hơn này bằng tf.feft; chỉ sử dụng tf.f ghép để trang trí các tính toán cấp cao - ví dụ: một bước đào tạo hoặc vượt qua mô hình của bạn.

Sử dụng các lớp và mô hình Keras để quản lý các biến

Các mô hình và các lớp của Keras cung cấp các biến thuận tiện và các thuộc tính trainable_variables, tập hợp đệ quy tất cả các biến phụ thuộc. Điều này giúp dễ dàng quản lý các biến cục bộ đến nơi chúng đang được sử dụng.

Các lớp / mô hình của Keras kế thừa từ tf.train.Checkpointable và được tích hợp với @ tf.feft, cho phép có thể trực tiếp kiểm tra hoặc xuất các SavingModels từ các đối tượng Keras. Bạn không nhất thiết phải sử dụng API Keras Hay.fit () để tận dụng các tích hợp này.

Xem hướng dẫn để biết thêm chi tiết.

Kết hợp tf.data.Datasets và @ tf.feft

Khi lặp lại dữ liệu đào tạo phù hợp với bộ nhớ, vui lòng sử dụng Lặp lại Python thông thường. Mặt khác, tf.data.Dataset là cách tốt nhất để truyền dữ liệu đào tạo từ đĩa. Các bộ dữ liệu là các iterables (không phải iterators) và hoạt động giống như các iterables Python khác trong chế độ Eager. Bạn hoàn toàn có thể sử dụng các tính năng tìm nạp / phát trực tuyến của async bằng cách gói mã của bạn trong tf.function (), thay thế lặp lại Python bằng các hoạt động biểu đồ tương đương bằng AutoGraph.

@ tf.feft
def train (mô hình, tập dữ liệu, trình tối ưu hóa):
 cho x, y trong tập dữ liệu:
  với tf.GradientTape () dưới dạng băng:
   dự đoán = mô hình (x)
   loss = loss_fn (dự đoán, y)
  độ dốc = băng. nâng cấp (mất, model.trainable_variables)
  tối ưu hóa.apply_gradrons (độ dốc, model.trainable_variables)

Nếu bạn sử dụng API Keras .fit (), bạn sẽ phải lo lắng về việc lặp lại tập dữ liệu.

model.compile (tối ưu hóa = tối ưu hóa, mất = mất_fn)
model.fit (tập dữ liệu)

Tận dụng lợi thế của AutoGraph với luồng điều khiển Python

AutoGraph cung cấp một cách để chuyển đổi luồng điều khiển phụ thuộc dữ liệu thành các chế độ tương đương ở chế độ đồ thị như tf.cond và tf.fter_loop.

Một nơi phổ biến nơi xuất hiện luồng điều khiển phụ thuộc dữ liệu là trong các mô hình trình tự. tf.keras.layers.RNN bao bọc một ô RNN, cho phép bạn kiểm soát sự tái phát tĩnh hoặc động. Để trình diễn sake sake, bạn có thể thực hiện hủy đăng ký động như sau:

lớp DynamicRNN (tf.keras.Model):
def __init __ (tự, rnn_cell):
 siêu (DynamicRNN, tự) .__ init __ (tự)
 tự.cell = rnn_cell
cuộc gọi def (tự, input_data):
 # [lô, thời gian, tính năng] -> [thời gian, đợt, tính năng]
 input_data = tf.transpose (input_data, [1, 0, 2])
 đầu ra = tf.TensorArray (tf.float32, input_data.shape [0])
 state = self.cell.zero_state (input_data.shape [1], dtype = tf.float32)
 cho tôi trong tf.range (input_data.shape [0]):
  đầu ra, trạng thái = self.cell (input_data [i], state)
  đầu ra = output.write (i, đầu ra)
 return tf.transpose (output.stack (), [1, 0, 2]), trạng thái

Xem hướng dẫn để biết thêm chi tiết.

Sử dụng tf.metrics để tổng hợp dữ liệu và tf.summary để ghi nhật ký

Cuối cùng, một bộ hoàn chỉnh các biểu tượng tf.summary sẽ sớm ra mắt. Bạn có thể truy cập phiên bản 2.0 của tf.summary với:

từ tenorflow.python.ops nhập tóm tắt_ops_v2

Xem hướng dẫn để biết thêm chi tiết.

Bước tiếp theo

Bài viết này cung cấp một bản tóm tắt nhanh về Hướng dẫn TF 2.0 hiệu quả (nếu bạn quan tâm đến các chủ đề này, hãy tìm hiểu thêm!) Để tìm hiểu thêm về TensorFlow 2.0, chúng tôi cũng khuyên bạn nên sử dụng các bài viết gần đây:

  • Đóng góp cho TensorFlow: SIG, RFC, Kiểm tra và Tài liệu.
  • API tượng trưng và mệnh lệnh trong TensorFlow 2.0 là gì?
  • Chuẩn hóa trên máy ảnh: Hướng dẫn về API cấp cao trong TensorFlow 2.0

Và xin vui lòng điều chỉnh cho hội nghị thượng đỉnh nhà phát triển TensorFlow vào ngày 6 và 7 tháng 3. Như mọi khi, tất cả các cuộc đàm phán sẽ được tải lên YouTube cho những người có thể trực tiếp thực hiện.