Python 載入 TensorFlow 模型

TechSynapse發表於2024-08-19

1.SavedModel和HDF5載入TensorFlow模型

為了載入一個TensorFlow模型,我們首先需要明確模型的格式。TensorFlow支援多種模型格式,但最常見的兩種是SavedModel和HDF5(對於Keras模型)。這裡,我將分別給出載入這兩種模型格式的示例程式碼。

1.1載入SavedModel格式的TensorFlow模型

SavedModel是TensorFlow推薦的高階格式,用於儲存和載入整個TensorFlow程式,包括TensorFlow圖和檢查點。

示例程式碼

假設你已經有一個訓練好的SavedModel模型儲存在./saved_model目錄下。

import tensorflow as tf  
  
# 載入模型  
loaded_model = tf.saved_model.load('./saved_model')  
  
# 檢視模型的簽名  
print(list(loaded_model.signatures.keys()))  
  
# 假設你的模型有一個名為`serving_default`的簽名,並且接受一個名為`input`的輸入  
# 你可以這樣使用模型進行預測(假設輸入資料為x_test)  
# 注意:這裡的x_test需要根據你的模型輸入進行調整  
import numpy as np  
  
# 假設輸入是一個簡單的numpy陣列  
x_test = np.random.random((1, 28, 28, 1))  # 例如,用於MNIST模型的輸入  
  
# 轉換為Tensor  
x_test_tensor = tf.convert_to_tensor(x_test, dtype=tf.float32)  
  
# 建立一個批次,因為大多數模型都期望批次輸入  
input_data = {'input': x_test_tensor}  
  
# 呼叫模型  
predictions = loaded_model.signatures['serving_default'](input_data)  
  
# 列印預測結果  
print(predictions['output'].numpy())  # 注意:這裡的'output'需要根據你的模型輸出調整

1.2載入HDF5格式的Keras模型

HDF5格式是Keras(TensorFlow高層API)用於儲存和載入模型的常用格式。

示例程式碼

假設你有一個Keras模型儲存在model.h5檔案中。

from tensorflow.keras.models import load_model  
  
# 載入模型  
model = load_model('model.h5')  
  
# 檢視模型結構  
model.summary()  
  
# 假設你有一組測試資料x_test和y_test  
# 注意:這裡的x_test和y_test需要根據你的資料集進行調整  
import numpy as np  
  
x_test = np.random.random((10, 28, 28, 1))  # 假設的輸入資料  
y_test = np.random.randint(0, 10, size=(10, 1))  # 假設的輸出資料  
  
# 使用模型進行預測  
predictions = model.predict(x_test)  
  
# 列印預測結果  
print(predictions)

1.3注意

  • 確保你的模型檔案路徑(如'./saved_model''model.h5')是正確的。
  • 根據你的模型,你可能需要調整輸入資料的形狀和型別。
  • 對於SavedModel,模型的簽名(signature)和輸入輸出名稱可能不同,需要根據你的具體情況進行調整。
  • 這些示例假設你已經有了模型檔案和相應的測試資料。如果你正在從頭開始,你需要先訓練一個模型並儲存它。

2.TensorFlow中載入SavedModel模型

在TensorFlow中載入SavedModel模型是一個相對直接的過程。SavedModel是TensorFlow的一種封裝格式,它包含了完整的TensorFlow程式,包括計算圖(Graph)和引數(Variables),以及一個或多個tf.function簽名(Signatures)。這些簽名定義瞭如何向模型提供輸入和獲取輸出。

以下是在TensorFlow中載入SavedModel模型的步驟和示例程式碼:

2.1步驟

(1)確定SavedModel的路徑:首先,你需要知道SavedModel檔案被儲存在哪個目錄下。這個目錄應該包含一個saved_model.pb檔案和一個variables目錄(如果模型有變數的話)。

(2)使用tf.saved_model.load函式載入模型:TensorFlow提供了一個tf.saved_model.load函式,用於載入SavedModel。這個函式接受SavedModel的路徑作為引數,並返回一個tf.saved_model.Load物件,該物件包含了模型的所有簽名和函式。

(3)訪問模型的簽名:載入的模型物件有一個signatures屬性,它是一個字典,包含了模型的所有簽名。每個簽名都有一個唯一的鍵(通常是serving_default,但也可以是其他名稱),對應的值是一個函式,該函式可以接收輸入並返回輸出。

(4)使用模型進行預測:透過呼叫簽名對應的函式,並傳入適當的輸入資料,你可以使用模型進行預測。

2.2示例程式碼

import tensorflow as tf  
  
# 載入SavedModel  
model_path = './path_to_your_saved_model'  # 替換為你的SavedModel路徑  
loaded_model = tf.saved_model.load(model_path)  
  
# 檢視模型的簽名  
print(list(loaded_model.signatures.keys()))  # 通常會有一個'serving_default'  
  
# 假設你的模型有一個名為'serving_default'的簽名,並且接受一個名為'input'的輸入  
# 你可以這樣使用模型進行預測(假設你已經有了適當的輸入資料x_test)  
  
# 注意:這裡的x_test需要根據你的模型輸入進行調整  
# 假設x_test是一個Tensor或者可以轉換為Tensor的numpy陣列  
import numpy as np  
  
x_test = np.random.random((1, 28, 28, 1))  # 例如,對於MNIST模型的一個輸入  
  
# 將numpy陣列轉換為Tensor  
x_test_tensor = tf.convert_to_tensor(x_test, dtype=tf.float32)  
  
# 建立一個字典,將輸入Tensor對映到簽名的輸入引數名(這裡是'input')  
# 注意:'input'這個名稱需要根據你的模型簽名進行調整  
input_data = {'input': x_test_tensor}  
  
# 呼叫模型  
predictions = loaded_model.signatures['serving_default'](input_data)  
  
# 獲取預測結果  
# 注意:這裡的'output'需要根據你的模型輸出簽名進行調整  
# 如果你的模型有多個輸出,你可能需要訪問predictions字典中的多個鍵  
predicted_output = predictions['output'].numpy()  
  
# 列印預測結果  
print(predicted_output)

請注意,上面的程式碼示例假設你的模型簽名有一個名為input的輸入引數和一個名為output的輸出引數。然而,在實際應用中,這些名稱可能會根據你的模型而有所不同。因此,你需要檢查你的模型簽名以瞭解正確的引數名稱。你可以透過列印loaded_model.signatures['serving_default'].structured_outputs(對於TensorFlow 2.x的某些版本)或檢查你的模型訓練程式碼和儲存邏輯來獲取這些資訊。

3.TensorFlow中載入SavedModel模型進行預測示例

在TensorFlow中載入SavedModel模型是一個直接的過程,它允許你恢復之前儲存的整個TensorFlow程式,包括計算圖和權重。以下是一個詳細的示例,展示瞭如何在TensorFlow中載入一個SavedModel模型,並對其進行預測。

首先,確保你已經有一個SavedModel模型儲存在某個目錄中。這個目錄應該包含一個saved_model.pb檔案(或者在新版本的TensorFlow中可能不包含這個檔案,因為圖結構可能儲存在variables目錄的某個子目錄中),以及一個variables目錄,其中包含了模型的權重和變數。

3.1示例程式碼

import tensorflow as tf  
  
# 指定SavedModel的儲存路徑  
saved_model_path = './path_to_your_saved_model'  # 請替換為你的SavedModel實際路徑  
  
# 載入SavedModel  
loaded_model = tf.saved_model.load(saved_model_path)  
  
# 檢視模型的簽名  
# 注意:SavedModel可以有多個簽名,但通常會有一個預設的'serving_default'  
print(list(loaded_model.signatures.keys()))  
  
# 假設模型有一個預設的'serving_default'簽名,並且我們知道它的輸入和輸出  
# 通常,這些資訊可以在儲存模型時透過tf.function的inputs和outputs引數指定  
  
# 準備輸入資料  
# 這裡我們使用隨機資料作為示例,你需要根據你的模型輸入要求來調整  
import numpy as np  
  
# 假設模型的輸入是一個形狀為[batch_size, height, width, channels]的Tensor  
# 例如,對於MNIST模型,它可能是一個形狀為[1, 28, 28, 1]的Tensor  
input_data = np.random.random((1, 28, 28, 1)).astype(np.float32)  
  
# 將numpy陣列轉換為Tensor  
input_tensor = tf.convert_to_tensor(input_data)  
  
# 建立一個字典,將輸入Tensor對映到簽名的輸入引數名  
# 注意:這裡的'input_tensor'需要根據你的模型簽名中的輸入引數名來調整  
# 如果簽名中的輸入引數名確實是'input_tensor',則保持不變;否則,請替換為正確的名稱  
# 但在很多情況下,預設的名稱可能是'input'或類似的東西  
input_dict = {'input': input_tensor}  # 假設輸入引數名為'input'  
  
# 呼叫模型進行預測  
# 使用簽名對應的函式,並傳入輸入字典  
predictions = loaded_model.signatures['serving_default'](input_dict)  
  
# 獲取預測結果  
# 預測結果通常是一個字典,其中包含了一個或多個輸出Tensor  
# 這裡的'output'需要根據你的模型簽名中的輸出引數名來調整  
# 如果簽名中只有一個輸出,並且它的名字是'output',則可以直接使用;否則,請替換為正確的鍵  
predicted_output = predictions['output'].numpy()  
  
# 列印預測結果  
print(predicted_output)  
  
# 注意:如果你的模型有多個輸出,你需要從predictions字典中訪問每個輸出  
# 例如:predictions['second_output'].numpy()

3.2注意事項

(1)輸入和輸出名稱:在上面的示例中,我使用了inputoutput作為輸入和輸出的名稱。然而,這些名稱可能並不適用於你的模型。你需要檢查你的模型簽名來確定正確的輸入和輸出引數名。你可以透過列印loaded_model.signatures['serving_default'].structured_inputsloaded_model.signatures['serving_default'].structured_outputs(對於TensorFlow 2.x的某些版本)來檢視這些資訊。

(2)資料型別和形狀:確保你的輸入資料具有模型期望的資料型別和形狀。如果資料型別或形狀不匹配,可能會導致錯誤。

(3)批處理:在上面的示例中,我建立了一個包含單個樣本的批次。如果你的模型是為批處理而設計的,並且你希望一次性處理多個樣本,請相應地調整輸入資料的形狀。

(4)錯誤處理:在實際應用中,你可能需要新增錯誤處理邏輯來處理載入模型時可能出現的任何異常,例如檔案不存在或模型格式不正確。

相關文章