
前言
去年加入的CoreML framework大獲成功,相信許多開發(fā)者都已經(jīng)嘗試在自己的app里加入機器學習的功能了,然而從哪里獲取模型的問題一直不太好解決。即使蘋果提供了一個python工具 --- CoreML Tool,可以將caffe等模型轉(zhuǎn)成coreML模型,但支持的文件類型有限(后面支持了大多數(shù)類型),我嘗試過,對于我這種ML領(lǐng)域小白,感覺也不太好用。所以蘋果今年提供了一個全新的庫---createML,他是swift專屬的framework,可以解決獲取CoreML模型的難題。

這個topic主要介紹了
- Transfer Learning(遷移學習)
- 圖像識別
- 文本識別
- 表格數(shù)據(jù)推斷
通過createML和CoreML,可以只用swift一種語言,在mac上解決創(chuàng)建/訓(xùn)練/評估模型-跑模型-部署到端上運行,并且訓(xùn)練、評估模型都是一兩句代碼就可以實現(xiàn)。對于iOS開發(fā)者來說,引入機器學習的成本可以說非常低了,值得關(guān)注。

CreateML目前只能訓(xùn)練三種類型的數(shù)據(jù):圖像、文字和表格數(shù)據(jù)。
對應(yīng)目前的識別能力就是圖像、文本識別和根據(jù)表格數(shù)據(jù)推斷等。
Transfer Learning
我準備開始訓(xùn)練數(shù)據(jù),然而難題出現(xiàn)了,我上哪找大量用來訓(xùn)練的數(shù)據(jù)?
得益于transfer learning,僅僅需要少量數(shù)據(jù)就足夠了。由于蘋果本身在端上已經(jīng)內(nèi)置了多個自己的識別模型(應(yīng)該是一些大文件,蘋果訓(xùn)練了多年的數(shù)據(jù),我理解是萬物識別),我們訓(xùn)練的模型是基于蘋果模型的一種增強,具體就是將他的模型最后幾層layer重新根據(jù)我們的數(shù)據(jù)訓(xùn)練。最終做推斷時會結(jié)合蘋果的訓(xùn)練結(jié)果和你提供的數(shù)據(jù)的訓(xùn)練結(jié)果來推斷。

這樣訓(xùn)練時間大大減少,甚至幾秒鐘就能訓(xùn)練完成。
模型大小也能從100MB級別減少到KB級別。
transfer learning讓模型可以復(fù)用,個人開發(fā)者可以輕松訓(xùn)練出體積小的模型,讓app更加智能。同時體積小的文件方便下發(fā)到端上,甚至內(nèi)置在安裝包里發(fā)布。
圖像
首先要自己將圖像數(shù)據(jù)分類好,準備好用來訓(xùn)練的數(shù)據(jù)和用來評估的數(shù)據(jù)。下圖是一種分類方式,將每種類型的圖片放在一個文件夾里。然后創(chuàng)建一個swift playground

注意:需要macOS mojave 10.14Beta,Xcode10Beta,并且playground項目最好放在桌面,多試幾次import CreateML才能出來。

png或jpg文件都可以,尺寸沒有要求,把TestImages文件夾和TrainImages文件夾分別拖進來就可以了,當然也可以用純代碼的方式訓(xùn)練,流程是:
指定數(shù)據(jù)源 - 創(chuàng)建模型 - 評估模型 - 保存模型
如下圖。

這里我使用了https://github.com/Rubenfer/CreateML里提供的圖片,故意使用8張圖片來訓(xùn)練,只有貓和狗兩種類型,19張圖片用來評估預(yù)測,準確率居然100%,模型文件只有17KB。
然后我將dog文件夾名字改成cat,cat改成dog,發(fā)現(xiàn)識別準確率依然100%,對于錯誤分類的數(shù)據(jù)也能“正確”的預(yù)測出來,當然,你給一張貓狗以外的圖片肯定識別錯,因為結(jié)果枚舉里只有貓狗這兩種。不過transfer learning還是很牛逼了。
如果對模型滿意,只要將模型文件拖到項目里即可,具體CoreML文件的使用參考去年的https://developer.apple.com/videos/play/wwdc2017/703
建議自己嘗試https://github.com/Rubenfer/CreateML
文本
data source的格式支持以文件夾分類的txt文本、csv文件和json格式的文件。
文本識別的流程被極大簡化了,識別前的語言預(yù)測和文本分段都不需要考慮。流程和圖片識別類似,只是將MLImageClassifier換成了MLTextClassifier,如下圖。


雖然今年NLP支持了中文的詞性識別和中文機構(gòu)識別,但我在testData里加入中文好像導(dǎo)致死循環(huán)了,不太確定中文數(shù)據(jù)能否用在createML里。
關(guān)于NLP的使用,以前是用NSLinguisticTagger,今年有了一整套新的NL開頭的api,參考https://developer.apple.com/videos/play/wwdc2018/713/
建議自己嘗試https://github.com/Flight-School/Programming-Language-Classifier,可以獲得一個能夠識別多種編程語言的模型文件。

表格(TabularData)
createML使用MLDataTable來處理表格數(shù)據(jù),datasource支持csv、json,它是基于Turi的。
表格的行是一個example,列是一個feature,通常選取一個列作為target來預(yù)測,以example為單位挖掘每個feature之間的關(guān)系。這里把price作為target,評估數(shù)據(jù)時target列的數(shù)據(jù)對于模型是隱藏的,通過挖掘到的關(guān)系來對price做一個inference(預(yù)測),再和真實數(shù)據(jù)里的price比較,評估準確率。


流程和上面的類似。randomSplit可以將你提供的數(shù)據(jù)源隨機按比例劃分成訓(xùn)練數(shù)據(jù)和評估數(shù)據(jù)。這里返回的元組,80%的數(shù)據(jù)是用來訓(xùn)練的,20%是用來評估的。table數(shù)據(jù)的訓(xùn)練有很多訓(xùn)練器,包括MLBoostedTreeRegressor、MLDecisionTreeRegressor、MLRandomForestRegressor、MLLinearRegressor等,如果不知道要用哪個,可以直接用MLRegressor,他會自動選擇一個最合適的。

總結(jié)
我的理解:createML訓(xùn)練出來的模型必然是依賴蘋果模型的,其實本質(zhì)是用蘋果的模型來識別,所以離開蘋果的環(huán)境應(yīng)該無法使用。而我們?nèi)粘i_發(fā)中費很大力氣訓(xùn)練出一個可用的模型,是希望它能運行在多平臺的,這樣看來CreateML最終產(chǎn)出的CoreML只支持iOS/macOS,在這點上有很大局限性,所以這可能是蘋果接下來要解決的另一個難題。
能否讓CoreML運行在android等其他平臺,將成為CoreML普及的一個關(guān)鍵,目前來看只有純粹的開發(fā)iOS/macOS平臺的個人開發(fā)者會使用CoreML和CreateML。
雖然如此,我們還是應(yīng)該開始嘗試,畢竟ML的準入門檻已經(jīng)降低了很多,以后ML也必將成為每個app的標配。