模型轉換

TensorFlow.js 隨附多種可在瀏覽器中直接使用的預先訓練模型,這些模型可在我們的模型存放區中找到。不過,您可能在其他地方找到或製作了 TensorFlow 模型,而您想在 Web 應用程式中使用。TensorFlow.js 為此目的提供了模型轉換器。TensorFlow.js 轉換器有兩個元件

  1. 可轉換 Keras 和 TensorFlow 模型以在 TensorFlow.js 中使用的命令列公用程式。
  2. 用於在瀏覽器中使用 TensorFlow.js 載入和執行模型的 API。

轉換您的模型

TensorFlow.js 轉換器可搭配多種不同的模型格式使用

SavedModel:這是儲存 TensorFlow 模型時的預設格式。SavedModel 格式記錄於此處

Keras 模型:Keras 模型通常儲存為 HDF5 檔案。如要進一步瞭解儲存 Keras 模型,請參閱此處

TensorFlow Hub 模組:這些模型已封裝以在 TensorFlow Hub (用於共用和探索模型的平台) 上發布。模型程式庫可在此處找到。

根據您嘗試轉換的模型類型,您需要將不同的引數傳遞至轉換器。例如,假設您已將名為 model.h5 的 Keras 模型儲存到您的 tmp/ 目錄。若要使用 TensorFlow.js 轉換器轉換您的模型,您可以執行下列指令

$ tensorflowjs_converter --input_format=keras /tmp/model.h5 /tmp/tfjs_model

這會轉換 /tmp/model.h5 中的模型,並將 model.json 檔案以及二進位權重檔案輸出到您的 tmp/tfjs_model/ 目錄。

關於對應於不同模型格式的命令列引數的更多詳細資訊,請參閱 TensorFlow.js 轉換器 README

在轉換過程中,我們會遍歷模型圖表,並檢查 TensorFlow.js 是否支援每個運算。如果支援,我們會將圖表寫入瀏覽器可以使用的格式。我們嘗試最佳化模型以在 Web 上提供服務,方法是將權重分片到 4MB 檔案中,這樣瀏覽器就可以快取這些檔案。我們也會嘗試使用開放原始碼 Grappler 專案來簡化模型圖表本身。圖表簡化包括將相鄰的運算摺疊在一起、消除常見的子圖等。這些變更對模型的輸出沒有影響。為了進一步最佳化,使用者可以傳入引數,指示轉換器將模型量化為特定位元組大小。量化是一種透過以較少位元表示權重來縮減模型大小的技術。使用者必須小心確保其模型在量化後仍能維持可接受的準確度。

如果我們在轉換期間遇到不支援的運算,程序就會失敗,我們會向使用者印出運算的名稱。歡迎在我們的 GitHub 上提交問題,讓我們知道這個情況,我們會嘗試根據使用者需求實作新的運算。

最佳做法

雖然我們盡一切努力在轉換期間最佳化您的模型,但通常確保模型效能良好的最佳方法是以資源受限的環境為考量來建構模型。這表示應盡可能避免過於複雜的架構,並盡量減少參數 (權重) 的數量。

執行您的模型

成功轉換模型後,您最終會得到一組權重檔案和一個模型拓撲檔案。TensorFlow.js 提供模型載入 API,您可以使用這些 API 擷取這些模型資產,並在瀏覽器中執行推論。

以下是轉換後的 TensorFlow SavedModel 或 TensorFlow Hub 模組的 API 範例

const model = await tf.loadGraphModel(‘path/to/model.json’);

以下是轉換後的 Keras 模型的範例

const model = await tf.loadLayersModel(‘path/to/model.json’);

tf.loadGraphModel API 會傳回 tf.FrozenModel,這表示參數是固定的,您將無法使用新資料微調模型。tf.loadLayersModel API 會傳回可訓練的 tf.Model。如要瞭解如何訓練 tf.Model,請參閱模型訓練指南

轉換後,最好執行幾次推論並評估模型的速度。我們有一個獨立的效能評估頁面可用於此目的:https://tensorflow.github.io/tfjs/e2e/benchmarks/local-benchmark/index.html 您可能會注意到我們捨棄了初始暖機執行的測量結果,這是因為 (一般而言) 由於建立紋理和編譯著色器的額外負擔,模型的第一次推論會比後續推論慢好幾倍。