本文是翻译于AppCoda社区,如有版权问题,请告知,会配合处理
为了防止你没有关注,苹果全球开发者会议于这周开始!这是一个大事件,对苹果当前的软件和框架都做了很多的改进。其中一个框架就是 Create ML 。
去年,苹果介绍了 Core ML:一种快速的方法,可以让你用尽可能少的代码把预先训练好的机器学习模型导入到你的 app 中。今年,有了 Create ML ,苹果给了我们开发者直接在 Xcode Playgrounds 中创建自己的机器学习模型的能力!我们只需要一些数据就可以了!到目前为止, Create ML 允许文本、图片和表作为数据。然后,由于这些也是大部分 ML 应用程序的组成部分,因此这些也可以服务好你的目的。
编者提示:这篇文章是用 Xcode 10 beta 和 macOS Mojave beta 构建的。为了遵循本文,请确保你的 Xcode 和 macOS 都已经升级了。
为什么用 Create ML
你也许会思考,为什么我会更喜欢 Create ML 呢?这是因为它的能力。 Create ML 可以利用软件内置的机器学习基础设施。当你下载 iOS 12 或 macOS Mojave 的时候,你也会下载一些机器学习框架。这样的话,当你创建自己的 ML 模型时,它就会占用更少的空间,因为大部分的数据已经在用户的设备中了。
另一个 Create ML 如此受欢迎的原因就是使用简单。使用 Create ML 你所需做的全部就是有一个广泛的数据集(文本或图片)、只需写几行代码和运行 playground !这比其它的流行工具如 Tensorflow 和 Caffe 要简单的多了。哪些工具需要大量的代码并且没有友好的可视化界面。 Create ML 是内置在 Xcode Playgrounds ,因此会比较熟悉,最好的是,它是用 Swift 完成的!
前提条件
在本文中,我只会向你展示如何使用 Create ML 创建你自己的 ML 模型。如果你想学习如何把 Core ML 模型导入到你的 iOS app 中,可以在这里找到教程。
在写本文时,iOS 12 和 macOS Mojave 仍然处于测试版,为了成功的运行本文项目,你需要安装 macOS Mojave (10.14) 和 Xcode 10 测试版。我们开始吧!
图片分类器模型
数据
我们首先从创建一个图片分类器开始。我们可以尽可能多的添加我们想要的有着尽可能多的标签的图片。你可以在这里下载图片。
当你打开文件夹,你会注意到有两个文件:训练数据和测试数据,每个文件都由苹果图片和香蕉图片混合组成的。在测试数据文件中有将近 20 张苹果图片和 20 张香蕉图片,而在训练数据文件中有将近 80 张苹果数据和 80 张香蕉图片。我们将使用训练数据的图片去训练我们的分类器,然后使用测试数据的图片去判断它的精确度。
如果你想构建自己的图片分类器,将数据集进行 80 - 20 分配是很重要的。大约 80% 的图片当做训练数据,剩下的当做测试数据;这样的话,你的分类器就有更多的数据可以训练。在每个文件夹里面,将图片放入各自的文件夹中。并根据图片类别标签去命名这些文件夹。
现在,让我们打开 Xcode 然后点击 Get Started with a Playground。当你做到这里的时候,就会打开一个新的窗口。这是很重要的一部分:在 macOS 下,选择如下所示的 Blank
模板。
你在 macOS 下面选择 Blank
模板而不是在 iOS 下,是非常重要的,因为 Create ML
框架不支持 iOS Playground 。
命名你的 playground ,然后保存在你想保存的地方。让我们现在开始编码!
编码
现在,我要向你展示的东西会让你大吃一惊。你总共只需要 3 行代码!让我来展示一下!删除 playground 的所有东西,输入以下代码:
import CreateMLUI
let builder = MLImageClassifierBuilder()
builder.showInLiveView()
就这样!确保你 Xcode Playgrounds 中的 Live View 功能可用,你将能够看到一个可视化的界面。
CreateMLUI
是一个像 CreateML
的框架,只不过它有 UI 。到目前为止, CreateMLUI
只能用于图片分类器。现在,让我们看看如何和 UI 交互。你将会看到也很简单。
用户界面
在 Live View 里,你会看到我们需要拖入图片才能开始!这就很简单了,选中训练数据文件夹,然后把整个文件夹拖到这个区域。
在你松开文件夹的瞬间,你就会看到 playground 开始训练图片分类器!在控制台,你就会看到在什么时间处理图片的数量和你的数据被训练的百分比!
这可能会花 30 秒(根据你的设备),当所有事情都处理完毕后,你应该会看到下面这样的结果:
你会看到一个有三个标签的卡片:训练度、有效率、评估。训练度是指 Xcode 成功训练的训练数据百分比,这应该读作 100% 。
训练的时候,Xcode 将训练数据分配成 80 - 20 。当训练数据训练了 80% 之后,Xcode 将剩下的 20% 运行在分类器上。这就是有效率的含义:分类器得到训练图片的百分比。通常,这是会变的,因为 Xcode 并不总会分配相同比例的数据。在我的例子中, Xcode 有 88% 的有效率,我并不太担心这些。评估是空的,因为我们还没有给分类器任何数据。让我们现在开始做吧!
这就非常快了,当所有完成后,你的评估分数应该是 100% ,这就意味着分类器正确地给所有图片贴上标签!
如果你对你的结果满意,那么剩下的就是保存文件了!点击 Image Classifier 标题旁边的箭头,应该会出现一个下拉菜单,显示所有的元数据。将元数据改成你喜欢的,然后将其保存到你想要保存的地方!
打开 Core ML 模型,看一下元数据,有你填写的所有数据!恭喜!你成为你自己的图片分类器模型的作者,它超级强大,并且只有 17 KB!
你可以把它导入到你的 iOS app 运行起来看看怎么样!接下来,让我实现一下如何创建文本分类器,这需要更多一点的代码。
文本分类器模型
接下来,我们将用 Create ML 创建一个垃圾短信检测器模型。这是一类检测短信是垃圾短信还是非垃圾短信(ham不是垃圾短信)的模型。和所有机器学习应用程序一样,我们需要一些数据,在这里可以下载示例 JSON 文件。
打开它,你可以看到一个包含了大量信息的 JSON 表,每个都被标记为垃圾短信或非垃圾短信。与你的应用程序可能需要的数据相比,这个示例中的数据量非常小。
记住:数据越多越精确!然而,确保你的数据对你的 ML 任务有价值的会更好。如果你使用了破损的数据或者可能会打乱你的结果,这将会极大的改变分类器的结果。
编码
现在,我们不得不让 Xcode 去训练数据。当我们没有漂亮、简单的 UI 时,我们用到的代码是不会太难的。输入以下代码:
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)
我们来解释一下发生了什么,大部分的代码都非常简单!
- 首先,我们创建了一个
MLDataTable
的常量data
去获取我们的spam.json
文件。MLDataTable
是一个全新的对象,用于创建确定要训练或者评估一个 ML 模型的表。我们把数据分成trainingData
和testingData
。像之前一样,比例为 80 -20 、种子为 5 。种子是指分类器应该从哪里开始。然后我们使用训练数据定义一个MLTextClassifier
对象spamClassifier
,定义哪些值是文本,哪些值是标签。 - 我们创建了两个变量叫做
trainingAccuracy
和validationAccuracy
,用于确定我们分类器的精确度。在另一边,你有可能看到百分比。 - 我们也会检查评估的执行情况(请记住,这个评估是在分类器之前没有看到的文本上使用的结果,以及它得到的结果有多准确)。
- 最后,我们给 ML 模型创建了元数据,像:作者、描述、版本。我们使用
write()
方式将模型保存到我们本地选择的位置。在下面的图片中,你会看到我选了桌面。
运行 playground 。你可以在控制台中看到迭代次数、在右手栏中看到精确度!当所有完成后, Core ML 模型会被保存!你可以查看模型和元数据。
列表分类器
数据
列表数据是关于 Create ML 最高级和有趣的特性之一。通过观察表中的一系列特性, Create ML 可以检测模式,并且创建一个分类器去检测你想要的分类器。
在本例中,让我们去处理一个在机器学习世界中最流行的数据集 —— 房价!为了让它更有趣,数据集不是 JSON 格式而是 CSV 格式。在这里下载数据集。
这个数据集是在** UCI 机器学习存储库**中发现的波士顿房屋数据集的修改版本。打开文件,你会发现这是一个巨大的表,里面有数字和 4 个缩写,它们的含义如下:
- RM: 每个住宅的平均房间数
- LSTAT: 被认为低端人口的比例
- PTRATIO: 镇上下学生的比例
- MEDV: 自住房的中位数
你可以猜一猜,我们将会使用前 3 个特性( RM, LSTAT, PTRATIO )去计算最后的价格(MEDV)!
结语
在这篇文章中,你看到了如何使用苹果的最新框架 Create ML 去创建一个自己的机器学习模型!只需要几行代码,你就可以创建一个高级的、最先进的机器学习算法去处理你的数据,并得到一个你想要的结果!
你已经看到了如何去训练图片、文本、 CVS 格式和 JSON 格式的列表数据。使用 CreateMLUI
可以很简单的训练图片,虽然没有针对文本和列表的 UI ,但你可以写少于 10 行的代码就能搞定。
为了学习关于 Create ML 更多的知识,你可以在这里观看关于 Create ML 苹果视频,来自于 WWDC 2018 。你也可以在这里查看关于 Create ML 的苹果文档。
你可以在这里下载最终的 playground 。着这个项目中,你将获得访问最终 Core ML 模型的权限,以便于你的模型是否匹配!
继续 Create ML 试验,观察把它们导入到你的 iOS app 后,你得到的结果!让我知道会发生什么事情,并且你可以在下面的评论区分享你使用 CoreML 的截屏。