原文作者:?Sai Kambampati
原文鏈接
如果你不知道存捺,蘋(píng)果的全球開(kāi)發(fā)者大會(huì)本周召開(kāi)了!這是一件大事座泳,對(duì)蘋(píng)果目前的軟件和框架都做了很多改進(jìn)。其中一個(gè)框架是Create ML。
去年机断,蘋(píng)果(Apple)推出了Core ML:這是一種快速的方法,可以讓你用盡可能少的代碼將預(yù)先培訓(xùn)好的機(jī)器學(xué)習(xí)模型導(dǎo)入應(yīng)用程序中!今年绣夺,有了Create ML吏奸,蘋(píng)果給了我們開(kāi)發(fā)人員創(chuàng)建我們自己的機(jī)器學(xué)習(xí)模型直接進(jìn)入Xcode的平臺(tái)的能力!我們只需要一些數(shù)據(jù)就行了!目前,Create ML允許文本陶耍、圖像和表作為數(shù)據(jù)奋蔚。然而,由于這是大多數(shù)ML應(yīng)用程序的組成部分烈钞,這應(yīng)該很好地服務(wù)于您的目的!我將向您展示如何使用這三種類(lèi)型的數(shù)據(jù)創(chuàng)建一個(gè)ML模型.
注:本教程構(gòu)建在Xcode 10 beta和macOS Mojave beta之上泊碑。請(qǐng)確保您升級(jí)了Xcode和macOS,以便遵循本教程.
為什么創(chuàng)建ML??
您可能想知道毯欣,為什么我要?jiǎng)?chuàng)建ML?這是因?yàn)樗哪芰β?chuàng)建構(gòu)建在軟件中的機(jī)器學(xué)習(xí)基礎(chǔ)設(shè)施ML。當(dāng)你下載iOS 12或macOS Mojave時(shí)酗钞,你也在下載一些機(jī)器學(xué)習(xí)框架腹忽。這樣来累,當(dāng)您創(chuàng)建自己的ML模型時(shí),它會(huì)占用更少的空間窘奏,因?yàn)榇蠖鄶?shù)數(shù)據(jù)已經(jīng)在用戶(hù)的設(shè)備上嘹锁。
創(chuàng)建ML如此流行的另一個(gè)原因是它易于使用。創(chuàng)建ML所需要做的就是擁有一個(gè)廣泛的數(shù)據(jù)集(文本或圖像)着裹,編寫(xiě)幾行代碼领猾,然后運(yùn)行游樂(lè)場(chǎng)!這比其他流行的工具如Tensorflow和Caffe要簡(jiǎn)單得多。這些工具需要大量的代碼骇扇,并且沒(méi)有友好的視覺(jué)界面摔竿。創(chuàng)建ML是建立在Xcode操場(chǎng)上的,所以您可以熟悉它少孝,最重要的是拯坟,它是用Swift完成的!
注意:?
在本教程中,我將只向您展示如何使用create ML創(chuàng)建自己的ML模型韭山。
在撰寫(xiě)本文時(shí)郁季,iOS 12和macOS Mojave仍在測(cè)試階段。要成功運(yùn)行本教程钱磅,您需要運(yùn)行macOS Mojave(10.14)和Xcode 10 beta梦裂。讓我們開(kāi)始吧!
圖像分類(lèi)器模型
我們將首先開(kāi)始構(gòu)建一個(gè)圖像分類(lèi)器模型。我們可以添加任意多的標(biāo)簽盖淡,但是為了簡(jiǎn)單起見(jiàn)年柠,我們將構(gòu)建一個(gè)識(shí)別水果為蘋(píng)果或香蕉的圖像分類(lèi)器。你可以在這里下載圖片褪迟。
打開(kāi)文件夾時(shí)冗恨,您將注意到另外兩個(gè)文件夾:訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù)。每個(gè)文件夾都有蘋(píng)果和香蕉的混合圖片味赃。有大約20張?zhí)O果圖片和20張香蕉圖片掀抹,分別被稱(chēng)為測(cè)試數(shù)據(jù)和80張?zhí)O果圖片和80張香蕉圖片。我們將在訓(xùn)練數(shù)據(jù)中使用圖像來(lái)訓(xùn)練分類(lèi)器心俗,然后使用測(cè)試數(shù)據(jù)來(lái)確定其準(zhǔn)確性傲武。
如果您想構(gòu)建自己的圖像分類(lèi)器,那么將數(shù)據(jù)集分割為80-20是很重要的城榛。大約80%的圖像用于訓(xùn)練數(shù)據(jù)揪利,其余部分用于測(cè)試數(shù)據(jù)。這樣狠持,您的分類(lèi)器就有更多的數(shù)據(jù)需要訓(xùn)練疟位。在每個(gè)文件夾中,將圖像放在各自的文件夾中喘垂。根據(jù)圖像的類(lèi)別標(biāo)簽命名這些文件夾甜刻。
現(xiàn)在敢订,讓我們打開(kāi)Xcode,點(diǎn)擊Get Started with a playground罢吃。當(dāng)您這樣做時(shí),將打開(kāi)一個(gè)新窗口昭齐。這是重要的部分:在macOS下尿招,選擇如下所示的空白模板.
在macOS而不是iOS下選擇空白模板是至關(guān)重要的,因?yàn)閕OS平臺(tái)不支持CreateML框架阱驾。
給你的playground命名就谜,把它保存到你想要的任何地方。Coding Now !?
代碼如下:?
現(xiàn)在我要向你們展示的東西會(huì)讓你們大吃一驚里覆。你只需要三行代碼!讓我來(lái)告訴你!刪除playdround上的一切丧荐,并輸入以下內(nèi)容:
確保在Xcode playground中啟用Live View特性,您將能夠看到可視化界面!
CreateMLUI是一個(gè)與CreateML類(lèi)似的框架喧枷,但它有一個(gè)UI虹统。到目前為止,CreateMLUI只能用于圖像分類(lèi).?
用戶(hù)界面
在實(shí)時(shí)視圖中隧甚,您將看到我們需要?jiǎng)h除圖像以開(kāi)始!這是相當(dāng)簡(jiǎn)單的车荔。獲取培訓(xùn)數(shù)據(jù)文件夾,并將整個(gè)文件夾放入該區(qū)域戚扳。
當(dāng)你放下文件夾的時(shí)候忧便,你會(huì)看到playground開(kāi)始訓(xùn)練圖像分類(lèi)器!在控制臺(tái)中,您將看到在什么時(shí)間處理圖像的數(shù)量帽借,以及您的數(shù)據(jù)被訓(xùn)練的百分比!
這需要大約30秒(取決于你的設(shè)備)珠增。當(dāng)一切都完成處理后,您應(yīng)該看到如下內(nèi)容:
您將看到一張卡片砍艾,上面有三個(gè)標(biāo)簽:培訓(xùn)蒂教、驗(yàn)證和評(píng)估。培訓(xùn)是指Xcode成功培訓(xùn)的培訓(xùn)數(shù)據(jù)的百分比脆荷。這應(yīng)該讀100%悴品。
在培訓(xùn)期間,Xcode將培訓(xùn)數(shù)據(jù)分發(fā)到80-20简烘。在訓(xùn)練了80%的訓(xùn)練數(shù)據(jù)之后苔严,Xcode在剩下的20%上運(yùn)行分類(lèi)器。這就是驗(yàn)證的含義:分類(lèi)器能夠得到正確的訓(xùn)練圖像的百分比孤澎。通常届氢,這可能會(huì)有所不同,因?yàn)閄code可能并不總是分割相同的數(shù)據(jù)覆旭。在我的例子中退子,Xcode有88%的有效性岖妄。我不會(huì)太擔(dān)心這個(gè)。評(píng)估是空的寂祥,因?yàn)槲覀儧](méi)有給分類(lèi)器任何測(cè)試數(shù)據(jù)〖雠埃現(xiàn)在做一下!
當(dāng)一切都完成后,你的評(píng)估分?jǐn)?shù)應(yīng)該是100%丸凭。這意味著分類(lèi)器正確地標(biāo)記了所有的圖像!
如果你對(duì)你的結(jié)果滿(mǎn)意福扬,剩下的就是保存文件了!單擊圖像分類(lèi)器標(biāo)題旁邊的箭頭硝逢。應(yīng)該出現(xiàn)一個(gè)下拉菜單新锈,顯示所有的元數(shù)據(jù)揭璃。將元數(shù)據(jù)更改為您想要的方式军援,并將其保存到您想要的位置!
打開(kāi)CoreML模型并查看元數(shù)據(jù)排宰。它有你填的所有東西!恭喜你!您是您自己的圖像分類(lèi)器模型的作者摄乒,它非常強(qiáng)大瑰煎,并且只需要17 KB!
你可以把它導(dǎo)入你的iOS應(yīng)用程序屹篓,看看它是如何運(yùn)行的!接下來(lái)莉御,讓我們看看如何創(chuàng)建自己的文本分類(lèi)器撇吞。這需要更多的代碼!
文本分類(lèi)器模型
接下來(lái),我們將使用Create ML構(gòu)建一個(gè)垃圾郵件檢測(cè)器模型礁叔。這是一種模型梢夯,它確定消息是垃圾郵件還是火腿(火腿不是垃圾郵件)。就像所有的機(jī)器學(xué)習(xí)應(yīng)用程序一樣晴圾,我們需要一些數(shù)據(jù)颂砸。?下載示例的JSON文件。
打開(kāi)它死姚,您可以看到它是一個(gè)包含大量消息的JSON表人乓,每個(gè)消息都標(biāo)記為spam或ham。與應(yīng)用程序中可能需要的數(shù)據(jù)相比都毒,這個(gè)示例中的數(shù)據(jù)量非常小色罚。
記住:更多的數(shù)據(jù)會(huì)更準(zhǔn)確!但是,最好確保您的數(shù)據(jù)對(duì)ML任務(wù)有效账劲。如果您使用的數(shù)據(jù)損壞或可能會(huì)破壞您的結(jié)果戳护,它將極大地改變您的分類(lèi)器的結(jié)果。
代碼:?
現(xiàn)在瀑焦,我們必須要求Xcode對(duì)數(shù)據(jù)進(jìn)行訓(xùn)練腌且。雖然我們沒(méi)有一個(gè)漂亮簡(jiǎn)單的UI,但是我們使用的代碼并不難榛瓮。類(lèi)型如下:
import CreateML
import Foundation
//1
let data = try MLDataTable(contentsOf: URL(fileURLWithPath: "/Users/Path/To/spam.json"))
let (trainingData, testingData) = data.randomSplit(by: 0.8, seed: 5)
let spamClassifier = try MLTextClassifier(trainingData: trainingData, textColumn: "text", labelColumn: "label")
//2
let trainingAccuracy = (1.0 - spamClassifier.trainingMetrics.classificationError) * 100
let validationAccuracy = (1.0 - spamClassifier.validationMetrics.classificationError) * 100
//3
let evaluationMetrics = spamClassifier.evaluation(on: testingData)
let evaluationAccuracy = (1.0 - evaluationMetrics.classificationError) * 100
//4
let metadata = MLModelMetadata(author: "Sai Kambampati", shortDescription: "A model trained to classify spam messages", version: "1.0")
try spamClassifier.write(to: URL(fileURLWithPath: "/Users/Path/To/Save/SpamDetector.mlmodel"), metadata: metadata)
讓我解釋一下發(fā)生了什么铺董。大多數(shù)代碼應(yīng)該相當(dāng)簡(jiǎn)單!
1. 首先,我們創(chuàng)建一個(gè)名為data的常量禀晓,它是垃圾郵件的一種MLDataTable精续。json文件坝锰。MLDataTable是一個(gè)全新的對(duì)象,用于創(chuàng)建一個(gè)決定訓(xùn)練或評(píng)估ML模型的表重付。我們將數(shù)據(jù)分為trainingData和testingData顷级。和以前一樣,比率是80-20确垫,種子是5弓颈。種子是指分類(lèi)器的起點(diǎn)。然后我們用我們的訓(xùn)練數(shù)據(jù)定義一個(gè)叫做spamClassifier的MLTextClassifier森爽,定義數(shù)據(jù)的值是文本,什么值是標(biāo)簽嚣镜。
2. 創(chuàng)建了兩個(gè)變量爬迟,名為trainingAccuracy和validationAccuracy,用于確定分類(lèi)器的準(zhǔn)確程度菊匿。在側(cè)窗格中付呕,您可以看到百分比。
3. 我們還檢查評(píng)估的執(zhí)行情況跌捆。(請(qǐng)記住徽职,評(píng)價(jià)是分類(lèi)器以前沒(méi)有看到的文本上使用的結(jié)果,以及它們的準(zhǔn)確性佩厚。)
4.最后姆钉,我們?yōu)镸L模型創(chuàng)建一些元數(shù)據(jù),如作者抄瓦、描述和版本潮瓶。我們使用write()函數(shù)將模型保存到我們選擇的位置!在下面的圖片中,你會(huì)看到我選擇了桌面!
運(yùn)行钙姊。您可以在控制臺(tái)中看到迭代毯辅,在右邊欄中看到精度!?完成所有操作后,將保存核心ML模型!您可以查看模型并查看元數(shù)據(jù)!
表格式分類(lèi)
表格數(shù)據(jù)是關(guān)于創(chuàng)建ML最先進(jìn)和有趣的特性之一煞额,通過(guò)觀察表中的一系列特性思恐,創(chuàng)建ML可以檢測(cè)模式并創(chuàng)建分類(lèi)器來(lái)檢測(cè)您想要的目標(biāo)特性。
在這種情況下膊毁,讓我們來(lái)處理機(jī)器學(xué)習(xí)世界中最流行的數(shù)據(jù)集之一——房?jī)r(jià)!更有趣的是胀莹,數(shù)據(jù)集不是JSON格式,而是CSV格式!在這里下載數(shù)據(jù)集.
這個(gè)數(shù)據(jù)集是在UCI機(jī)器學(xué)習(xí)存儲(chǔ)庫(kù)中發(fā)現(xiàn)的波士頓房屋數(shù)據(jù)集的修改版本婚温。打開(kāi)文件嗜逻,您可以看到有一個(gè)巨大的表格,其中包含數(shù)字和4個(gè)縮寫(xiě)缭召。這是他們的意思:
? ?RM: ?每個(gè)住宅的平均房間數(shù)
? ?LSTAT: 人口中被認(rèn)為地位較低的百分比
? ?PTRATIO: 城鎮(zhèn)學(xué)生與學(xué)生的比率
? ?MEDV: 自住房屋的中位數(shù)?
您可以猜到栈顷,我們將使用3個(gè)特性(RM, LSTAT, PTRATIO)來(lái)計(jì)算最終的價(jià)格(MEDV)!
讓Xcode讀取表非常簡(jiǎn)單!下面的代碼應(yīng)該看起來(lái)非常類(lèi)似于文本分類(lèi)代碼!
//1
let houseData = try MLDataTable(contentsOf: URL(fileURLWithPath: "/Users/Path/To/HouseData.csv"))
let (trainingCSVData, testCSVData) = houseData.randomSplit(by: 0.8, seed: 0)
//2
let pricer = try MLRegressor(trainingData: houseData, targetColumn: "MEDV")
//3
let csvMetadata = MLModelMetadata(author: "Sai Kambampati", shortDescription: "A model used to determine the price of a house based on some features.", version: "1.0")
try pricer.write(to: URL(fileURLWithPath: "/Users/Path/To/Write/HousePricer.mlmodel"), metadata: csvMetadata)
如果您不能理解上面的代碼逆日,沒(méi)問(wèn)題!我將一步一步地完成它!
1. 第一步是在家庭數(shù)據(jù)。csv中引用我們的數(shù)據(jù)萄凤。這是通過(guò)簡(jiǎn)單的URL調(diào)用完成的(fileURLWithPath:)室抽。接下來(lái),我們定義應(yīng)該將數(shù)據(jù)的哪些部分分解為訓(xùn)練和測(cè)試靡努。我們像往常一樣把它分成80-20個(gè)坪圾,為了稍微改變一下,讓我們從頭開(kāi)始(將種子設(shè)置為0)惑朦。
2.接下來(lái)兽泄,我們使用全新的mlerror枚舉為我們的數(shù)據(jù)定義一種名為pricer的回歸值。這是關(guān)于創(chuàng)建ML的最酷的部分之一漾月。ML算法使用了大量的回歸元素:線性病梢、增強(qiáng)樹(shù)、決策樹(shù)和隨機(jī)森林梁肿。這些都是最常見(jiàn)的蜓陌。除非您是ML專(zhuān)家,否則很難確定哪一個(gè)最適合您的數(shù)據(jù)吩蔑。這就是Create ML的作用所在钮热。當(dāng)您選擇mlresissor時(shí),創(chuàng)建ML將您的數(shù)據(jù)遍歷所有這些變量烛芬,并為您選擇最好的一個(gè)隧期。我們選擇訓(xùn)練數(shù)據(jù)為室內(nèi)數(shù)據(jù),將目標(biāo)列設(shè)為MEDV赘娄,即中位價(jià)格厌秒。
這里有一些快速的術(shù)語(yǔ)。你可能想知道分類(lèi)器和回歸模型之間的區(qū)別擅憔。分類(lèi)器將數(shù)據(jù)的輸出分組到類(lèi)或標(biāo)簽中鸵闪。另一方面,回歸者利用訓(xùn)練數(shù)據(jù)預(yù)測(cè)輸出值暑诸。解釋變量是不需要標(biāo)簽蚌讼。此外,在機(jī)器學(xué)習(xí)中个榕,特性是數(shù)據(jù)集中的變量篡石。在我們的例子中,特征是房間的平均數(shù)量西采、人口的百分比和學(xué)生與學(xué)生的比例凰萨。目標(biāo)也是我們數(shù)據(jù)中的一列這是我們希望回歸預(yù)測(cè)的。這里是房?jī)r(jià)的中值。
3. 最后胖眷,我們?yōu)槲覀兊哪P投x一些元數(shù)據(jù)武通,并將其保存到我們想要的任何地方!
在撰寫(xiě)本文時(shí),Create ML不支持顯示多變量的準(zhǔn)確性珊搀。它只能顯示最大誤差和平方根誤差冶忱,這兩項(xiàng)對(duì)顯示模型的準(zhǔn)確性沒(méi)有多大幫助。但請(qǐng)相信我境析,當(dāng)我說(shuō)Xcode生成的模型相當(dāng)準(zhǔn)確時(shí)囚枪。
在playground跑完后,觀察右邊的窗格劳淆×凑樱看起來(lái)Create ML已經(jīng)決定了增強(qiáng)樹(shù)是我們的數(shù)據(jù)最好的遺憾!這簡(jiǎn)直太神奇了不是嗎?我已經(jīng)將我的核心ML模型保存到我的桌面。打開(kāi)您的核心ML模型并觀察元數(shù)據(jù)沛鸵。
您可以看到括勺,該模型是一個(gè)管道退化程序,大約是10kb谒臼。它包含3個(gè)特性(就像我們想要的那樣)朝刊,并輸出最終的價(jià)格!
結(jié)論
在本教程中耀里,您了解了如何使用蘋(píng)果最新的框架create ML創(chuàng)建您自己的機(jī)器學(xué)習(xí)模型!只需幾行代碼蜈缤,您就可以創(chuàng)建高級(jí)的、最先進(jìn)的機(jī)器學(xué)習(xí)算法來(lái)處理您的數(shù)據(jù)冯挎,并給出您想要的結(jié)果!
您了解了如何在CSV和JSON格式中訓(xùn)練圖像底哥、文本和表格數(shù)據(jù)。使用CreateMLUI可以非常簡(jiǎn)單地訓(xùn)練圖像房官,雖然沒(méi)有針對(duì)文本和表格數(shù)據(jù)的UI趾徽,但是可以在10行以?xún)?nèi)編寫(xiě)代碼
要了解更多關(guān)于創(chuàng)建ML的信息,可以觀看蘋(píng)果關(guān)于創(chuàng)建ML的視頻翰守。您還可以查看蘋(píng)果關(guān)于創(chuàng)建ML的文檔孵奶。
你可以在這里下載最終的playground。在這個(gè)項(xiàng)目中蜡峰,您將訪問(wèn)最終的核心ML模型了袁,以便查看您的模型是否匹配!繼續(xù)嘗試創(chuàng)建ML,并觀察您的結(jié)果湿颅,當(dāng)您導(dǎo)入它們到您的iOS應(yīng)用程序!在下面的評(píng)論中载绿,讓我知道如何使用CoreML來(lái)分享你的應(yīng)用程序的截圖!
原文作者:?Sai Kambampati