你知道嗎?在 iOS 設備上也可以直接訓練 LeNet 卷積神經(jīng)網(wǎng)絡,而且性能一點也不差,iPhone 和 iPad 也能化為實實在在的生產(chǎn)力。
機器學習要想在移動端上應用一般分為如下兩個階段,第一個階段是訓練模型,第二個階段是部署模型。常規(guī)的做法是在算力強大的 GPU 或 TPU 上對模型進行訓練,之后再使用一系列模型壓縮的方法,將其轉(zhuǎn)換為可在移動端上運行的模型,并與 APP 連通起來。Core ML 主要解決的就是最后的模型部署這一環(huán)節(jié),它為開發(fā)者提供了一個便捷的模型轉(zhuǎn)換工具,可以很方便地將訓練好的模型轉(zhuǎn)換為 Core ML 類型的模型文件,實現(xiàn)模型與 APP 數(shù)據(jù)的互通。
以上是常規(guī)的操作。然而,隨著 iOS 設備計算性能的提升,坊間不斷產(chǎn)生一些 iPad Pro 算力超過普通筆記本的言論。于是乎,就出現(xiàn)了這么一位「勇者」,開源了可以直接在 iOS 設備上訓練神經(jīng)網(wǎng)絡的項目。
項目作者在 macOS、iOS 模擬器和真實的 iOS 設備上進行了測試。用 60000 個 MNIST 樣本訓練了 10 個 epoch,在模型架構與訓練參數(shù)完全相同的前提下,使用 Core ML 在 iPhone 11 上訓練大概需要 248 秒,在 i7 MacBook Pro 上使用 TensorFlow 2.0 訓練需要 158 秒(僅使用 CPU 的情況下),但準確率都超過了 0.98。
當然,在 248 秒和 158 秒之間還有非常大的差距,但進行此項實驗的目的并不是比速度,而是為了探索用移動設備或可穿戴設備在本地進行訓練的可行性,因為這些設備中的數(shù)據(jù)往往比較敏感,而且涉及隱私,本地訓練可以提供更好的安全性。
項目地址:https://github.com/JacopoMangiavacchi/MNIST-CoreML-Training
MNIST 數(shù)據(jù)集
在這篇文章中,作者介紹了如何使用 MNIST 數(shù)據(jù)集部署一個圖像分類模型,值得注意的是,這個 Core ML 模型是在 iOS 設備上直接訓練的,而無需提前在其他 ML 框架中進行訓練。
作者在這里使用了一個很有名的數(shù)據(jù)集——MNIST 手寫數(shù)字數(shù)據(jù)集。它提供了 60000 個訓練樣本和 10000 個測試樣本,都是從 0 到 9 的 28x28 手寫數(shù)字黑白圖像。
LeNet CNN 架構
如果你想了解 CNN 的細節(jié)和優(yōu)勢,從 LeNet 架構著手是一個再好不過的起點。LeNet CNN+MNIST 數(shù)據(jù)集的組合是機器學習「訓練」的標準組合,簡直相當于深度學習圖像分類的「Hello, World」。
這篇文章主要著眼于如何在 iOS 設備上直接為 MNIST 數(shù)據(jù)集構建和訓練一個 LeNet CNN 模型。接下來,研究者將把它與基于著名的 ML 框架(如 TensorFlow)的經(jīng)典「Python」實現(xiàn)方法進行比較。
在 Swift 中為 Core ML 的訓練準備數(shù)據(jù)
在討論如何在 Core ML 中創(chuàng)建及訓練 LeNet CNN 網(wǎng)絡之前,我們可以先看一下如何準備 MNIST 訓練數(shù)據(jù),以將其正確地 batch 至 Core ML 運行中去。
在下列 Swift 代碼中,訓練數(shù)據(jù)的 batch 是專門為 MNIST 數(shù)據(jù)集準備的,只需將每個圖像的「像素」值從 0 到 255 的初始范圍歸一化至 0 到 1 之間的「可理解」范圍即可。
為 Core ML 模型(CNN)訓練做準備
處理好訓練數(shù)據(jù)的 batch 并將其歸一化之后,現(xiàn)在就可以使用 SwiftCoreMLTools 庫在 Swift 的 CNN Core ML 模型中進行一系列本地化準備。
在下列的 SwiftCoreMLTools DSL 函數(shù)構建器代碼中,還可以查看在相同的情況中如何傳遞至 Core ML 模型中。同時,也包含了基本的訓練信息、超參數(shù)等,如損失函數(shù)、優(yōu)化器、學習率、epoch 數(shù)、batch size 等等。
使用 Adam 優(yōu)化器訓練神經(jīng)網(wǎng)絡,具體參數(shù)如下:
接下來是構建 CNN 網(wǎng)絡,卷積層、激活與池化層定義如下:
再使用一組與前面相同的卷積、激活與池化操作,之后輸入 Flatten 層,再經(jīng)過兩個全連接層后使用 Softmax 輸出結果。
得到的模型
剛剛構建的 Core ML 模型有兩個卷積和最大池化嵌套層,在將數(shù)據(jù)全部壓平之后,連接一個隱含層,最后是一個全連接層,經(jīng)過 Softmax 激活后輸出結果。
基準 TensorFlow 2.0 模型
為了對結果進行基準測試,尤其是運行時間方面的訓練效果,作者還使用 TensorFlow 2.0 重新創(chuàng)建了同一 CNN 模型的精確副本。
下方的的 Python 代碼展示了 TF 中的同一模型架構和每層 OutPut Shape 的情況:
可以看到,這里的層、層形狀、卷積過濾器和池大小與使用 SwiftCoreMLTools 庫在設備上創(chuàng)建的 Core ML 模型完全相同。
比較結果
在查看訓練執(zhí)行時間性能之前,首先確保 Core ML 和 TensorFlow 模型都訓練了相同的 epoch 數(shù)(10),用相同的超參數(shù)在相同的 10000 張測試樣本圖像上獲得非常相似的準確度度量。
從下面的 Python 代碼中可以看出,TensorFlow 模型使用 Adam 優(yōu)化器和分類交叉熵損失函數(shù)進行訓練,測試用例的最終準確率結果大于 0.98。
Core ML 模型的結果如下圖所示,它使用了和 TensorFlow 相同的優(yōu)化器、損失函數(shù)以及訓練集和測試集,可以看到,其識別準確率也超過了 0.98。
(免責聲明:本網(wǎng)站內(nèi)容主要來自原創(chuàng)、合作伙伴供稿和第三方自媒體作者投稿,凡在本網(wǎng)站出現(xiàn)的信息,均僅供參考。本網(wǎng)站將盡力確保所提供信息的準確性及可靠性,但不保證有關資料的準確性及可靠性,讀者在使用前請進一步核實,并對任何自主決定的行為負責。本網(wǎng)站對有關資料所引致的錯誤、不確或遺漏,概不負任何法律責任。
任何單位或個人認為本網(wǎng)站中的網(wǎng)頁或鏈接內(nèi)容可能涉嫌侵犯其知識產(chǎn)權或存在不實內(nèi)容時,應及時向本網(wǎng)站提出書面權利通知或不實情況說明,并提供身份證明、權屬證明及詳細侵權或不實情況證明。本網(wǎng)站在收到上述法律文件后,將會依法盡快聯(lián)系相關文章源頭核實,溝通刪除相關內(nèi)容或斷開相關鏈接。 )