機器學習問題不僅是一個科學問題,更是一個工程問題。
大多數年輕的數據科學家都希望將大部分時間花在構建完美的機器學習模型上,但是企業不僅需要訓練一個完美的模型,同時也需要將其部署,向用戶提供便捷的服務。
如下圖所示,機器學習系統由機器學習代只包含一小部分,而在中間的小黑匣子周圍,所需要的基礎設施龐大而復雜。
因此,在實際應用中,一個優秀的程序員不僅要學會構建完美的機器學習模型上,同時還需要將其部署向用戶提供便捷的服務。
在本教程中,筆者將重點放到了機器學習模型部署上面,並使用最為熱門的 TensorFlow 2 框架完成實踐。
此教程內容節選自實驗樓近期好課《TensorFlow 2 模型部署方法實踐》,教程采用的實驗環境均為實驗樓提供的在線web環境。
強烈建議想跟着教程學習的小伙伴可以登陸實驗樓官網,直接上手敲代碼會更好。
預訓練模型使用方法
首先,我們聊聊預訓練模型使用方法。
1.介紹
本節實驗將介紹 MobileNet 系列中的 MobileNetV2 模型,MobileNet 是為移動端和嵌入式端深度學習應用所設計的網絡,使得在 CPU 上訓練也能達到理想的速度要求。
后續的實驗中,我們將使用此模型進行部署演示。
2.知識點
- Keras 導入預訓練模型
- 預訓練模型的使用方法
- 保存模型為 HDF5 格式
- 保存模型為 SavedModel 格式
3.環境配置
目前,TensorFlow 2 已正式發布,你需要通過 pip install -U tensorflow 進行升級安裝。線上環境中,我們需要先卸載老版本,然后再安裝 TensorFlow 2。
# 解決線上環境的一些依賴問題,本地無需這些操作
!pip install --upgrade pip msgpack setuptools h5py
!pip uninstall tensorflow -y
!pip install -U --ignore-installed wrapt # 安裝 TensorFlow 2.0
4.選擇圖片
在本實驗中,我們使用 skimage 庫中的自帶圖片進行圖像識別。skimage 中自帶一張貓的圖片,稍后我們用這張圖片進行識別任務。
from skimage import data
import matplotlib.pyplot as plt
%matplotlib inline
# skimage 中自帶一張貓的圖片
image = data.chelsea()
plt.imshow(image)
(注:如果你對課程所使用的實驗樓 Notebook 在線環境不熟悉,可以先學習課程《實驗樓 Notebook 在線環境使用指南》。)
5.導入預訓練模型
接下來從 Keras-applications 中導入預訓練模型 MobileNetV2。由於原模型托管在海外服務器,在實驗樓環境中,需要將預訓練模型從實驗樓鏡像服務器下載到 ~/.keras/models 目錄下,方便后續載入模型。
# 下載預訓練模型到線上環境指定目錄
!wget -nc "https://labfile.oss.aliyuncs.com/courses/1435/mobilenet_v2_weights_tf_dim_ordering_tf_kernels_1.0_224.h5" -P "/root/.keras/models"
!wget -nc "https://labfile.oss.aliyuncs.com/courses/1435/imagenet_class_index.json" -P "/root/.keras/models"
通過指定權重 weights='imagenet' 來載入 ImageNet 預訓練模型。
from tensorflow.keras.applications.mobilenet_v2 import MobileNetV2
# 載入 ImageNet 預訓練模型
model = MobileNetV2(weights='imagenet')
model.summary()
6.數據處理
接下來,我們嘗試對上面的示例圖片進行識別,首先需要將圖片處理成預訓練模型可以輸入的形狀。我們將圖像放縮到 224*224 的大小,並在圖像矩陣前面增加一維,即將 (224,224,3) 的圖像矩陣變成 (1,224,224,3)。
然后,可以調用 preprocess_input 方法將向量處理成 MobileNetV2 最終支持的輸入類型。
!pip install opencv-python==4.1.2.30 # 安裝所需 OpenCV
from tensorflow.keras.applications.mobilenet_v2 import preprocess_input
import numpy as np
import cv2
# 將圖像放縮到 224*224 的大小
image = cv2.resize(image, (224, 224))
# 將圖像矩陣前面增加一維,即將 (224,224,3) 的圖像矩陣變成 (1,224,224,3)
x = np.expand_dims(image, 0)
# 預處理圖像,在 Keras 中,在傳入圖片數組值 (0-255) 的基礎之上,
# 進行先除以 127.5,然后減 1,最后將值的范圍為放縮到 (-1,1) 上
x = preprocess_input(x)
x.shape
7.模型預測
接下來,使用 model 中的 predict 對輸入數據進行預測,模型輸出為一個 (1,1000) 的向量,向量中每個元素表示對應標簽的預測值。
output = model.predict(x)
output.shape
這里使用 decode_predictions 對模型輸出的向量進行解碼,解碼的結果就是預測的結果,這里 top=5 表示輸出前五個最有可能的類別。
from tensorflow.keras.applications.mobilenet_v2 import decode_predictions
preds = decode_predictions(output, top=5)
preds
通過輸出結果可以看到,模型預測圖片最可能的類別是 Egyptian cat。
8.保存模型
我們可以在訓練期間和訓練完成后,對模型進行保存,而模型部署就是使用保存后的模型進行實際應用。在訓練過程中, TensorFlow 2 提供了兩種方式來保存模型。
1)HDF5 文件
在實驗的一開始,我們下載下來的預訓練模型mobilenet_v2_weights_tf_dim_ordering_tf_kernels_1.0_224.h5 是 HDF5 格式的文件,可以將保存的模型視為單個二進制 blob,里面同時保存了模型權重、模型結構和優化器配置。
2)SavedModel
在 TensorFlow 2 中,還提供了 SavedModel 方式來保存模型,SavedModel 的優點是與語言無關,如可以在 Python 中訓練模型,然后在 Java 中加載。另外使用 TensorFlow Serving 來部署模型時必須使用 SavedModel 格式,SavedModel 轉換方法具體實現如下。
import tensorflow as tf
import time
saved_model_path = './saved_models/{}'.format(int(time.time()))
# 創建一個 SavedModel,並將其放在帶有 tf.keras.experimental.export_saved_model 的帶時間戳的目錄中
tf.keras.models.save_model(model, saved_model_path)
在 saved_model_path 目錄下,
.
├── assets
├── saved_model.pb
└── variables
├── variables.data-00000-of-00001
└── variables.index
saved_model.pb 為數據流圖文件,它包含圖形結構, variables 文件夾中保存的是 ckpt 文件集合,variables.data-xxx 保存了參數的值,variables.index 保存了對應的各個參數。
9.實驗總結
在本節實驗中,我們學習了 Keras-applications 預訓練模型的使用方法,並將預訓練模型從 h5 格式轉換為 SavedModel 格式。在之后的實驗,我們都將使用本實驗中的模型、處理方法以及生成結果。下一節實驗中,我們將使用 TensorFlow Serving 讀取 SavedModel 進行部署。
《TensorFlow 2 模型部署方法實踐》的第一節實驗就結束了。想訪問后續教程的朋友,可以點擊《TensorFlow 2 模型部署方法實踐》,之后的實驗還有:
近期該課程正在特惠,當前還有試學機會可以體驗哦。
補充閱讀:
新人可先選擇實驗樓的入門課程學習(全部免費):