你知道嗎?在 iOS 設備上也可以直接訓練 LeNet 卷積神經網絡,而且性能一點也不差,iPhone 和 iPad 也能化為實實在在的生產力。
機器學習要想在移動端上應用一般分為如下兩個階段,第一個階段是訓練模型,第二個階段是部署模型。常規的做法是在算力強大的 GPU 或 TPU 上對模型進行訓練,之後再使用一系列模型壓縮的方法,將其轉換為可在移動端上運行的模型,並與 APP 連通起來。Core ML 主要解決的就是最後的模型部署這一環節,它為開發者提供了一個便捷的模型轉換工具,可以很方便地將訓練好的模型轉換為 Core ML 類型的模型文件,實現模型與 APP 數據的互通。
以上是常規的操作。然而,隨着 iOS 設備計算性能的提升,坊間不斷產生一些 iPad Pro 算力超過普通筆記本的言論。於是乎,就出現了這麼一位「勇者」,開源了可以直接在 iOS 設備上訓練神經網絡的項目。
項目作者在 macOS、iOS 模擬器和真實的 iOS 設備上進行了測試。用 60000 個 MNIST 樣本訓練了 10 個 epoch,在模型架構與訓練參數完全相同的前提下,使用 Core ML 在 iPhone 11 上訓練大概需要 248 秒,在 i7 MacBook Pro 上使用 TensorFlow 2.0 訓練需要 158 秒(僅使用 CPU 的情況下),但準確率都超過了 0.98。
當然,在 248 秒和 158 秒之間還有非常大的差距,但進行此項實驗的目的並不是比速度,而是為了探索用移動設備或可穿戴設備在本地進行訓練的可行性,因為這些設備中的數據往往比較敏感,而且涉及隱私,本地訓練可以提供更好的安全性。
項目地址: MNIST 數據集 在這篇文章中,作者介紹瞭如何使用 MNIST 數據集部署一個圖像分類模型,值得注意的是,這個 Core ML 模型是在 iOS 設備上直接訓練的,而無需提前在其他 ML 框架中進行訓練。 作者在這裏使用了一個很有名的數據集——MNIST 手寫數字數據集。它提供了 60000 個訓練樣本和 10000 個測試樣本,都是從 0 到 9 的 28x28 手寫數字黑白圖像。 LeNet CNN 架構 如果你想了解 CNN 的細節和優勢,從 LeNet 架構着手是一個再好不過的起點。LeNet CNN MNIST 數據集的組合是機器學習「訓練」的標準組合,簡直相當於深度學習圖像分類的「Hello, World」。 這篇文章主要着眼於如何在 iOS 設備上直接為 MNIST 數據集構建和訓練一個 LeNet CNN 模型。接下來,研究者將把它與基於著名的 ML 框架(如 TensorFlow)的經典「Python」實現方法進行比較。 在 Swift 中為 Core ML 的訓練準備數據 在討論如何在 Core ML 中創建及訓練 LeNet CNN 網絡之前,我們可以先看一下如何準備 MNIST 訓練數據,以將其正確地 batch 至 Core ML 運行中去。 在下列 Swift 代碼中,訓練數據的 batch 是專門為 MNIST 數據集準備的,只需將每個圖像的「像素」值從 0 到 255 的初始範圍歸一化至 0 到 1 之間的「可理解」範圍即可。 為 Core ML 模型(CNN)訓練做準備 處理好訓練數據的 batch 並將其歸一化之後,現在就可以使用 SwiftCoreMLTools 庫在 Swift 的 CNN Core ML 模型中進行一系列本地化準備。 在下列的 SwiftCoreMLTools DSL 函數構建器代碼中,還可以查看在相同的情況中如何傳遞至 Core ML 模型中。同時,也包含了基本的訓練信息、超參數等,如損失函數、優化器、學習率、epoch 數、batch size 等等。 使用 Adam 優化器訓練神經網絡,具體參數如下: 接下來是構建 CNN 網絡,卷積層、激活與池化層定義如下: 再使用一組與前面相同的卷積、激活與池化操作,之後輸入 Flatten 層,再經過兩個全連接層後使用 Softmax 輸出結果。 得到的 CNN 模型 剛剛構建的 Core ML 模型有兩個卷積和最大池化嵌套層,在將數據全部壓平之後,連接一個隱含層,最後是一個全連接層,經過 Softmax 激活後輸出結果。 基準 TensorFlow 2.0 模型 為了對結果進行基準測試,尤其是運行時間方面的訓練效果,作者還使用 TensorFlow 2.0 重新創建了同一 CNN 模型的精確副本。 下方的的 Python 代碼展示了 TF 中的同一模型架構和每層 OutPut Shape 的情況: 可以看到,這裏的層、層形狀、卷積過濾器和池大小與使用 SwiftCoreMLTools 庫在設備上創建的 Core ML 模型完全相同。 比較結果 在查看訓練執行時間性能之前,首先確保 Core ML 和 TensorFlow 模型都訓練了相同的 epoch 數(10),用相同的超參數在相同的 10000 張測試樣本圖像上獲得非常相似的準確度度量。 從下面的 Python 代碼中可以看出,TensorFlow 模型使用 Adam 優化器和分類交叉熵損失函數進行訓練,測試用例的最終準確率結果大於 0.98。 Core ML 模型的結果如下圖所示,它使用了和 TensorFlow 相同的優化器、損失函數以及訓練集和測試集,可以看到,其識別準確率也超過了 0.98。