本頁面由 Cloud Translation API 翻譯而成。
Switch to English

TF1集線器格式

TensorFlow Hub在2018年發佈時提供了一種資產類型:TF1 Hub格式,可導入TensorFlow 1程序。

本頁說明如何將TF1中的TF1集線器格式(或TF2的TF1兼容模式)與hub.Module類和關聯的API一起使用。 (典型的使用是要建立一個tf.Graph ,可能內部的TF1 Estimator ,由一個或多個模型與TF1集線器格式組合tf.compat.layerstf.layers )。

TensorFlow 2(在TF1兼容模式之外)的用戶必須將新API與hub.load()hub.KerasLayer 。新的API會加載新的TF2 SavedModel資產類型,但對將TF1集線器格式加載到TF2中的支持有限。

使用TF1 Hub格式的模型

以TF1集線器格式實例化模型

通過從具有URL或文件系統路徑的字符串中創建hub.Module對象,將TF1 Hub格式的模型導入TensorFlow程序,例如:

 m = hub.Module("path/to/a/module_dir")
 

這會將模塊的變量添加到當前的TensorFlow圖中。運行其初始化程序將從磁盤讀取其預訓練的值。同樣,表和其他狀態也會添加到圖形中。

緩存模塊

通過URL創建模塊時,模塊內容將下載並緩存在本地系統臨時目錄中。可以使用TFHUB_CACHE_DIR環境變量來覆蓋模塊的緩存位置。有關詳細信息,請參見緩存

應用模塊

一旦實例化,模塊m可以被調用零次或多次,就像從張量輸入到張量輸出的Python函數一樣:

 y = m(x)
 

每個此類調用將操作添加到當前TensorFlow圖以從x計算y 。如果此變量具有經過訓練的權重,則這些變量將在所有應用程序之間共享。

模塊可以定義多個命名簽名 ,以允許以多種方式應用(類似於Python對象具有方法 )。模塊的文檔應描述可用的簽名。上面的調用將應用名為"default"的簽名。可以通過將名稱傳遞給可選的signature=參數來選擇任何簽名。

如果簽名具有多個輸入,則必須將其作為字典傳遞,並使用簽名定義的密鑰。同樣,如果簽名具有多個輸出,則可以通過在簽名定義的鍵下傳遞as_dict=True ,將as_dict=True作為dict檢索(鍵"default"用於as_dict=False返回的單個輸出)。因此,應用模塊的最一般形式如下:

 outputs = m(dict(apples=x1, oranges=x2), signature="fruit_to_pet", as_dict=True)
y1 = outputs["cats"]
y2 = outputs["dogs"]
 

調用者必須提供簽名定義的所有輸入,但不要求使用模塊的所有輸出。 TensorFlow將僅運行模塊的那些最終以tf.Session.run()中的目標依賴關係的部分。實際上,模塊發布者可以選擇提供各種輸出以供高級使用(例如中間層的激活)以及主要輸出。模塊使用者應妥善處理其他輸出。

試用替代模塊

只要有多個模塊可以完成同一任務,TensorFlow Hub就會鼓勵為它們配備兼容的簽名(接口),以便嘗試不同的簽名和更改字符串字符串超參數一樣容易。

為此,我們維護了針對常見任務的推薦通用簽名集合。

創建一個新模塊

相容性說明

TF1集線器格式適用於TensorFlow1。TensorFlow 2中的TF集線器僅部分支持它。請一定考慮使用新的TF2 SavedModel格式發布。

TF1集線器格式在語法層面上類似於TensorFlow 1的SavedModel格式(相同的文件名和協議消息),但在語義上有所不同,以允許模塊重用,組合和重新訓練(例如,資源初始化程序的不同存儲,不同的標記)元符號慣例)。區分它們在磁盤上的最簡單方法是tfhub_module.pb文件的存在與否。

一般的做法

要定義新模塊,發布者使用功能module_fn調用hub.create_module_spec() 。此函數使用tf.placeholder()構造由調用者提供的輸入的表示模塊內部結構的圖形。然後,它通過調用hub.add_signature(name, inputs, outputs)一次或多次來定義簽名。

例如:

 def module_fn():
  inputs = tf.placeholder(dtype=tf.float32, shape=[None, 50])
  layer1 = tf.layers.dense(inputs, 200)
  layer2 = tf.layers.dense(layer1, 100)
  outputs = dict(default=layer2, hidden_activations=layer1)
  # Add default signature.
  hub.add_signature(inputs=inputs, outputs=outputs)

...
spec = hub.create_module_spec(module_fn)
 

可以使用hub.create_module_spec()的結果hub.create_module_spec()而不是路徑)來實例化特定TensorFlow圖內的模塊對象。在這種情況下,沒有檢查點,模塊實例將使用變量初始化器。

任何模塊實例都可以通過其export(path, session)方法序列化到磁盤。導出模塊會將其定義與session中其變量的當前狀態一起序列化到傳遞的路徑中。首次導出模塊時以及導出微調模塊時均可使用此功能。

為了與TensorFlow Estimators兼容, hub.LatestModuleExporter從最新的檢查點導出模塊,就像tf.estimator.LatestExporter從最新的檢查點導出整個模型一樣。

模塊發布者應在可能的情況下實施通用簽名 ,以便消費者可以輕鬆地交換模塊並找到解決問題的最佳方法。

真實的例子

查看我們的文本嵌入模塊導出器 ,以獲取有關如何從通用文本嵌入格式創建模塊的真實示例。

微調

訓練導入模塊的變量及其周圍模型的變量稱為微調 。微調可以提高質量,但會增加新的複雜性。我們建議消費者只有在探索了更簡單的質量調整之後,並且只有在模塊發布者推薦的情況下,才進行微調。

對於消費者

要啟用微調,請使用hub.Module(..., trainable=True)實例化模塊以使其變量可訓練並導入TensorFlow的REGULARIZATION_LOSSES 。如果模塊具有多個圖形變體,請確保選擇一個適合訓練的變體。通常,這就是帶有標籤{"train"}標籤。

選擇一種不會破壞預訓練權重的訓練方案,例如,比從頭開始訓練的學習率要低。

對於出版商

為了使消費者更容易進行微調,請注意以下幾點:

  • 微調需要正規化。你的模塊輸出與REGULARIZATION_LOSSES集合,這是什麼使你的選擇tf.layers.dense(..., kernel_regularizer=...)等成什麼樣的消費者從獲得tf.losses.get_regularization_losses()最好採用這種方式來定義L1 / L2正則化損失。

  • 在發布者模型中,避免通過tf.train.FtrlOptimizertf.train.ProximalGradientDescentOptimizer和其他鄰近優化器的l1_l2_regularization_strength參數定義L1 / L2正則化。這些不會與模塊一起導出,並且全局設置正則化強度可能不適合於使用者。除了在寬模型(即稀疏線性模型)或寬和深模型中的L1正則化之外,應該可以使用單個正則化損失代替。

  • 如果您使用輟學,批處理規範化或類似的訓練技術,請將其超參數設置為對許多預期用途有意義的值。輟學率可能必鬚根據目標問題的過度擬合傾向進行調整。在批次歸一化中,動量(aka衰減係數)應足夠小,以便能夠使用小數據集和/或大批次進行微調。對於高級消費者,請考慮添加一個簽名,以暴露對關鍵超參數的控制。