TensorFlow 2 在幾個方面與 TF1.x 截然不同。您仍然可以針對 TF2 二進位安裝檔執行未修改的 TF1.x 程式碼 (contrib 除外),如下所示
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
不過,這並未執行 TF2 行為和 API,而且可能無法如預期般與為 TF2 撰寫的程式碼搭配運作。如果您未在啟動 TF2 行為的情況下執行,則實際上是在 TF2 安裝檔之上執行 TF1.x。請參閱 TF1 與 TF2 行為指南,以深入瞭解 TF2 與 TF1.x 的差異。
本指南概述將 TF1.x 程式碼遷移至 TF2 的程序。這可讓您充分利用新功能和未來的效能改進,並讓程式碼更簡潔、效能更高且更易於維護。
如果您使用 tf.keras
的高階 API 並完全透過 model.fit
進行訓練,則您的程式碼應或多或少與 TF2 完全相容,但下列注意事項除外
TF2 遷移程序
遷移之前,請先閱讀指南,瞭解 TF1.x 與 TF2 之間的行為和 API 差異。
- 執行自動化指令碼,將部分 TF1.x API 用法轉換為
tf.compat.v1
。 - 移除舊的
tf.contrib
符號 (查看 TF Addons 和 TF-Slim)。 - 讓您的 TF1.x 模型前向傳遞在啟用 Eager Execution 的 TF2 中執行。
- 升級您的 TF1.x 程式碼,以進行訓練迴圈和儲存/載入模型至 TF2 等效項目。
- (選用) 將與 TF2 相容的
tf.compat.v1
API 遷移至慣用的 TF2 API。
以下章節將詳細說明上述步驟。
執行符號轉換指令碼
這會執行初始傳遞,以重新編寫您的程式碼符號,使其能針對 TF 2.x 二進位檔執行,但不會讓您的程式碼符合 TF 2.x 的慣用方式,也不會自動讓您的程式碼與 TF2 行為相容。
您的程式碼很可能仍會使用 tf.compat.v1
端點來存取預留位置、工作階段、集合和其他 TF1.x 樣式功能。
請參閱指南,以進一步瞭解使用符號轉換指令碼的最佳做法。
移除 tf.contrib
的用法
tf.contrib
模組已淘汰,其部分子模組已整合至核心 TF2 API。其他子模組現在已分拆成其他專案,例如 TF IO 和 TF Addons。
大量舊版 TF1.x 程式碼使用 Slim 程式庫,該程式庫與 TF1.x 一起封裝為 tf.contrib.layers
。遷移 Slim 程式碼至 TF2 時,請將您的 Slim API 用法切換為指向 tf-slim pip 套件。然後,參閱模型對應指南,以瞭解如何轉換 Slim 程式碼。
或者,如果您使用 Slim 預先訓練模型,您可以考慮試用 Keras 的預先訓練模型,這些模型來自 tf.keras.applications
或 TF Hub 的 TF2 SavedModel
(從原始 Slim 程式碼匯出)。
讓 TF1.x 模型前向傳遞在啟用 TF2 行為的情況下執行
追蹤變數和損失
TF2 中的 Eager Execution 不支援tf.Graph
以集合為基礎的 API。這會影響您建構和追蹤變數的方式。
對於新的 TF2 程式碼,您會使用 tf.Variable
而非 v1.get_variable
,並使用 Python 物件收集和追蹤變數,而非 tf.compat.v1.variable_scope
。通常,這會是下列其中一項
使用 Layer
、Module
或 Model
物件的 .variables
和 .trainable_variables
屬性,彙總變數清單 (例如 tf.Graph.get_collection(tf.GraphKeys.VARIABLES)
)。
Layer
和 Model
類別實作其他數個屬性,可免除對全域集合的需求。它們的 .losses
屬性可以取代使用 tf.GraphKeys.LOSSES
集合。
請參閱模型對應指南,以進一步瞭解如何使用 TF2 程式碼模型化墊片,將您現有的 get_variable
和 variable_scope
基礎程式碼嵌入 Layers
、Models
和 Modules
內部。這可讓您在啟用 Eager Execution 的情況下執行前向傳遞,而無需進行重大重寫。
調整以適應其他行為變更
如果模型對應指南本身不足以讓您的模型前向傳遞執行其他行為變更,則可能需要更多詳細資訊,請參閱 TF1.x 與 TF2 行為指南,以瞭解其他行為變更以及您如何適應這些變更。另請參閱透過子類別建立新 Layer 和模型指南,以取得詳細資訊。
驗證結果
請參閱模型驗證指南,以取得關於如何 (以數值方式) 驗證模型在啟用 Eager Execution 時是否正常運作的簡易工具和指引。您可能會發現這與模型對應指南搭配使用時特別有用。
升級訓練、評估和匯入/匯出程式碼
使用 v1.Session
樣式 tf.estimator.Estimator
和其他以集合為基礎的方法建構的 TF1.x 訓練迴圈與 TF2 的新行為不相容。務必遷移所有 TF1.x 訓練程式碼,因為將其與 TF2 程式碼結合可能會導致非預期的行為。
您可以從多種策略中選擇執行此操作。
最高階的方法是使用 tf.keras
。Keras 中的高階函式會管理許多低階細節,如果您自行編寫訓練迴圈,可能會很容易忽略這些細節。例如,它們會自動收集正規化損失,並在呼叫模型時設定 training=True
引數。
請參閱估算器遷移指南,以瞭解如何遷移 tf.estimator.Estimator
程式碼以使用標準和自訂 tf.keras
訓練迴圈。
自訂訓練迴圈可讓您更精細地控制模型,例如追蹤個別層的權重。請參閱從頭開始建構訓練迴圈指南,以瞭解如何使用 tf.GradientTape
擷取模型權重並使用它們來更新模型。
將 TF1.x 最佳化工具轉換為 Keras 最佳化工具
tf.compat.v1.train
中的最佳化工具 (例如 Adam 最佳化工具和梯度下降最佳化工具) 在 tf.keras.optimizers
中有對應的項目。
下表摘要說明如何將這些舊版最佳化工具轉換為其 Keras 對應項目。您可以直接將 TF1.x 版本替換為 TF2 版本,除非需要其他步驟 (例如更新預設學習率)。
請注意,轉換最佳化工具可能會導致舊檢查點不相容。
TF1.x | TF2 | 其他步驟 |
---|---|---|
`tf.v1.train.GradientDescentOptimizer` | tf.keras.optimizers.SGD |
無 |
`tf.v1.train.MomentumOptimizer` | tf.keras.optimizers.SGD |
加入 `momentum` 引數 |
`tf.v1.train.AdamOptimizer` | tf.keras.optimizers.Adam |
將 `beta1` 和 `beta2` 引數重新命名為 `beta_1` 和 `beta_2` |
`tf.v1.train.RMSPropOptimizer` | tf.keras.optimizers.RMSprop |
將 `decay` 引數重新命名為 `rho` |
`tf.v1.train.AdadeltaOptimizer` | tf.keras.optimizers.Adadelta |
無 |
`tf.v1.train.AdagradOptimizer` | tf.keras.optimizers.Adagrad |
無 |
`tf.v1.train.FtrlOptimizer` | tf.keras.optimizers.Ftrl |
移除 `accum_name` 和 `linear_name` 引數 |
`tf.contrib.AdamaxOptimizer` | tf.keras.optimizers.Adamax |
將 `beta1` 和 `beta2` 引數重新命名為 `beta_1` 和 `beta_2` |
`tf.contrib.Nadam` | tf.keras.optimizers.Nadam |
將 `beta1` 和 `beta2` 引數重新命名為 `beta_1` 和 `beta_2` |
升級資料輸入管道
有多種方法可將資料饋送至 tf.keras
模型。它們會接受 Python 產生器和 Numpy 陣列作為輸入。
建議將資料饋送至模型的方式是使用 tf.data
套件,其中包含用於操控資料的高效能類別集合。屬於 tf.data
的 dataset
既有效率、具表現力,且與 TF2 整合良好。
它們可以直接傳遞至 tf.keras.Model.fit
方法。
model.fit(dataset, epochs=5)
它們可以直接透過標準 Python 進行迭代
for example_batch, label_batch in dataset:
break
如果您仍在使用 tf.queue
,則這些現在僅支援作為資料結構,而非作為輸入管道。
您也應遷移所有使用 tf.feature_columns
的特徵預處理程式碼。請參閱遷移指南,以取得更多詳細資訊。
儲存和載入模型
TF2 使用以物件為基礎的檢查點。請參閱檢查點遷移指南,以進一步瞭解如何從以名稱為基礎的 TF1.x 檢查點遷移。另請參閱核心 TensorFlow 文件中的檢查點指南。
SavedModel 沒有重大相容性問題。請參閱 SavedModel
指南,以取得關於在 TF1.x 中將 SavedModel
遷移至 TF2 的更多資訊。一般而言,
- TF1.x saved_model 可在 TF2 中運作。
- 如果支援所有作業,TF2 saved_model 可在 TF1.x 中運作。
另請參閱 SavedModel
遷移指南中的 GraphDef 區段,以取得關於使用 Graph.pb
和 Graph.pbtxt
物件的更多資訊。
(選用) 從 tf.compat.v1
符號遷移
tf.compat.v1
模組包含完整的 TF1.x API 及其原始語意。
即使在遵循上述步驟並最終獲得與所有 TF2 行為完全相容的程式碼之後,仍可能有很多提及 compat.v1
API 的情況,這些 API 碰巧與 TF2 相容。您應避免針對您撰寫的任何新程式碼使用這些舊版 compat.v1
API,但它們會繼續適用於您已撰寫的程式碼。
不過,您可以選擇將現有的用法遷移至非舊版 TF2 API。個別 compat.v1
符號的文件字串通常會說明如何將它們遷移至非舊版 TF2 API。此外,模型對應指南中關於逐步遷移至慣用 TF2 API 的章節也可能有助於執行此操作。
資源和延伸閱讀
如先前所述,最好將所有 TF1.x 程式碼遷移至 TF2。請參閱 TensorFlow 指南的遷移至 TF2 章節中的指南,以深入瞭解。