本文是对Raywenderlich上的mac/iOS平台机器学习文章Create ML Tutorial:Getting Started的翻译.
因为译者对机器学习了解不够深刻,翻译的疏漏再所不免,敬请原谅.html
本文资料下载python
Create ML就是苹果决心的证实:苹果决心让你更简单在app中使用机器学习模型.在本教程中,你将学习如何用Create ML加速工做流程:经过改进数据来改进模型,而且经过使用Xcode和Swift来下降学习曲线.ios
与此同时,你还会更加熟悉ML工具集和术语.而不须要引入数学! 你不须要知道如何编写一个编译器来使用Swift,你也不须要编写一个新的ML算法来使用分类器.有了Create ML,你就没有了不开始学习机器学习的理由!git
Apple ML的简明历史:github
本教程中,你将从一个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中,给相同数量的猫和狗的数据集建立一个图片类似度模型.macos
你能够耐心等待并但愿苹果将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语言——该项目目标是提供一个更好的编程语言,和编译器.json
要学习本教程,你须要:swift
点击文章开头或结尾处的下载资料按钮.starter文件夹中包含了:
首先,准备你的数据 —— 你将用来训练一个图片分类器模型来识别猫和狗的图片.当你展现一张图片,它将返回标签"Cat"或"Dog".要训练这个模型,你须要一个Cat文件夹和一个Dog文件夹.理想的状况下,这两个文件夹应该有一样数量的图片 —— 若是你有30张猫的图片和200张狗的图片,那模型将会偏向于将图片识别为Dog.不要包含任何同时有多种动物的图片.
每一个类须要多少张图片?至少10张,可是更多的图片会让模型更加精准.Kaggle Cats and Dogs Dataset中每一个类有12500张图片,但你并非所有须要!训练的时间会随着图片数量而增加,图片数量加倍的话,训练时间大体也会加倍.
为了训练一个Create ML图片分类器,你须要给它一个训练数据集(training dataset) —— 一个包含了分类文件夹的文件夹.事实上,在starter文件夹中包含两个我准备好的数据集,Pets-100和Pets-1000.
你将从训练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 Time 和 Percent 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.
当训练完成后,视图上显示Training及Validation准确率指标,及debug区域的详情.
那么什么是验证(validation)?准确率(accuracy)数值是什么意思? Training accuracy很简单:训练涉及到猜想每一个特征的权重.由于你给图片的标签是"Cat"或"Dog",训练算法可以检验它的答案并计算正确的百分比.而后,反馈出正确或错误信息给下一次迭代来细化权重. Validation accuracy也相似:在训练开始前,从数据集中随机挑选10%放到验证数据中.像训练集同样,特征被抽取出,答案被计算出来并带有权重.可是结果不用在直接重计算权重上.他们的目的是为了防止模型过拟合overfitting —— 过度关注一些不重要的特征上,如背景色或灯光.若是验证准确率和训练准确率很是不一样,算法会自动调整.因此,验证图片的选择,同时影响了验证准确率和训练准确率.Turi Create让你提供一个固定的验证数据集,若是你已经给你的测试数据建立了一个相似特征参数的话.而且你的测试数据集是用户给app提供的照片的表明.
真正的问题是:模型如何给没有训练过的图片分类?
视图提示你拖拽图片以开始测试:拖拽Pets-Testing文件夹到视图中.很快,在debug区域展现出评估(Evaluation) 准确率,及其详情:
在上图中,我点击展现按钮来查看置信度:这个模型100%相信这是一条狗!可是仔细查看其余照片会发现,模型对于其余质量很差的照片依然获得了正确答案.
这个Pets-100训练数据集每一个类只有50张照片.Create ML让尝试不一样数据集变得简单,来看看更多的数据如何改善准确率.
点击playground的stop按钮,而后当它变成run时再点击一次.这样加载一个新的视图,准备好接受训练数据.
确保你的训练数据足够多样化,可以匹配你的测试数据,而且这两个数据集和你的app上用户上传的图片数据足够相似.
训练1000张图片获得100%的训练准确率,但只有96%的验证准确率,咱们能够多运行几回,有时能获得99%的验证准确率.
这个示例程序的准确率至关的好 —— 底层模型极可能已经知道了猫和狗.可是,若是你在训练不一样的类型,获得了一个很低的训练准确率,你可能会试着将最大迭代次数(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 = try VNCoreMLModel(for: PetsClassifier().model)
复制代码
构建并运行.点击相机图标进入照片选择器,而后拖拽一些狗和猫的图片到Photos中:
这段代码来自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中所作的相似:
注意:在第2步中,只抽取两个类的标签是一个特例.我已经在代码中加一个注释,来展现普通的状况.首先,os.path.split() 将路径分离为两部分:文件名(如42.jpg),及其余部分.而后os.path.basename() 是最后一个文件夹的名字,也是类的名字.
因此,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文本分类器示例:
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)
复制代码
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))
复制代码
回到文本分类器主代码中:
这些代码来自咱们的教程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')
复制代码
在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还有其余五个任务处理工具集(task-focused toolkits)目前暂未包含在Create ML中:
猫狗的图片看起来很是有趣,因此你将训练一个模型来找到类似图片.
是的,你如今须要写点Python了.开发环境用Jupyter notebook你会感受很熟悉 —— 它很像是一个Xcode的playground,可是运行在你的浏览器中.
最简单的方式是使用Anaconda —— 它是ML社区建立的,用来整理全部版本的Python和ML库,并在单独的环境(environments) 中管理它们.
下载Python 3.6 version of Anaconda for macOS,在你的home directory中安装它,不要在root目录:
注意:安装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语法的最大不一样是当你定义闭包,函数和类的时候,用缩进而不是 {...} .
可使用Anaconda Navigator GUI或者终端(Terminal)命令来建立环境,来运行Turi Create代码.
GUI:打开Anaconda Navigator,切换到Environments标签页面,并导入starter/turienv.yaml —— 点击文件夹图标并在Finder中设置文件位置. Anaconda Navigator将会从文件中填充环境名称:
conda env create -f <drag starter/turienv.yaml file from Finder>
复制代码
在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:
source activate turienv
复制代码
这个命令行提示符(command line prompt)如今带有 (turienv) 启动.输入下面命令来在notebooks文件夹中启动Jupyter服务器,并显示浏览器窗口:
jupyter notebook <drag notebooks folder from the Finder>
复制代码
建立一个新的Python 3.6 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()
复制代码
因此,运行这几行代码:
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教程中的最新篇.其它还有:
我但愿你喜欢本Create ML教程,若是你有任何问题或意见,请在下面评论.特别是记得告诉咱们你用Create ML和Turi Create作什么!
本文资料下载