我爱编程攻城狮ML

Create ML : 如何在Xcode 10中训练您自己的机器

2018-06-07  本文已影响41人  Zakerberg

原文作者: Sai Kambampati

原文链接

如果你不知道,苹果的全球开发者大会本周召开了!这是一件大事,对苹果目前的软件和框架都做了很多改进。其中一个框架是Create ML。

去年,苹果(Apple)推出了Core ML:这是一种快速的方法,可以让你用尽可能少的代码将预先培训好的机器学习模型导入应用程序中!今年,有了Create ML,苹果给了我们开发人员创建我们自己的机器学习模型直接进入Xcode的平台的能力!我们只需要一些数据就行了!目前,Create ML允许文本、图像和表作为数据。然而,由于这是大多数ML应用程序的组成部分,这应该很好地服务于您的目的!我将向您展示如何使用这三种类型的数据创建一个ML模型.

图片来源:Apple

注:本教程构建在Xcode 10 beta和macOS Mojave beta之上。请确保您升级了Xcode和macOS,以便遵循本教程.

为什么创建ML? 

您可能想知道,为什么我要创建ML?这是因为它的能力。创建构建在软件中的机器学习基础设施ML。当你下载iOS 12或macOS Mojave时,你也在下载一些机器学习框架。这样,当您创建自己的ML模型时,它会占用更少的空间,因为大多数数据已经在用户的设备上。

创建ML如此流行的另一个原因是它易于使用。创建ML所需要做的就是拥有一个广泛的数据集(文本或图像),编写几行代码,然后运行游乐场!这比其他流行的工具如Tensorflow和Caffe要简单得多。这些工具需要大量的代码,并且没有友好的视觉界面。创建ML是建立在Xcode操场上的,所以您可以熟悉它,最重要的是,它是用Swift完成的!

注意: 

在本教程中,我将只向您展示如何使用create ML创建自己的ML模型。

在撰写本文时,iOS 12和macOS Mojave仍在测试阶段。要成功运行本教程,您需要运行macOS Mojave(10.14)和Xcode 10 beta。让我们开始吧!

图像分类器模型

我们将首先开始构建一个图像分类器模型。我们可以添加任意多的标签,但是为了简单起见,我们将构建一个识别水果为苹果或香蕉的图像分类器。你可以在这里下载图片。

打开文件夹时,您将注意到另外两个文件夹:训练数据和测试数据。每个文件夹都有苹果和香蕉的混合图片。有大约20张苹果图片和20张香蕉图片,分别被称为测试数据和80张苹果图片和80张香蕉图片。我们将在训练数据中使用图像来训练分类器,然后使用测试数据来确定其准确性。

如果您想构建自己的图像分类器,那么将数据集分割为80-20是很重要的。大约80%的图像用于训练数据,其余部分用于测试数据。这样,您的分类器就有更多的数据需要训练。在每个文件夹中,将图像放在各自的文件夹中。根据图像的类别标签命名这些文件夹。

现在,让我们打开Xcode,点击Get Started with a playground。当您这样做时,将打开一个新窗口。这是重要的部分:在macOS下,选择如下所示的空白模板.

在macOS而不是iOS下选择空白模板是至关重要的,因为iOS平台不支持CreateML框架。

给你的playground命名,把它保存到你想要的任何地方。Coding Now ! 

代码如下: 

现在我要向你们展示的东西会让你们大吃一惊。你只需要三行代码!让我来告诉你!删除playdround上的一切,并输入以下内容:

确保在Xcode playground中启用Live View特性,您将能够看到可视化界面!

CreateMLUI是一个与CreateML类似的框架,但它有一个UI。到目前为止,CreateMLUI只能用于图像分类. 

用户界面

在实时视图中,您将看到我们需要删除图像以开始!这是相当简单的。获取培训数据文件夹,并将整个文件夹放入该区域。

当你放下文件夹的时候,你会看到playground开始训练图像分类器!在控制台中,您将看到在什么时间处理图像的数量,以及您的数据被训练的百分比!

这需要大约30秒(取决于你的设备)。当一切都完成处理后,您应该看到如下内容:

您将看到一张卡片,上面有三个标签:培训、验证和评估。培训是指Xcode成功培训的培训数据的百分比。这应该读100%。

在培训期间,Xcode将培训数据分发到80-20。在训练了80%的训练数据之后,Xcode在剩下的20%上运行分类器。这就是验证的含义:分类器能够得到正确的训练图像的百分比。通常,这可能会有所不同,因为Xcode可能并不总是分割相同的数据。在我的例子中,Xcode有88%的有效性。我不会太担心这个。评估是空的,因为我们没有给分类器任何测试数据。现在做一下!

当一切都完成后,你的评估分数应该是100%。这意味着分类器正确地标记了所有的图像!

如果你对你的结果满意,剩下的就是保存文件了!单击图像分类器标题旁边的箭头。应该出现一个下拉菜单,显示所有的元数据。将元数据更改为您想要的方式,并将其保存到您想要的位置!

打开CoreML模型并查看元数据。它有你填的所有东西!恭喜你!您是您自己的图像分类器模型的作者,它非常强大,并且只需要17 KB!

你可以把它导入你的iOS应用程序,看看它是如何运行的!接下来,让我们看看如何创建自己的文本分类器。这需要更多的代码!

文本分类器模型

接下来,我们将使用Create ML构建一个垃圾邮件检测器模型。这是一种模型,它确定消息是垃圾邮件还是火腿(火腿不是垃圾邮件)。就像所有的机器学习应用程序一样,我们需要一些数据。 下载示例的JSON文件

打开它,您可以看到它是一个包含大量消息的JSON表,每个消息都标记为spam或ham。与应用程序中可能需要的数据相比,这个示例中的数据量非常小。

记住:更多的数据会更准确!但是,最好确保您的数据对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)

让我解释一下发生了什么。大多数代码应该相当简单!

1. 首先,我们创建一个名为data的常量,它是垃圾邮件的一种MLDataTable。json文件。MLDataTable是一个全新的对象,用于创建一个决定训练或评估ML模型的表。我们将数据分为trainingData和testingData。和以前一样,比率是80-20,种子是5。种子是指分类器的起点。然后我们用我们的训练数据定义一个叫做spamClassifier的MLTextClassifier,定义数据的值是文本,什么值是标签。

2. 创建了两个变量,名为trainingAccuracy和validationAccuracy,用于确定分类器的准确程度。在侧窗格中,您可以看到百分比。

3. 我们还检查评估的执行情况。(请记住,评价是分类器以前没有看到的文本上使用的结果,以及它们的准确性。)

4.最后,我们为ML模型创建一些元数据,如作者、描述和版本。我们使用write()函数将模型保存到我们选择的位置!在下面的图片中,你会看到我选择了桌面!

运行。您可以在控制台中看到迭代,在右边栏中看到精度! 完成所有操作后,将保存核心ML模型!您可以查看模型并查看元数据!

表格式分类

表格数据是关于创建ML最先进和有趣的特性之一,通过观察表中的一系列特性,创建ML可以检测模式并创建分类器来检测您想要的目标特性。

在这种情况下,让我们来处理机器学习世界中最流行的数据集之一——房价!更有趣的是,数据集不是JSON格式,而是CSV格式!在这里下载数据集.

这个数据集是在UCI机器学习存储库中发现的波士顿房屋数据集的修改版本。打开文件,您可以看到有一个巨大的表格,其中包含数字和4个缩写。这是他们的意思:

   RM:  每个住宅的平均房间数

   LSTAT: 人口中被认为地位较低的百分比

   PTRATIO: 城镇学生与学生的比率

   MEDV: 自住房屋的中位数 

您可以猜到,我们将使用3个特性(RM, LSTAT, PTRATIO)来计算最终的价格(MEDV)!

让Xcode读取表非常简单!下面的代码应该看起来非常类似于文本分类代码!

//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)

如果您不能理解上面的代码,没问题!我将一步一步地完成它!

1. 第一步是在家庭数据。csv中引用我们的数据。这是通过简单的URL调用完成的(fileURLWithPath:)。接下来,我们定义应该将数据的哪些部分分解为训练和测试。我们像往常一样把它分成80-20个,为了稍微改变一下,让我们从头开始(将种子设置为0)。

2.接下来,我们使用全新的mlerror枚举为我们的数据定义一种名为pricer的回归值。这是关于创建ML的最酷的部分之一。ML算法使用了大量的回归元素:线性、增强树、决策树和随机森林。这些都是最常见的。除非您是ML专家,否则很难确定哪一个最适合您的数据。这就是Create ML的作用所在。当您选择mlresissor时,创建ML将您的数据遍历所有这些变量,并为您选择最好的一个。我们选择训练数据为室内数据,将目标列设为MEDV,即中位价格。

这里有一些快速的术语。你可能想知道分类器和回归模型之间的区别。分类器将数据的输出分组到类或标签中。另一方面,回归者利用训练数据预测输出值。解释变量是不需要标签。此外,在机器学习中,特性是数据集中的变量。在我们的例子中,特征是房间的平均数量、人口的百分比和学生与学生的比例。目标也是我们数据中的一列这是我们希望回归预测的。这里是房价的中值。

3. 最后,我们为我们的模型定义一些元数据,并将其保存到我们想要的任何地方!

在撰写本文时,Create ML不支持显示多变量的准确性。它只能显示最大误差和平方根误差,这两项对显示模型的准确性没有多大帮助。但请相信我,当我说Xcode生成的模型相当准确时。

在playground跑完后,观察右边的窗格。看起来Create ML已经决定了增强树是我们的数据最好的遗憾!这简直太神奇了不是吗?我已经将我的核心ML模型保存到我的桌面。打开您的核心ML模型并观察元数据。

您可以看到,该模型是一个管道退化程序,大约是10kb。它包含3个特性(就像我们想要的那样),并输出最终的价格!

结论

在本教程中,您了解了如何使用苹果最新的框架create ML创建您自己的机器学习模型!只需几行代码,您就可以创建高级的、最先进的机器学习算法来处理您的数据,并给出您想要的结果!

您了解了如何在CSV和JSON格式中训练图像、文本和表格数据。使用CreateMLUI可以非常简单地训练图像,虽然没有针对文本和表格数据的UI,但是可以在10行以内编写代码

要了解更多关于创建ML的信息,可以观看苹果关于创建ML的视频。您还可以查看苹果关于创建ML的文档

你可以在这里下载最终的playground。在这个项目中,您将访问最终的核心ML模型,以便查看您的模型是否匹配!继续尝试创建ML,并观察您的结果,当您导入它们到您的iOS应用程序!在下面的评论中,让我知道如何使用CoreML来分享你的应用程序的截图!

原文作者: Sai Kambampati


上一篇下一篇

猜你喜欢

热点阅读