圖像任務的通用 SavedModel API

本頁說明適用於圖像相關任務的 TF2 SavedModel 應如何實作可重複使用的 SavedModel API。(這取代了現已棄用的 TF1 Hub 格式「圖像通用簽章」。)

圖像特徵向量

用法摘要

圖像特徵向量」是一個密集的 1 維張量,代表整個圖像,通常用於消費者模型中的簡單前饋分類器。(就傳統 CNN 而言,這是空間範圍已匯集或展平後的瓶頸值,但在完成分類之前;如需分類,請參閱下方的圖像分類。)

用於圖像特徵擷取的「可重複使用 SavedModel」在根物件上具有 __call__ 方法,可將一批圖像對應到一批特徵向量。可以這樣使用

obj = hub.load("path/to/model")  # That's tf.saved_model.load() after download.
images = ...  # A batch of images with shape [batch_size, height, width, 3].
features = obj(images)   # A batch with shape [batch_size, num_features].

在 Keras 中,對等用法如下

features = hub.KerasLayer("path/to/model")(images)

輸入遵循圖像輸入的一般慣例。模型文件會指定輸入的 heightwidth 的允許範圍。

輸出是 dtype 為 float32 且形狀為 [batch_size, num_features] 的單一張量。batch_size 與輸入中的相同。num_features 是模組特定的常數,與輸入大小無關。

API 詳細資訊

「可重複使用 SavedModel API」也提供 obj.variables 清單 (例如,用於在非立即載入時初始化)。

支援微調的模型提供 obj.trainable_variables 清單。可能需要您傳遞 training=True 以在訓練模式下執行 (例如,用於 dropout)。有些模型允許使用選用引數來覆寫超參數 (例如,dropout 率;將在模型文件中說明)。模型也可能提供 obj.regularization_losses 清單。如需詳細資訊,請參閱「可重複使用 SavedModel API」

在 Keras 中,這由 hub.KerasLayer 處理:使用 trainable=True 初始化以啟用微調,並 (在極少數情況下套用 hparam 覆寫) 使用 arguments=dict(some_hparam=some_value, ...))。

注意事項

是否對輸出特徵套用 dropout 應留給模型消費者決定。「SavedModel」本身不應對實際輸出執行 dropout (即使它在其他地方內部使用 dropout)。

範例

用於圖像特徵向量的「可重複使用 SavedModel」用於:

圖像分類

用法摘要

圖像分類」將圖像的像素對應到線性分數 (logits),以判斷是否屬於模組發布者所選分類系統的類別。這可讓模型消費者從發布者模組學習的特定分類中得出結論。(對於具有一組新類別的圖像分類,常見的做法是改為重複使用「圖像特徵向量」模型和新的分類器。)

用於圖像分類的「可重複使用 SavedModel」在根物件上具有 __call__ 方法,可將一批圖像對應到一批 logits。可以這樣使用

obj = hub.load("path/to/model")  # That's tf.saved_model.load() after download.
images = ...  # A batch of images with shape [batch_size, height, width, 3].
logits = obj(images)   # A batch with shape [batch_size, num_classes].

在 Keras 中,對等用法如下

logits = hub.KerasLayer("path/to/model")(images)

輸入遵循圖像輸入的一般慣例。模型文件會指定輸入的 heightwidth 的允許範圍。

輸出 logits 是 dtype 為 float32 且形狀為 [batch_size, num_classes] 的單一張量。batch_size 與輸入中的相同。num_classes 是分類中的類別數量,這是模型特定的常數。

logits[i, c] 是預測範例 i 是否屬於索引為 c 的類別的分數。

這些分數是否要與 softmax (用於互斥類別)、sigmoid (用於正交類別) 或其他方法搭配使用,取決於基礎分類。模組文件應說明此點,並參閱類別索引的定義。

API 詳細資訊

「可重複使用 SavedModel API」也提供 obj.variables 清單 (例如,用於在非立即載入時初始化)。

支援微調的模型提供 obj.trainable_variables 清單。可能需要您傳遞 training=True 以在訓練模式下執行 (例如,用於 dropout)。有些模型允許使用選用引數來覆寫超參數 (例如,dropout 率;將在模型文件中說明)。模型也可能提供 obj.regularization_losses 清單。如需詳細資訊,請參閱「可重複使用 SavedModel API」

在 Keras 中,這由 hub.KerasLayer 處理:使用 trainable=True 初始化以啟用微調,並 (在極少數情況下套用 hparam 覆寫) 使用 arguments=dict(some_hparam=some_value, ...))。

圖像輸入

這適用於所有類型的圖像模型。

採用一批圖像作為輸入的模型,會將其接受為 dtype 為 float32 且形狀為 [batch_size, height, width, 3] 的密集 4 維張量,其元素是像素的 RGB 色彩值,已正規化到 [0, 1] 範圍。這就是您從 tf.image.decode_*() 後接 tf.image.convert_image_dtype(..., tf.float32) 取得的結果。

模型接受任何 batch_size。模型文件會指定 heightwidth 的允許範圍。最後一個維度固定為 3 個 RGB 通道。

建議模型自始至終使用張量的 channels_last (或 NHWC) 版面配置,並交由 TensorFlow 的圖形最佳化工具在需要時重寫為 channels_first (或 NCHW)。