[译]Create ML教程:开始入门

8,957 阅读26分钟

本文是对Raywenderlich上的mac/iOS平台机器学习文章Create ML Tutorial:Getting Started的翻译.
由于译者对机器学习了解不够深入,翻译的疏漏再所难免,敬请原谅.

本文资料下载

Create ML就是苹果决心的证明:苹果决心让你更简单在app中使用机器学习模型.在本教程中,你将学习如何用Create ML加速工作流程:通过改进数据来改进模型,并且通过使用Xcode和Swift来降低学习曲线.

与此同时,你还会更加熟悉ML工具集和术语.而不需要引入数学! 你不需要知道如何编写一个编译器来使用Swift,你也不需要编写一个新的ML算法来使用分类器.有了Create ML,你就没有了不开始学习机器学习的理由!

Apple ML的简明历史:

  • Core ML:在WWDC 2017上宣布,已经被每个主流ML平台支持,可导出已有模型.但是已有模型总是太大,并且/或者,太笼统.
  • Turi Create:在WWDC 2017之后被收购,它能让你用自己的数据来自定义现有模型.只不过是用...Python :[.
  • IBM Watson Services:在2018年三月宣布.你可以自定义IBM Watson的视觉识别模型来识别你自己的数据.只需拖拽你的数据,无需代码,但你需要使用IBM Cloud,并且Core ML模型是被Watson API包装过的.
  • Create ML:在WWDC 2018上宣布.用Xcode和Swift的ML!目前,只包括了七个Turi Create重点工具集中的两个,再加上一个通用分类器和回归量,还有数据表.我认为,这是一个引导你通向Turi Create宫殿的诱饵,宫殿里面居住着一条"好狗"而不是邪恶女巫!(Turi Create的logo是一条狗.)

本教程中,你将从一个Create ML小技巧开始:创建一个带有GUI的图片分类器,使用的图片来自Kaggle Cats and Dogs Dataset.然后,你将其和使用同样数据集的Turi Create示例进行对比.正如你看到的那样,Turi Create更加手动化,但它也更加灵活,一点也不难以理解!对于基于代码的示例,你将对比Create ML和Turi Create文本分类器代码.

然后我将会向你展示如何快速创建环境以使用Turi Create.苹果甚至修改了Xcode的playgrounds,让它更接近Jupyter Notebook(此前被称为 IPython notebook是一个交互式笔记本,支持运行 40 多种编程语言),这样代码环境会让人更加熟悉! 试一下,你将用Turi Create在Jupyter notebook中,给相同数量的猫和狗的数据集创建一个图片相似度模型.

可以耐心等待并希望苹果将Turi Create的其余功能转移到Create ML中,但是你会发现用Create ML做为垫脚石来直接使用Turi Create并不困难.如果你需要的更多信息,我们还有教程教你使用 Keras, scikit-learn and Caffe (稍后推出).一旦你熟悉了开发环境,那么,ML领域有大量的教程,可供你选择.

注意:Swift for TensorFlow呢?Create ML是给Swift用户的ML工具,而Swift for TensorFlow是给ML用户的Swift语言——该项目目标是提供一个更好的编程语言,和编译器.

开始

要学习本教程,你需要:

  • 一台Mac,运行macOS 10.14 Mojave beta
  • Xcode 10.x beta

点击文章开头或结尾处的下载资料按钮.starter文件夹中包含了:

  • Pets-100, Pets-1000Pets-Testing:这些包含了猫和狗的图片;你将用这些来训练和验证这个猫-狗分类器.
  • ClassifyingImagesWithVisionAndCoreML:苹果CoreML的示例程序;你将用自己在Create ML中训练的模型替换其中的MobileNet模型.
  • good-dog.png:一个附加的狗的图片.
  • turienv.yaml:你将用这个文件来创建一个环境,来运行Turi Create代码.

Create ML图片分类器

首先,准备你的数据 —— 你将用来训练一个图片分类器模型来识别猫和狗的图片.当你展示一张图片,它将返回标签"Cat"或"Dog".要训练这个模型,你需要一个Cat文件夹和一个Dog文件夹.理想的情况下,这两个文件夹应该有同样数量的图片 —— 如果你有30张猫的图片和200张狗的图片,那模型将会偏向于将图片识别为Dog.不要包含任何同时有多种动物的图片.

每个类需要多少张图片?至少10张,但是更多的图片会让模型更加精准.Kaggle Cats and Dogs Dataset中每个类有12500张图片,但你并不是全部需要!训练的时间会随着图片数量而增长,图片数量加倍的话,训练时间大致也会加倍.

为了训练一个Create ML图片分类器,你需要给它一个训练数据集(training dataset) —— 一个包含了分类文件夹的文件夹.事实上,在starter文件夹中包含两个我准备好的数据集,Pets-100Pets-1000.

在完成模型训练后,你将需要一个测试数据集(testing dataset) 来验证模型:一个包含Cat和Dog文件夹的文件夹.测试数据集中的图片应该与训练数据集中的不同,因为你需要验证的是当模型遇到没见过的图片时表现如何.如果你在收集自己的数据,你要将20%的图片放到测试数据集中,其余放在训练数据集中.但我们每个类有12500张图片,所以Pets-Testing包含了900-999张从每个类中抽取的图片.

你将从训练Pets-100模型开始,然后用Pets-Testing测试.然后用Pets-1000训练,用Pets-Testing测试.

苹果的特殊技巧

在Xcode 10中,创建一个新的 macOS 版的 playground,然后输入下面代码:

import CreateMLUI

let builder = MLImageClassifierBuilder()
builder.showInLiveView()

显示辅助编辑区,点击运行按钮:

你将创建并展示一个交互式的视图,来训练和验证一个图片分类器.它神奇地让你体验不同的数据集 —— 因为最重要的不是谁有最好的算法,而是谁有最好的数据.算法目前已经很好了,你可以让数据科学家研究它以变得更好.但是垃圾数据进去,垃圾模型出来;绝大部分时间,精力,花费在了为机器学习策划数据集上.那么现在,这个GUI图片分类器帮助你提升数据规划技巧! 可以下载Kaggle Cats and Dogs Dataset并创建你自己的数据集.在你看到我的数据集产出后,你可能会想要更加认真从一大堆中挑选图片.

拖拽Pets-100文件夹到视图中.训练进程立即开始了.在一段时间后,一个表格出现在debug区域,显示Images Processed, Elapsed TimePercent Complete:

这里发生了什么?这叫做迁移学习(transfer learning).底层模型 —— VisionFeaturePrint_Screen, 它支承了Vision framework —— 是预先用海量数据集训练过的,能识别大量不同类型图片.它通过学习从图片中寻找哪些特征features,及如何组合这些特征来分类图片.所以,你的数据集的训练时间,实际就是抽取大约1000特征的时间.这些特征可能包括了低级的形状和纹理,以及高级的形状如耳朵,两眼距离,口鼻形状.然后它只花费了很少一部分时间来训练一个逻辑回归(logistic regression) 模型来将你的图片分成两类.这就类似于将一条直线分成离散的点,只不过是在1000的尺度上,而不是2.但是它仍然非常快:我这边共了了1m 15s进行特征抽取,0.177886 seconds进行训练及应用逻辑回归.

迁移学习只能在,你的数据集特征点非常类似于训练模型的数据集特征点时,才能成功运行.一个在ImageNet上预先训练的模型 —— 经过大量真实照片训练 —— 可能无法迁移到铅笔画或显微照片上.

你可能想要再浏览两篇有趣的文章,关于Google Brain/Research中的特征:

注意:我是在early-2016 MacBook with 1.1GHz CPU上运行的Create ML.你的时间可能会更快,尤其是当你的Mac是最新款时,或更新的macOS,Xcode版本等
在2017 MacBook Pro with a 2.9GHz i7 CPU, 特征抽取时间下降到11.27s 训练只花费了 0.154341 seconds.

训练&验证准确率(validation accuracy)

当训练完成后,视图上显示TrainingValidation准确率指标,及debug区域的详情.

我得到了100%训练及验证准确率!但你的数值可能不同,因为验证集(validation set) 是从训练会话中随机挑选的,所以你的验证集将会是不同的另外10张图片.没有办法知道哪些图片被选中.

那么什么是验证(validation)?准确率(accuracy)数值是什么意思? Training accuracy很简单:训练涉及到猜测每个特征的权重.因为你给图片的标签是"Cat"或"Dog",训练算法能够检验它的答案并计算正确的百分比.然后,反馈出正确或错误信息给下一次迭代来细化权重. Validation accuracy也类似:在训练开始前,从数据集中随机挑选10%放到验证数据中.像训练集一样,特征被抽取出,答案被计算出来并带有权重.但是结果不用在直接重计算权重上.他们的目的是为了防止模型过拟合overfitting —— 过分关注一些不重要的特征上,如背景色或灯光.如果验证准确率和训练准确率非常不同,算法会自动调整.所以,验证图片的选择,同时影响了验证准确率和训练准确率.Turi Create让你提供一个固定的验证数据集,如果你已经给你的测试数据创建了一个类似特征参数的话.并且你的测试数据集是用户给app提供的照片的代表.

评估(Evaluation)

真正的问题是:模型如何给没有训练过的图片分类?

视图提示你拖拽图片以开始测试:拖拽Pets-Testing文件夹到视图中.很快,在debug区域展示出评估(Evaluation) 准确率,及其详情:

97%准确率:confusion matrix说,有两张猫的图片被误分类成狗了,另有四张狗的照片被误分类成猫了.查看测试图片,看看哪些被模型混淆了.有一张已经在上面图中展示了,还有一张如下:
这两张图片是相当不好的:一个是模糊且太亮了,另一个是模糊且缺少头部信息.模型是重设了图片尺寸到299x299,所以切除掉了一部分你关心的物体,他们理想情况下应该在图片的中心部分,不能太大也不能太小.

在上图中,我点击展示按钮来查看置信度:这个模型100%相信这是一条狗!但是仔细查看其他照片会发现,模型对于其他质量不好的照片依然得到了正确答案.

改进准确率

这个Pets-100训练数据集每个类只有50张照片.Create ML让尝试不同数据集变得简单,来看看更多的数据如何改善准确率.

点击playground的stop按钮,然后当它变成run时再点击一次.这样加载一个新的视图,准备好接受训练数据.

拖拽Pets-1000文件夹到视图中.抽取1000张图片的特征需要的时间会是100张的五到十倍.等待的时候,可以看看苹果的一篇有用的总结文章Improving Your Model’s Accuracy,它给出了改进不同准确率指标的具体建议.

改进训练准确率

  • 增加图片分类器的最大迭代数(Max iterations).(该选项在Xcode第一个beta版不能用,但beta 2版就可以使用了)
  • 为文本分类器使用不同的算法.
  • 为通用分类器或回归量使用不同模型.

改进验证准确率

  • 增加数据量:对于图片分类器,你可以给图片数据增加参数,如翻转flipping, 旋转rotating, 斜切shearing或改变曝光exposure等.参见Apple’s illustration of data augmentation:
  • 可能过拟合:减少最大迭代数(Max iterations).你可能不必为此担忧,因为我的训练只运行了不到10次就达到了满意效果并停了下来.

改进评估准确率

确保你的训练数据足够多样化,能够匹配你的测试数据,并且这两个数据集和你的app上用户上传的图片数据足够类似.

回到playground

训练1000张图片得到100%的训练准确率,但只有96%的验证准确率,我们可以多运行几次,有时能得到99%的验证准确率.

拖拽Pets-Testing文件夹到视图中,来评估(evaluate)这个模型;它在200张测试图片上得到了98.5%的准确率!
这次confusion matrix说模型将三个猫的图片分类为狗.实际上,只有只有同样的两张是以100%置信度被错误标记为狗的.
尽管confusion matrix没有报出错误,但仍然有两张狗的照片被标识为猫,只是置信度较低.它们都是模糊不清,对比度低:
也许你想要更加改善模型,那就需要更多数据,要么使用带参数的1000张图片,要么使用Kaggle中的完整数据集.或者也可以对你的数据集进行挑选,忽略那些糟糕的图片.可以大胆去体验一下!记住这是很容易做到的,训练更大的数据集只多花了一点时间.我尝试过运行了5000张图片:只花了32分钟,我得到了99%的训练准确率和验证准确率...

增加最大迭代次数(Max iterations)?

这个示例程序的准确率相当的好 —— 底层模型很可能已经知道了猫和狗.但是,如果你在训练不同的类型,得到了一个很低的训练准确率,你可能会试着将最大迭代次数(Max iterations) 设置为20.

停止并重新开始 playground,然后点击右上角的展开符号,将10改为20,然后按回车:

点击展开符号以关闭设置,然后打开检查一次,确保还是20.

注意:在Create ML 和 Turi Create中创建都是个问题 —— 你不能不创建就训练模型.为了增加迭代的次数,你必须从头开始并像原来一样抽取特征.Create ML GUI并没有提供选项以保存特征.在那些更加手动的框架中,如Keras,可以构造,编译,然后调整模型,所以调整操作只影响了后面的操作.事实上这是有可能的,对应到Turi Create源码中,拿出抽出图片特征点的低级别代码 —— 这部分很多时候最有用.然后你可以保存抽出的特征,并在你想要更多迭代次数时重新加载它们! 希望这些能让你对Turi Create和Keras更加感兴趣!

使用图片分类器

这里又是苹果的特殊技巧.Create ML GUI输出一个Core ML模型,然后直接拖拽你的模型到旧的Core ML项目中,只要改变代码中的一个单词,就可以运行了!

点击右上角的展开符号,会看到一个不同的设置项.点击文本,改成PetsClassifier.更改Where位置为starter文件夹,然后点击save:

打开starter文件夹中的ClassifyingImagesWithVisionAndCoreML项目.这是苹果2017年的项目,我已经把它升级到了Swift 4.2,并修复了照片读取的问题.这个项目用了MobileNet.mlmodel,大小为17.1MB:

拖拽PetsClassifier.mlmodel到项目的导航区中.它的大小是17KB:

搜索项目中的MobileNet:

let model代码段中,将MobileNet替换为PetsClassifier:

let model = try VNCoreMLModel(for: PetsClassifier().model)

构建并运行.点击相机图标进入照片选择器,然后拖拽一些狗和猫的图片到Photos中:

选择一张;这个app将认出的结果显示在下面的label上:

Turi Create图片分类器

这段代码来自Turi Create image classifier example,使用了同样的数据集 —— 完整的25000张图片的数据集:

import turicreate as tc

# 1. Load images (Note: you can ignore 'Not a JPEG file' errors)
data = tc.image_analysis.load_images('PetImages', with_path=True)

# 2. From the path-name, create a label column
data['label'] = data['path'].apply(lambda path: 'dog' if '/Dog' in path else 'cat')

# Note: If you have more than two classes, extract the folder names like this:
# train_data["label"] = train_data["path"].apply(lambda path: os.path.basename(os.path.split(path)[0]))

# 3. Make a train-test split
train_data, test_data = data.random_split(0.8)

# 4. Create the model
model = tc.image_classifier.create(train_data, target='label')

# 5. Save predictions to an SArray
predictions = model.predict(test_data)

# 6. Evaluate the model and save the results into a dictionary
metrics = model.evaluate(test_data)
print(metrics['accuracy'])

# 7. Save the model for later use in Turi Create
model.save('mymodel.model')

# 8. Export for use in Core ML
model.export_coreml('MyCustomImageClassifier.mlmodel')

这比你在playground中写的代码要多很多,但是你很快就会看到它是类似于Create ML文本分类器代码.

和你在Create ML中所做的类似:

  • 第1步到第4步,对应于创建训练和测试文件夹,然后拖拽训练文件夹到视图中.Turi Create必须从图片路径中抽取类的标签,但第3步随机分配20%的数据集到test_data,节约了你创建训练和测试文件夹的工作,并且每次运行代码时都会得到一份不同的测试数据集.

注意:在第2步中,只抽取两个类的标签是一个特例.我已经在代码中加一个注释,来展示普通的情况.首先,os.path.split() 将路径分离为两部分:文件名(如42.jpg),及其他部分.然后os.path.basename() 是最后一个文件夹的名字,也是类的名字.

  • 第5步和第6步,对应于拖拽测试文件夹到视图中.Jupyter notebook可以像Create ML视图一个轻松展示predictions数组.你还可以过滤数据来找到错误的分类,而不用遍历查看整个测试图片集.
  • 第7步,保存模型以供使用,你可以重新加载它并运行在不同的测试数据集上.
  • 第8步,输出Core ML模型.

所以,Turi Create图片分类是比Create ML更多手动操作,但更多灵活性.turicreate.create()文档列出了一些可选参数.你可以指定底层model以匹配Create ML,注意看Core ML模型的尺寸!如果你已经创建了一个真正的测试数据,不想让模型使用从你的训练数据中随机选择的测试数据,那么你还能设置固定的validation_set.

在Create ML中图片分类是一个非常特殊的例子:MLImageClassifierBuilder的GUI界面使们编写代码不再是必须的了.但在下一章节中,你会看到其他Create ML模型还是需要很多代码.

文本分类器

现在来比较一下,Create ML 和 Turi Create 是如何训练及测试文本分类模型的.Turi Create模型需要将测试文本转换进bag of words里 —— 而在Create ML模型中,这步转换是直接内置在Create ML模型中的,所以直接接收测试文本文件夹就可以了.

Create ML

下面是 Create ML文本分类器示例:

import CreateML

// 1. Load data from a JSON file
let data = try? MLDataTable(contentsOf: URL(fileURLWithPath: "<#/path/to/read/data.json#>"))

// 2. Make a train-test split
let (trainingData, testingData) = data.randomSplit(by: 0.8, seed: 5)

// 3. Create the model
let sentimentClassifier = try? MLTextClassifier(trainingData: trainingData,
  textColumn: "text", labelColumn: "label")
  
// 4. Training accuracy as a percentage
let trainingAccuracy = (1.0 - sentimentClassifier.trainingMetrics.classificationError) * 100

// 5. Validation accuracy as a percentage
let validationAccuracy = (1.0 - sentimentClassifier.validationMetrics.classificationError) * 100

// 6. Evaluation accuracy as a percentage
let evaluationMetrics = sentimentClassifier.evaluation(on: testingData)
let evaluationAccuracy = (1.0 - evaluationMetrics.classificationError) * 100

// 7. Add metadata
let metadata = MLModelMetadata(author: "John Appleseed",
  shortDescription: "A model trained to classify movie review sentiment", version: "1.0")

// 8. Export for use in Core ML
try? sentimentClassifier.write(to: URL(fileURLWithPath: "<#/path/to/save/SentimentClassifier.mlmodel#>"),
    metadata: metadata)
  • 第1步,加载文本和标签列到表格中, 其中标签的值是三种:positive, negativeneutral.在WWDC 2018 Session 703 video中,展示了另一种方式来加载单独保存的名称为positivenegative文本文件的方法,类似于加载图片到图片分类器的方法.但它只适用于Create ML;并不适用于Turi Create.

WWDC 2018 Session 703中的另一种加载标签文本数据的方法:

let trainDirectory = URL(fileURLWithPath: “/Users/createml/Desktop/train”)
let testDirectory = URL(fileURLWithPath: “/Users/createml/Desktop/test”)
// Create Model
let classifier = try MLTextClassifier(trainingData: .labeledDirectories(at: trainDirectory))

回到文本分类器主代码中:

  • 第2步,和Turi Create的 random_split() 一样,随机分配20%数据到testingData.可选的seed参数是用来设置随机数生成器的种子的.
  • 第3步,和Turi Create的 sentence_classifier.create() 中做的一样.
  • 第4-6步,计算训练,验证及评估准确率指标.
  • 第7步和第8步输出带有元数据的Core ML模型.

Turi Create

这些代码来自我们的教程Natural Language Processing on iOS with Turi Create.它用10个诗人的诗集训练了一个句子分类器,来预测测试文本的作者.

import turicreate as tc

# 1. Load data from a JSON file
data = tc.SFrame.read_json('corpus.json', orient='records')

# 2. Create the model
model = tc.sentence_classifier.create(data, 'author', features=['text'])

# 3. Export for use in Core ML
model.export_coreml('Poets.mlmodel')
  • 第1步,和Create ML一样,你可以从JSON或CSV文件中加载数据.
  • 第2步,训练模型.
  • 第3步,输出Core ML模型.

在Turi Create教程资料中包含一个iOS的app,你可以将文本粘贴在textview中来测试模型.这个app使用了一个wordCounts(text:) 函数,作用类似于Turi Create text classification example末尾的bag of words函数.

这个Turi Create文本分类器期望输入是以字典形式的单词和单词数.而Create ML文本分类器直接接收文本输入,并创建自己的bag of words.

Turi Create图片相似度

现在请深呼吸 —— 你将深入Turi Create 冒险了!

Turi Create还有其他五个任务处理工具集(task-focused toolkits)目前暂未包含在Create ML中:

  • 推荐系统
  • 图片相似度
  • 物体检测
  • 风格迁移
  • 活动分类

猫狗的图片看起来非常有趣,所以你将训练一个模型来找到相似图片.

是的,你现在需要写点Python了.开发环境用Jupyter notebook你会感觉很熟悉 —— 它很像是一个Xcode的playground,但是运行在你的浏览器中.

最简单的方式是使用Anaconda —— 它是ML社区创建的,用来整理所有版本的Python和ML库,并在单独的环境(environments) 中管理它们.

Anaconda & Notebooks

下载Python 3.6 version of Anaconda for macOS,在你的home directory中安装它,不要在root目录:

如果它说无法安装,点击Install on a specific disk…按钮,然后点击返回到Home按钮 —— 就可以安装了:

注意:安装Anaconda及创建Tuti Create环境会花费几分钟时间.当你在等待时,可以浏览下Michael Kennedy在2014年十一月发表的Comparison of Python and Swift Syntax和Jason Brownlee在2016年五月发表的Crash Course in Python for Machine Learning Developers.Brownlee的文章包含了使用数据科学库NumPy, Matplotlib 和 Pandas的示例.Swift和Python语法的最大不同是当你定义闭包,函数和类的时候,用缩进而不是 {...} .

创建Turi Create环境

可以使用Anaconda Navigator GUI或者终端(Terminal)命令来创建环境,来运行Turi Create代码.

GUI:打开Anaconda Navigator,切换到Environments标签页面,并导入starter/turienv.yaml —— 点击文件夹图标并在Finder中设置文件位置. Anaconda Navigator将会从文件中填充环境名称:

Terminal:打开Terminal,输入以下命令:

conda env create -f <drag starter/turienv.yaml file from Finder>

启动Jupyter Notebook

turienv环境下,用GUI或Terminal命令来启动 Jupyter notebook.

首先,在Finder中,创建一个本地文件夹命名notebooks.

如果你用的是最新的Mac,下载解压Kaggle Cats and Dogs Dataset,然后移动PetImages文件夹到notebooks中,这样你就可以轻松将其加载到notebook中.

完整的Kaggle数据集包含25000张图片,在老的Mac上需要花很长时间来处理.也可以使用Pets-1000文件来代替,或者创建你自己的数据集.

GUI:如果你使用Anaconda Navigator,切换到Home标签页,点击Applications on上的turienv,然后点击jupyter Launch:

一个终端窗口会打开,以运行Jupyter服务器,然后一个浏览器窗口显示你的首页文件夹.切换回你的notebooks文件夹. Terminal:如果你在使用Terminal,输入下列命令以加载turienv:

source activate turienv

这个命令行提示符(command line prompt)现在带有 (turienv) 启动.输入下面命令来在notebooks文件夹中启动Jupyter服务器,并显示浏览器窗口:

jupyter notebook <drag notebooks folder from the Finder>

训练模型

创建一个新的Python 3.6 notebook:

双击标题,重命名notebook:

注意:这个示例和苹果的Image similarity示例一样,只是用了猫和狗数据集.

在notebook中包含了一个空白单元格.在单元格中输入下面一行,然后点击Shift-Enter来运行单元格:

import turicreate as tc

注意:Shift-Enter在Xcode playground中也可以使用,如果你只想运行一段代码的话.

又一个新的单元格出现了.输入下面内容,然后运行:

reference_data = tc.image_analysis.load_images('./PetImages')
reference_data = reference_data.add_row_number()
reference_data.save('./kaggle-pets.sframe')

现在你正在将图片加载到表格中,并给表格添加行号,然后保存以供将来使用.忽略JPEG decode failure信息.

注意:当输入Python代码时,使用tab键来自动补全.

在下一个单元格中,运行下面语句来检索数据:

reference_data.explore()

一个新窗口打开,显示id,路径和图片列.将光标移动到行上,展示图片:

接下来,运行下面语句:

model = tc.image_similarity.create(reference_data)

这会花费一段时间 —— 在 [ * ] 中显示它正在运行.在等待的时候,阅读一下无监督学习(unsupervised learning) 吧.

注意:如果需要在完成前手动停止单元格,点击Stop按钮(在工具条中Run旁边).可以从PetImages中删除图片,或只加载Pets-1000.我在我的2015款MacBook Pro运行时,出去吃了午饭,90分钟回来后才运行完成.

无监督学习

提供标签数据给图片分类器,能让它通过检测自己的预测与标签的差异,来衡量准确率.这就是监督学习(supervised learning).

然而,有时尽管你提供了同样的标签数据集给一个图片相似训练器,它也并不使用这些标签:这个模型使用的是无监督学习(unsupervised learning).基础模型查看非常大量的图片,并教会自己,哪些像素组合会构成特征(features),可以用来聚类(cluster) "相似"的图片.所以正如图片分类器一样,大部分训练时间被用来从你的数据集中抽取特征.然后,它进行"暴力"最近邻居(nearest neighbors)模型训练:对于每张图片,它计算其到其它图片的距离(distance),并将其它图片按半径排序.然后,再一次与抽取出的特征点比较,这一步会很快.

查询模型

当模型准备好后,运行下面几行:

query_results = model.query(reference_data[0:10], k=10)
query_results.head()

这样,你就将包含10张reference_data图片的数组传了进去,计算10张各自的相似度,然后展示query_results的前10行.

假设你想要看第10张的相似图片.首先,看看它是什么:

reference_data[9]['image'].show()

由于图片的加载顺序是不确定的,所以你的第10张图片很可能是不一样的.重要的是输出应该像下面一样.

所以,运行这几行代码:

similar_rows = query_results[query_results['query_label'] == 9]['reference_label']
reference_data.filter_by(similar_rows, 'id').explore()

目标图片实际上就是返回的第一张图片.其它的图片则展示那些相似的猫咪,或者只是摆放位置相似的猫咪.

恭喜你! 你现在已经用Python创建了一个图片相似度模型! 你的Mac也没有累爆炸.希望,你也会尝试一下在你自己的数据上运行其它Turi Create示例.

关闭

退出登录(Log out) jupyter 浏览窗口.

在终端(Terminal)窗口中,jupyter服务器正在运行,按Control-C-C来停止服务器.

如果你的命令行提示符(command line prompt)是以 (turienv) 启动的,输入下面指令来退出(exit):

source deactivate

如果你真的不想再使用Anaconda了,输入下面命令:

rm -rf ~/anaconda3

然后如何做?

完整版Turi Create notebook 和 iOS project放在本文资料中的finished文件夹中.在开头或结尾处可以下载.

现在你已经学会了在Create ML中用数据集进行实验,希望你能继续学习Turi Create.

探索Create ML及其官方文档,同时也要花点时间浏览Turi Create User Guide,即使你不想使用Python.在Turi Create的How it works文档中,提供了大量的资料,并且无需深奥的数学知识.想要了解更多,参照他们的学术引用链接.

下面,是继续学习的一些资源:

我们的教程

本文是我们系列ML教程中的最新篇.其它还有:

ML社区

我希望你喜欢本Create ML教程,如果你有任何问题或意见,请在下面评论.特别是记得告诉我们你用Create ML和Turi Create做什么!

本文资料下载