儲存及載入模型

TensorFlow.js 提供儲存和載入使用 Layers API 建立或從現有 TensorFlow 模型轉換而來的模型的功能。這些模型可能是您自行訓練的模型,或是由其他人訓練的模型。使用 Layers API 的主要優點是,使用它建立的模型可序列化,這也是我們將在本教學課程中探討的內容。

本教學課程將著重於儲存和載入 TensorFlow.js 模型 (可透過 JSON 檔案識別)。我們也可以匯入 TensorFlow Python 模型。載入這些模型的相關資訊將在以下兩個教學課程中說明

儲存 tf.Model

tf.Modeltf.Sequential 都提供 model.save 函式,可讓您儲存模型的拓撲權重

  • 拓撲:這是描述模型架構 (即模型使用的運算) 的檔案。其中包含對模型權重的參照,這些權重會儲存在外部。

  • 權重:這些是二進位檔案,以有效率的格式儲存指定模型的權重。它們通常儲存在與拓撲相同的資料夾中。

讓我們看看儲存模型的程式碼範例

const saveResult = await model.save('localstorage://my-model-1');

以下幾點注意事項

  • save 方法會採用以配置開頭的類似網址的字串引數。這會描述我們嘗試將模型儲存到的目的地類型。在上述範例中,配置為 localstorage://
  • 配置後面接著路徑。在上述範例中,路徑為 my-model-1
  • save 方法為非同步。
  • model.save 的傳回值為 JSON 物件,其中包含模型的拓撲和權重位元組大小等資訊。
  • 用於儲存模型的環境不會影響哪些環境可以載入模型。在 node.js 中儲存模型不會阻止在瀏覽器中載入模型。

以下我們將檢視可用的不同配置。

本機儲存空間 (僅限瀏覽器)

配置: localstorage://

await model.save('localstorage://my-model');

這會將模型以 my-model 名稱儲存在瀏覽器的本機儲存空間中。這會在重新整理之間持續保存,但如果空間成為問題,使用者或瀏覽器本身可以清除本機儲存空間。每個瀏覽器也會針對指定網域在本機儲存空間中儲存多少資料設定自己的限制。

IndexedDB (僅限瀏覽器)

配置: indexeddb://

await model.save('indexeddb://my-model');

這會將模型儲存到瀏覽器的 IndexedDB 儲存空間。與本機儲存空間一樣,它會在重新整理之間持續保存,而且儲存物件的大小限制也往往較大。

檔案下載 (僅限瀏覽器)

配置: downloads://

await model.save('downloads://my-model');

這會導致瀏覽器將模型檔案下載到使用者的電腦。將產生兩個檔案

  1. 名為 [my-model].json 的文字 JSON 檔案,其中包含拓撲和對下方所述權重檔案的參照。
  2. 名為 [my-model].weights.bin 的二進位檔案,其中包含權重值。

您可以變更名稱 [my-model] 以取得具有不同名稱的檔案。

由於 .json 檔案使用相對路徑指向 .bin,因此這兩個檔案應位於相同的資料夾中。

HTTP(S) 要求

配置: http://https://

await model.save('http://model-server.domain/upload')

這會建立網路要求,將模型儲存到遠端伺服器。您應控管該遠端伺服器,以確保其能夠處理要求。

模型將透過 POST 要求傳送至指定的 HTTP 伺服器。POST 的主體採用 multipart/form-data 格式,且包含兩個檔案

  1. 名為 model.json 的文字 JSON 檔案,其中包含拓撲和對下方所述權重檔案的參照。
  2. 名為 model.weights.bin 的二進位檔案,其中包含權重值。

請注意,這兩個檔案的名稱將永遠與上述指定名稱完全相同 (名稱已內建於函式中)。此 API 文件 包含 Python 程式碼片段,示範如何使用 flask 網頁架構來處理源自 save 的要求。

通常您必須將更多引數或要求標頭傳遞至 HTTP 伺服器 (例如,用於驗證,或如果您想要指定模型應儲存於其中的資料夾)。您可以透過取代 tf.io.browserHTTPRequest 中的網址字串引數,更精細地控制 save 中要求的這些層面。此 API 在控制 HTTP 要求方面提供更高的彈性。

例如

await model.save(tf.io.browserHTTPRequest(
    'http://model-server.domain/upload',
    {method: 'PUT', headers: {'header_key_1': 'header_value_1'} }));

原生檔案系統 (僅限 Node.js)

配置: file://

await model.save('file:///path/to/my-model');

在 Node.js 上執行時,我們也可以直接存取檔案系統,並將模型儲存在其中。上述指令會將兩個檔案儲存到 scheme 後面指定的 path

  1. 名為 [model].json 的文字 JSON 檔案,其中包含拓撲和對下方所述權重檔案的參照。
  2. 名為 [model].weights.bin 的二進位檔案,其中包含權重值。

請注意,這兩個檔案的名稱將永遠與上述指定名稱完全相同 (名稱已內建於函式中)。

載入 tf.Model

假設模型是使用上述其中一種方法儲存的,我們可以透過 tf.loadLayersModel API 載入模型。

讓我們看看載入模型的程式碼範例

const model = await tf.loadLayersModel('localstorage://my-model-1');

以下幾點注意事項

  • model.save() 類似,loadLayersModel 函式會採用以配置開頭的類似網址的字串引數。這會描述我們嘗試從中載入模型的目的地類型。
  • 配置後面接著路徑。在上述範例中,路徑為 my-model-1
  • 類似網址的字串可以取代為符合 IOHandler 介面的物件。
  • tf.loadLayersModel() 函式為非同步。
  • tf.loadLayersModel 的傳回值為 tf.Model

以下我們將檢視可用的不同配置。

本機儲存空間 (僅限瀏覽器)

配置: localstorage://

const model = await tf.loadLayersModel('localstorage://my-model');

這會從瀏覽器的 本機儲存空間載入名為 my-model 的模型。

IndexedDB (僅限瀏覽器)

配置: indexeddb://

const model = await tf.loadLayersModel('indexeddb://my-model');

這會從瀏覽器的 IndexedDB 儲存空間載入模型。

HTTP(S)

配置: http://https://

const model = await tf.loadLayersModel('http://model-server.domain/download/model.json');

這會從 HTTP 端點載入模型。載入 json 檔案後,函式會要求 json 檔案參照的對應 .bin 檔案。

原生檔案系統 (僅限 Node.js)

配置: file://

const model = await tf.loadLayersModel('file://path/to/my-model/model.json');

在 Node.js 上執行時,我們也可以直接存取檔案系統,並從中載入模型。請注意,在上述函式呼叫中,我們參照的是 model.json 檔案本身 (而在儲存時,我們指定的是資料夾)。對應的 .bin 檔案應與 json 檔案位於相同的資料夾中。

使用 IOHandler 載入模型

如果上述配置不足以滿足您的需求,您可以使用 IOHandler 實作自訂載入行為。TensorFlow.js 提供的一個 IOHandlertf.io.browserFiles,可讓瀏覽器使用者在瀏覽器中上傳模型檔案。如需更多資訊,請參閱文件

使用自訂 IOHandler 儲存及載入模型

如果上述配置不足以滿足您的載入或儲存需求,您可以透過實作 IOHandler 來實作自訂序列化行為。

IOHandler 是具有 saveload 方法的物件。

save 函式採用一個參數,該參數符合 ModelArtifacts 介面,且應傳回 Promise,該 Promise 會解析為 SaveResult 物件。

load 函式不採用任何參數,且應傳回 Promise,該 Promise 會解析為 ModelArtifacts 物件。這與傳遞至 save 的物件相同。

如需如何實作 IOHandler 的範例,請參閱 BrowserHTTPRequest