前言
去年加入的CoreML framework大獲成功泌绣,相信許多開發(fā)者都已經(jīng)嘗試在自己的app里加入機(jī)器學(xué)習(xí)的功能了阿迈,然而從哪里獲取模型的問題一直不太好解決。即使蘋果提供了一個(gè)python工具 --- CoreML Tool惠毁,可以將caffe等模型轉(zhuǎn)成coreML模型鞠绰,但支持的文件類型有限(后面支持了大多數(shù)類型),我嘗試過屿笼,對(duì)于我這種ML領(lǐng)域小白驴一,感覺也不太好用灶壶。所以蘋果今年提供了一個(gè)全新的庫---createML驰凛,他是swift專屬的framework,可以解決獲取CoreML模型的難題趣钱。
這個(gè)topic主要介紹了
- Transfer Learning(遷移學(xué)習(xí))
- 圖像識(shí)別
- 文本識(shí)別
- 表格數(shù)據(jù)推斷
通過createML和CoreML,可以只用swift一種語言胚宦,在mac上解決創(chuàng)建/訓(xùn)練/評(píng)估模型-跑模型-部署到端上運(yùn)行首有,并且訓(xùn)練、評(píng)估模型都是一兩句代碼就可以實(shí)現(xiàn)枢劝。對(duì)于iOS開發(fā)者來說井联,引入機(jī)器學(xué)習(xí)的成本可以說非常低了,值得關(guān)注您旁。
CreateML目前只能訓(xùn)練三種類型的數(shù)據(jù):圖像低矮、文字和表格數(shù)據(jù)被冒。
對(duì)應(yīng)目前的識(shí)別能力就是圖像、文本識(shí)別和根據(jù)表格數(shù)據(jù)推斷等轮蜕。
Transfer Learning
我準(zhǔn)備開始訓(xùn)練數(shù)據(jù)昨悼,然而難題出現(xiàn)了,我上哪找大量用來訓(xùn)練的數(shù)據(jù)跃洛?
得益于transfer learning率触,僅僅需要少量數(shù)據(jù)就足夠了。由于蘋果本身在端上已經(jīng)內(nèi)置了多個(gè)自己的識(shí)別模型(應(yīng)該是一些大文件汇竭,蘋果訓(xùn)練了多年的數(shù)據(jù)葱蝗,我理解是萬物識(shí)別)穴张,我們訓(xùn)練的模型是基于蘋果模型的一種增強(qiáng),具體就是將他的模型最后幾層layer重新根據(jù)我們的數(shù)據(jù)訓(xùn)練两曼。最終做推斷時(shí)會(huì)結(jié)合蘋果的訓(xùn)練結(jié)果和你提供的數(shù)據(jù)的訓(xùn)練結(jié)果來推斷皂甘。
這樣訓(xùn)練時(shí)間大大減少偿枕,甚至幾秒鐘就能訓(xùn)練完成。
模型大小也能從100MB級(jí)別減少到KB級(jí)別户辫。
transfer learning讓模型可以復(fù)用渐夸,個(gè)人開發(fā)者可以輕松訓(xùn)練出體積小的模型,讓app更加智能渔欢。同時(shí)體積小的文件方便下發(fā)到端上墓塌,甚至內(nèi)置在安裝包里發(fā)布。
圖像
首先要自己將圖像數(shù)據(jù)分類好奥额,準(zhǔn)備好用來訓(xùn)練的數(shù)據(jù)和用來評(píng)估的數(shù)據(jù)苫幢。下圖是一種分類方式,將每種類型的圖片放在一個(gè)文件夾里披坏。然后創(chuàng)建一個(gè)swift playground
注意:需要macOS mojave 10.14Beta态坦,Xcode10Beta,并且playground項(xiàng)目最好放在桌面棒拂,多試幾次import CreateML才能出來伞梯。
png或jpg文件都可以谜诫,尺寸沒有要求,把TestImages文件夾和TrainImages文件夾分別拖進(jìn)來就可以了攻旦,當(dāng)然也可以用純代碼的方式訓(xùn)練喻旷,流程是:
指定數(shù)據(jù)源 - 創(chuàng)建模型 - 評(píng)估模型 - 保存模型
如下圖。
這里我使用了https://github.com/Rubenfer/CreateML里提供的圖片且预,故意使用8張圖片來訓(xùn)練,只有貓和狗兩種類型烙无,19張圖片用來評(píng)估預(yù)測(cè)锋谐,準(zhǔn)確率居然100%,模型文件只有17KB截酷。
然后我將dog文件夾名字改成cat涮拗,cat改成dog,發(fā)現(xiàn)識(shí)別準(zhǔn)確率依然100%,對(duì)于錯(cuò)誤分類的數(shù)據(jù)也能“正確”的預(yù)測(cè)出來三热,當(dāng)然鼓择,你給一張貓狗以外的圖片肯定識(shí)別錯(cuò),因?yàn)榻Y(jié)果枚舉里只有貓狗這兩種就漾。不過transfer learning還是很牛逼了呐能。
如果對(duì)模型滿意,只要將模型文件拖到項(xiàng)目里即可从藤,具體CoreML文件的使用參考去年的https://developer.apple.com/videos/play/wwdc2017/703
建議自己嘗試https://github.com/Rubenfer/CreateML
文本
data source的格式支持以文件夾分類的txt文本催跪、csv文件和json格式的文件。
文本識(shí)別的流程被極大簡(jiǎn)化了夷野,識(shí)別前的語言預(yù)測(cè)和文本分段都不需要考慮懊蒸。流程和圖片識(shí)別類似,只是將MLImageClassifier換成了MLTextClassifier悯搔,如下圖骑丸。
雖然今年NLP支持了中文的詞性識(shí)別和中文機(jī)構(gòu)識(shí)別妒貌,但我在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在刺,可以獲得一個(gè)能夠識(shí)別多種編程語言的模型文件逆害。
表格(TabularData)
createML使用MLDataTable來處理表格數(shù)據(jù),datasource支持csv蚣驼、json魄幕,它是基于Turi的。
表格的行是一個(gè)example颖杏,列是一個(gè)feature纯陨,通常選取一個(gè)列作為target來預(yù)測(cè),以example為單位挖掘每個(gè)feature之間的關(guān)系留储。這里把price作為target翼抠,評(píng)估數(shù)據(jù)時(shí)target列的數(shù)據(jù)對(duì)于模型是隱藏的,通過挖掘到的關(guān)系來對(duì)price做一個(gè)inference(預(yù)測(cè))获讳,再和真實(shí)數(shù)據(jù)里的price比較机久,評(píng)估準(zhǔn)確率。
流程和上面的類似赔嚎。randomSplit可以將你提供的數(shù)據(jù)源隨機(jī)按比例劃分成訓(xùn)練數(shù)據(jù)和評(píng)估數(shù)據(jù)。這里返回的元組,80%的數(shù)據(jù)是用來訓(xùn)練的尤误,20%是用來評(píng)估的侠畔。table數(shù)據(jù)的訓(xùn)練有很多訓(xùn)練器,包括MLBoostedTreeRegressor损晤、MLDecisionTreeRegressor软棺、MLRandomForestRegressor、MLLinearRegressor等尤勋,如果不知道要用哪個(gè)喘落,可以直接用MLRegressor,他會(huì)自動(dòng)選擇一個(gè)最合適的最冰。
總結(jié)
我的理解:createML訓(xùn)練出來的模型必然是依賴蘋果模型的瘦棋,其實(shí)本質(zhì)是用蘋果的模型來識(shí)別,所以離開蘋果的環(huán)境應(yīng)該無法使用暖哨。而我們?nèi)粘i_發(fā)中費(fèi)很大力氣訓(xùn)練出一個(gè)可用的模型赌朋,是希望它能運(yùn)行在多平臺(tái)的,這樣看來CreateML最終產(chǎn)出的CoreML只支持iOS/macOS篇裁,在這點(diǎn)上有很大局限性沛慢,所以這可能是蘋果接下來要解決的另一個(gè)難題。
能否讓CoreML運(yùn)行在android等其他平臺(tái)达布,將成為CoreML普及的一個(gè)關(guān)鍵团甲,目前來看只有純粹的開發(fā)iOS/macOS平臺(tái)的個(gè)人開發(fā)者會(huì)使用CoreML和CreateML。
雖然如此黍聂,我們還是應(yīng)該開始嘗試躺苦,畢竟ML的準(zhǔn)入門檻已經(jīng)降低了很多,以后ML也必將成為每個(gè)app的標(biāo)配分冈。