TensorFlow 2 về cơ bản khác với TF1.x ở một số điểm. Bạn vẫn có thể chạy mã TF1.x chưa sửa đổi ( ngoại trừ contrib ) đối với các cài đặt nhị phân TF2 như sau:
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
Tuy nhiên, điều này không chạy các hành vi và API của TF2 và có thể không hoạt động như mong đợi với mã được viết cho TF2. Nếu bạn không chạy với hành vi TF2 đang hoạt động, thì bạn đang chạy TF1.x một cách hiệu quả trên bản cài đặt TF2. Đọc hướng dẫn về hành vi TF1 và TF2 để biết thêm chi tiết về sự khác biệt giữa TF2 và TF1.x.
Hướng dẫn này cung cấp thông tin tổng quan về quy trình di chuyển mã TF1.x của bạn sang TF2. Điều này cho phép bạn tận dụng các cải tiến tính năng mới và trong tương lai, đồng thời làm cho mã của bạn đơn giản hơn, hiệu suất cao hơn và dễ bảo trì hơn.
Nếu bạn đang sử dụng các API cấp cao của tf.keras
và đào tạo riêng với model.fit
thì mã của bạn ít nhiều phải tương thích hoàn toàn với TF2 ngoại trừ những lưu ý sau:
- TF2 có tốc độ học tập mặc định mới cho trình tối ưu hóa Keras.
- TF2 có thể đã thay đổi "tên" mà số liệu được ghi vào.
Quá trình di chuyển TF2
Trước khi di chuyển, hãy tìm hiểu về sự khác biệt về hành vi và API giữa TF1.x và TF2 bằng cách đọc hướng dẫn .
- Chạy tập lệnh tự động để chuyển đổi một số cách sử dụng API TF1.x của bạn thành
tf.compat.v1
. - Xóa các ký hiệu
tf.contrib
cũ (kiểm tra TF Addons và TF-Slim ). - Làm cho các bước chuyển tiếp mô hình TF1.x của bạn chạy trong TF2 với tính năng thực thi háo hức được bật.
- Nâng cấp mã TF1.x của bạn cho các vòng đào tạo và lưu/tải mô hình lên tương đương TF2.
- (Tùy chọn) Di chuyển các API
tf.compat.v1
tương thích với TF2 của bạn sang các API TF2 đặc trưng.
Các phần sau đây mở rộng theo các bước được nêu ở trên.
Chạy tập lệnh chuyển đổi ký hiệu
Điều này thực thi bước đầu tiên khi viết lại các ký hiệu mã của bạn để chạy với các nhị phân TF 2.x, nhưng sẽ không làm cho mã của bạn trở nên đặc trưng với TF 2.x và cũng sẽ không tự động làm cho mã của bạn tương thích với các hành vi TF2.
Mã của bạn rất có thể sẽ vẫn sử dụng điểm cuối tf.compat.v1
để truy cập phần giữ chỗ, phiên, bộ sưu tập và chức năng kiểu TF1.x khác.
Đọc hướng dẫn để tìm hiểu thêm về các phương pháp hay nhất để sử dụng tập lệnh chuyển đổi ký hiệu.
Xóa việc sử dụng tf.contrib
Mô-đun tf.contrib
đã ngừng hoạt động và một số mô-đun con của nó đã được tích hợp vào API TF2 cốt lõi. Các mô-đun con khác hiện được tách ra thành các dự án khác như TF IO và TF Addons .
Một lượng lớn mã TF1.x cũ hơn sử dụng thư viện Slim , được đóng gói cùng với TF1.x dưới dạng tf.contrib.layers
. Khi di chuyển mã Slim của bạn sang TF2, hãy chuyển cách sử dụng API Slim của bạn để trỏ đến gói tf-slim pip . Sau đó, đọc hướng dẫn lập bản đồ mô hình để tìm hiểu cách chuyển đổi mã Slim.
Ngoài ra, nếu bạn sử dụng các mô hình được đào tạo trước của Slim, bạn có thể cân nhắc dùng thử các mô hình được huấn luyện trước của Keras từ tf.keras.applications
hoặc TF2 SavedModel
của TF Hub được xuất từ mã Slim ban đầu.
Làm cho các lượt chuyển tiếp mô hình TF1.x chạy khi bật các hành vi TF2
Theo dõi các biến số và tổn thất
TF2 không hỗ trợ các bộ sưu tập toàn cầu.
Việc thực thi háo hức trong TF2 không hỗ trợ các API dựa trên bộ sưu tập tf.Graph
. Điều này ảnh hưởng đến cách bạn xây dựng và theo dõi các biến.
Đối với mã TF2 mới, bạn sẽ sử dụng tf.Variable
thay vì v1.get_variable
và sử dụng các đối tượng Python để thu thập và theo dõi các biến thay vì tf.compat.v1.variable_scope
. Thông thường đây sẽ là một trong:
Danh sách tổng hợp các biến (như tf.Graph.get_collection(tf.GraphKeys.VARIABLES)
) với các thuộc tính .variables
và .trainable_variables
của các đối tượng Layer
, Module
hoặc Model
.
Các Layer
và Model
triển khai một số thuộc tính khác giúp loại bỏ nhu cầu về các bộ sưu tập chung. Thuộc tính .losses
của chúng có thể thay thế cho việc sử dụng bộ sưu tập tf.GraphKeys.LOSSES
.
Đọc hướng dẫn ánh xạ mô hình để tìm hiểu thêm về cách sử dụng miếng chêm mô hình hóa mã TF2 để nhúng mã dựa trên get_variable
và variable_scope
hiện có của bạn bên trong Layers
, Models
và Modules
. Điều này sẽ cho phép bạn thực hiện chuyển tiếp với tính năng thực thi háo hức được kích hoạt mà không cần phải viết lại nhiều.
Thích ứng với những thay đổi hành vi khác
Nếu bản thân hướng dẫn ánh xạ mô hình không đủ để giúp mô hình của bạn chuyển tiếp chạy các thay đổi hành vi khác có thể chi tiết hơn, hãy xem hướng dẫn về hành vi TF1.x và TF2 để tìm hiểu về các thay đổi hành vi khác và cách bạn có thể thích ứng với chúng . Ngoài ra, hãy xem cách tạo Lớp và Mô hình mới thông qua hướng dẫn phân lớp để biết chi tiết.
Xác thực kết quả của bạn
Xem hướng dẫn xác thực mô hình để biết các công cụ dễ dàng và hướng dẫn về cách bạn có thể xác thực (bằng số) rằng mô hình của bạn đang hoạt động chính xác khi bật tính năng thực thi háo hức. Bạn có thể thấy điều này đặc biệt hữu ích khi kết hợp với hướng dẫn lập bản đồ mô hình .
Nâng cấp đào tạo, đánh giá và mã xuất nhập khẩu
Các vòng đào tạo TF1.x được xây dựng bằng v1.Session
-style tf.estimator.Estimator
và các phương pháp tiếp cận dựa trên bộ sưu tập khác không tương thích với các hành vi mới của TF2. Điều quan trọng là bạn phải di chuyển tất cả mã đào tạo TF1.x của mình vì việc kết hợp nó với mã TF2 có thể gây ra các hành vi không mong muốn.
Bạn có thể chọn trong số một số chiến lược để làm điều này.
Cách tiếp cận cấp cao nhất là sử dụng tf.keras
. Các hàm cấp cao trong Keras quản lý nhiều chi tiết cấp thấp có thể dễ dàng bỏ sót nếu bạn viết vòng đào tạo của riêng mình. Ví dụ: chúng tự động thu thập các tổn thất chính quy hóa và đặt đối số training=True
khi gọi mô hình.
Tham khảo hướng dẫn di chuyển Công cụ ước tính để tìm hiểu cách bạn có thể di chuyển mã của tf.estimator.Estimator
để sử dụng vòng lặp đào tạo vanilla và tf.keras
tùy chỉnh .
Các vòng đào tạo tùy chỉnh giúp bạn kiểm soát tốt hơn mô hình của mình, chẳng hạn như theo dõi trọng số của từng lớp. Đọc hướng dẫn về cách xây dựng vòng lặp đào tạo từ đầu để tìm hiểu cách sử dụng tf.GradientTape
để truy xuất trọng số mô hình và sử dụng chúng để cập nhật mô hình.
Chuyển đổi trình tối ưu hóa TF1.x sang trình tối ưu hóa Keras
Các trình tối ưu hóa trong tf.compat.v1.train
, chẳng hạn như trình tối ưu hóa Adam và trình tối ưu hóa giảm độ dốc , có các mức tương đương trong tf.keras.optimizers
.
Bảng bên dưới tóm tắt cách bạn có thể chuyển đổi các trình tối ưu hóa kế thừa này sang các trình tối ưu hóa tương đương với Keras của chúng. Bạn có thể thay thế trực tiếp phiên bản TF1.x bằng phiên bản TF2 trừ khi cần thực hiện các bước bổ sung (chẳng hạn như cập nhật tốc độ học tập mặc định ).
Lưu ý rằng việc chuyển đổi trình tối ưu hóa của bạn có thể làm cho các điểm kiểm tra cũ không tương thích .
TF1.x | TF2 | Các bước bổ sung |
---|---|---|
`tf.v1.train.GradientDescentOptimizer` | tf.keras.optimizers.SGD | Không có |
`tf.v1.train.MomentumOptimizer` | tf.keras.optimizers.SGD | Bao gồm đối số `động lượng` |
`tf.v1.train.AdamOptimizer` | tf.keras.optimizers.Adam | Đổi tên các đối số `beta1` và `beta2` thành `beta_1` và `beta_2` |
`tf.v1.train.RMSPropOptimizer` | tf.keras.optimizers.RMSprop | Đổi tên đối số `decay` thành `rho` |
`tf.v1.train.AdadeltaOptimizer` | tf.keras.optimizers.Adadelta | Không có |
`tf.v1.train.AdagradOptimizer` | tf.keras.optimizers.Adagrad | Không có |
`tf.v1.train.FtrlOptimizer` | tf.keras.optimizers.Ftrl | Xóa đối số `accum_name` và `tuyến_name` |
`tf.contrib.AdamaxOptimizer` | tf.keras.optimizers.Adamax | Đổi tên các đối số `beta1` và `beta2` thành `beta_1` và `beta_2` |
`tf.contrib.Nadam` | tf.keras.optimizers.Nadam | Đổi tên các đối số `beta1` và `beta2` thành `beta_1` và `beta_2` |
Nâng cấp đường ống đầu vào dữ liệu
Có nhiều cách để cung cấp dữ liệu cho mô hình tf.keras
. Họ sẽ chấp nhận trình tạo Python và mảng Numpy làm đầu vào.
Cách được khuyến nghị để cung cấp dữ liệu cho một mô hình là sử dụng gói tf.data
, gói này chứa một tập hợp các lớp hiệu suất cao để thao tác dữ liệu. dataset
thuộc tf.data
hiệu quả, mang tính biểu cảm và tích hợp tốt với TF2.
Chúng có thể được chuyển trực tiếp đến phương thức tf.keras.Model.fit
.
model.fit(dataset, epochs=5)
Chúng có thể được lặp lại qua Python tiêu chuẩn trực tiếp:
for example_batch, label_batch in dataset:
break
Nếu bạn vẫn đang sử dụng tf.queue
thì những thứ này hiện chỉ được hỗ trợ dưới dạng cấu trúc dữ liệu chứ không phải dưới dạng đường dẫn đầu vào.
Bạn cũng nên di chuyển tất cả mã tiền xử lý tính năng sử dụng tf.feature_columns
. Đọc hướng dẫn di chuyển để biết thêm chi tiết.
Lưu và tải mô hình
TF2 sử dụng các điểm kiểm tra dựa trên đối tượng. Đọc hướng dẫn di chuyển điểm kiểm tra để tìm hiểu thêm về cách di chuyển các điểm kiểm tra TF1.x dựa trên tên. Đồng thời đọc hướng dẫn về điểm kiểm tra trong tài liệu cốt lõi của TensorFlow.
Không có mối lo ngại đáng kể nào về khả năng tương thích đối với các mô hình đã lưu. Đọc hướng dẫn SavedModel
để biết thêm thông tin về cách di chuyển các SavedModel
trong TF1.x sang TF2. Nói chung,
- TF1.x save_models hoạt động trong TF2.
- TF2 save_models hoạt động trong TF1.x nếu tất cả các hoạt động được hỗ trợ.
Đồng thời tham khảo phần GraphDef
trong hướng dẫn di chuyển SavedModel
để biết thêm thông tin về cách làm việc với các đối tượng Graph.pb
và Graph.pbtxt
.
(Tùy chọn) Di chuyển các ký hiệu tf.compat.v1
Mô-đun tf.compat.v1
chứa API TF1.x hoàn chỉnh, với ngữ nghĩa ban đầu.
Ngay cả sau khi làm theo các bước ở trên và kết thúc bằng mã hoàn toàn tương thích với tất cả các hành vi của TF2, có thể có nhiều đề cập đến các api compat.v1
tương thích với TF2. Bạn nên tránh sử dụng các api compat.v1
cũ này cho bất kỳ mã mới nào mà bạn viết, mặc dù chúng sẽ tiếp tục hoạt động đối với mã đã viết của bạn.
Tuy nhiên, bạn có thể chọn di chuyển các cách sử dụng hiện có sang API TF2 không cũ. Chuỗi tài liệu của các ký hiệu compat.v1
riêng lẻ thường sẽ giải thích cách di chuyển chúng sang API TF2 không kế thừa. Ngoài ra, phần hướng dẫn ánh xạ mô hình về di chuyển gia tăng sang API TF2 thành ngữ cũng có thể trợ giúp vấn đề này.
Tài nguyên và đọc thêm
Như đã đề cập trước đây, cách tốt nhất là di chuyển tất cả mã TF1.x của bạn sang TF2. Đọc hướng dẫn trong phần Di chuyển sang TF2 của hướng dẫn TensorFlow để tìm hiểu thêm.