Core ML 机器学习
在WWDC 2017开发者大会上,苹果宣布了一系列新的面向开发者的机器学习 API,包括面部识别的视觉 API、自然语言处理 API,这些 API 集成了苹果所谓的 Core ML 框架。Core ML 的核心是加速在 iPhone、iPad、Apple Watch 上的人工智能任务,支持深度神经网络、循环神经网络、卷积神经网络、支持向量机、树集成、线性模型等。
概览
借助 Core ML,您可以将已训练好的机器学习模型,集成到自己的应用当中。
支持操作系统:iOS 、macOS 、tvOS 、watchOS
所谓已训练模型 (trained model),指的是对一组训练数据应用了某个机器学习算法后,所生成的一组结果。举个例子,通过某个地区的历史房价来训练出一个模型,那么只要指定房间有几卧几卫,就有可能对未来该房间的房价做出预测。
Core ML 是领域特定 (domain-specific) 框架和功能的基础所在。Core ML 为 Vision 提供了图像处理的支持,为 Foundation 提供了自然语言处理的支持(例如 NSLinguisticTagger类),为 GameplayKit 提供了对学习决策树 (learned decision tree) 进行分析的支持。Core ML 本身是基于底层基本类型而建立的,包括Accelerate、BNNS 以及 Metal Performance Shaders 等。
Core ML 针对设备的性能进行了优化,最大限度地减少内存占用和功耗。通过在设备上运行的严格要求,不仅保护了用户数据隐私,而且当网络连接丢失的时候,还能够保证应用能正常工作和响应。
获取 Core ML 模型
获取 Core ML 模型,以便能在您的应用当中使用。
Core ML 支持多种机器学习模型,其中包括了神经网络 (Neural Network)、组合树 (Tree Ensemble)、支持向量机 (Support Vector Machine) 以及广义线性模型 (Generalized Linear Model)。Core ML 的运行需要使用 Core ML 模型格式(也就是以 .mlmodel 扩展名结尾的模型)。
Apple 提供了一些常见的开源模型供大家使用,这些模型已经使用了 Core ML 模型格式。您可以自行下载这些模型,然后就可以开始在应用中使用它们了。此外,其他的研究机构和大学都发布了不少机器学习模型和训练数据,这些往往都不是以 Core ML 模型格式发布出来的。如果您打算使用这些模型的话,需要对它们进行转换,具体内容详见「将已训练模型转换为 Core ML」。
将 Core ML 模型集成到应用中
向应用中添加一个简单的模型,然后向模型中传入输入数据,并对模型的预测值进行处理。
点击此处下载示例应用。
概述
本示例应用使用了一个已训练模型 MarsHabitatPricer.mlmodel,用以预测火星上的殖民地价值。
将模型添加到 Xcode 项目中
要想将模型添加到 Xcode 项目当中,只需要将模型拖曳进项目导航器 (project navigator) 当中即可。
您可以通过在 Xcode 中打开这个模型,从而来查看它的相关信息,其中包括有模型类型以及其预期输入和输出。模型的输入为太阳能板和温室的数量,以及殖民地的规模大小(以英亩为单位)。模型的输出则是对这个殖民地价值的预测。
用代码创建模型
Xcode 同样也会使用模型的输入输出信息,来自动为模型生成一个自定义的编程接口,从而就可以在代码当中与模型进行交互。对于这个 MarsHabitatPricer.mlmodel 而言,Xcode 会生成相应的接口,来分别表示模型本身(MarsHabitatPricer)、模型输入 (MarsHabitatPricerInput) 以及模型输出 (MarsHabitatPricerOutput)。
使用所生成的 MarsHabitatPricer 类的构造器,便可以创建这个模型:
let model = MarsHabitatPricer()
获取输入值以传递给模型
示例应用使用了 UIPickerView,以便从用户那里获取模型的输入值。
func selectedRow(for feature: Feature) -> Int {
return pickerView.selectedRow(inComponent: feature.rawValue)
}
let solarPanels = pickerDataSource.value(for: selectedRow(for: .solarPanels), feature: .solarPanels)
let greenhouses = pickerDataSource.value(for: selectedRow(for: .greenhouses), feature: .greenhouses)
let size = pickerDataSource.value(for: selectedRow(for: .size), feature: .size)
使用模型来进行预测
MarsHabitatPricer 类会生成一个名为 prediction(solarPanels:greenhouses:size:) 方法,从而就可以根据模型的输入值来预测价值,在本例当中,输入值为太阳能板的数量、温室的数量以及殖民地的规模大小(以英亩为单位)。这个方法的结果为一个 MarsHabitatPricerOutput 实例,这里我们将其取名为 marsHabitatPricerOutput。
guard let marsHabitatPricerOutput = try? model.prediction(solarPanels: solarPanels, greenhouses: greenhouses, size: size) else {
fatalError("Unexpected runtime error.")
}
通过读取 marsHabitatPricerOutput 的 price 属性,就可以获取所预测的价值,然后就可以在应用的 UI 当中对这个结果进行展示。
let price = marsHabitatPricerOutput.price
priceLabel.text = priceFormatter.string(for: price)
注意
所生成的 prediction(solarPanels:greenhouses:size:) 方法会抛出异常。在使用 Core ML 的时候,您大多数时候遇到的错误通常是:传递给方法的输入数据类型与模型预期的输入类型不同——例如,用错误格式表示的图片类型。在示例应用当中,预期的输入类型为 Double。所有的类型不匹配错误都会在编译时被捕获,如果遇到了某种错误,那么示例应用就会弹出一个致命错误。
构建并运行 Core ML 应用
Xcode 会将 Core ML 模型编译到资源当中,从而进行优化并能够在设备上运行。优化过的模型表征会包含在您的应用程序包当中,在应用在设备上运行的时候,就可以用之来进行预测。
将已训练模型转换为 Core ML
将由第三方机器学习工具所创建的已训练模型,转换为 Core ML 模型格式。
概述
如果您已经使用了第三方机器学习工具来创建和训练模型,只要这个工具是受支持的,那么就可以使用Core ML Tools来将这些模型转换为 Core ML 模型格式。表 1 列出了我们支持的模型和第三方工具。
注意
Core ML Tools 是一个 Python 包 (coremltools),并挂载在 Python Package Index (PyPI) 上。要了解关于 Python 包的更多信息,请参阅Python Packaging User Guide。
模型转换
您可以使用 Core ML 转换器,并根据对应的模型第三方工具,来对模型进行转换。通过调用转换器的 convert 方法,然后再将结果保存为 Core ML 模型格式 (.mlmodel)。
例如,如果您的模型是使用 Caffe 来创建的,您可以将 Caffe 模型 (.caffemodel) 传递给 coremltools.converters.caffe.convert 方法。
import coremltools
coreml_model = coremltools.converters.caffe.convert('my_caffe_model.caffemodel')
然后将结果保存为 Core ML 模型格式。
coreml_model.save('my_model.mlmodel')
根据您模型的不同,您可能会需要更新输入、输出以及相关的参数标签,或者您还可能会需要声明图片名称、类型以及格式。转换工具内置了更详细的文档,因为可用的选项因工具而异。
或者,还可以编写自定义的转换工具
如果您需要转换的格式不在表 1 当中,那么您可以创建自己的转换工具。
编写自定义的转换工具,包括了将模型的输入、输出和架构表示转换为 Core ML 模型格式。您可以通过将每一层模型架构,以及层之间的连接关系进行定义,来实现这个操作。您可以通过 Core ML Tools 所提供的转换工具作为参考;它们演示了如何将各种第三方工具创建的模型类型,转换为 Core ML 模型格式。
注意
Core ML 模型格式由一系列 Protocol Buffer 文件所定义,具体信息请参见 Core ML Model Specification。
Core ML API
直接使用 Core ML API,从而支持自定义工作流以及更为高级的用例。
在绝大多数情况下,您只需要与模型动态生成的接口进行交互即可,也就是说当您将模型添加到 Xcode 项目当中的时候,这个接口就由 Xcode 自动创建完毕了。您可以直接使用 Core ML API,以便支持自定义工作流或者更为高级的用例。举个例子,如果您需要将输入数据异步收集到自定义结构体,从而来执行预测的话,那么您就可以让这个结构体实现 MLFeatureProvider协议,从而来为模型提供输入功能。
具体的 API 列表请参见 Core ML API。
Core ML 机器学习的更多相关文章
- 机器学习 AI 谷歌ML Kit 与苹果Core ML
概述 移动端所说的AI,通常是指"机器学习". 定义:机器学习其实就是研究计算机怎样模拟人类的学习行为,以获取新的知识或技能,并重新组织已有的知识结构使之不断改善自身.从实践的意义 ...
- iOS 11: CORE ML—浅析
本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/OWD5UEiVu5JpYArcd2H9ig 作者:l ...
- iOS Core ML与Vision初识
代码地址如下:http://www.demodashi.com/demo/11715.html 教之道 贵以专 昔孟母 择邻处 子不学 断机杼 随着苹果新品iPhone x的发布,正式版iOS 11也 ...
- core ML学习
Core ML工具是一个Python包(coremltools),托管在Python包索引(PyPI)上. 从表格中可看出,支持caffe工具. 使用与模型的第三方工具相对应的Core ML转换器转换 ...
- Spark ML机器学习
Spark提供了常用机器学习算法的实现, 封装于spark.ml和spark.mllib中. spark.mllib是基于RDD的机器学习库, spark.ml是基于DataFrame的机器学习库. ...
- ml机器学习笔记
一.安装机器学习的包 1.conda create -n ml python=3.6 2.source activate ml 3.升级pip :pip install --upgrade pip 4 ...
- ML机器学习导论学习笔记
机器学习的定义: 机器学习(Machine Learning, ML)是一门多领域交叉学科,涉及概率论.统计学.逼近论.凸分析.算法复杂度理论等多门学科.专门研究计算机怎样模拟或实现人类的学习行为,以 ...
- ML—机器学习常用包(持续更新….)
机器学习是计算机科学和统计学的边缘交叉领域,R关于机器学习的包主要包括以下几个方面: 1)神经网络(Neural Networks): nnet.AMORE以及neuralnet,nnet提供了最常见 ...
- ML:机器学习中常用的Octave语句
coursera上吴恩达的机器学习课程使用Octave/Matlab实现算法,有必要知道Octave简单的语句.最重要的:在遇到不会的语句,使用'''help '''或者'''doc '''查看官方文 ...
随机推荐
- uc广告过滤你能更坑点不
背景: 搞的手机站要上线,电脑测试木有问题,拿手机访问,有个页面始终不正常, 其他的 windows phone 的正常, ios 的也正常 就唯独 ,用的是安卓,uc的浏览器显示有问题 我勒个去,那 ...
- Unity Android路径及注意事项
Application.temporaryCachePath==/storage/emulated/0/Android/data/com.***.***/cache Application.persi ...
- JS 实现banner图的滚动和选择效果
CSS+JS实现banner图滚动和点击切换 HTML 部分代码: <body> <div id="banner"> <div id="in ...
- DirectFB 之 字体显示
通过本文,可以简单地了解directfb字体内部运行机制. 简介 SetFont函数,是每次写字体前必须调用的一个函数,否则directfb程序将会报错.这个函数是将某种字体与某个surface相关联 ...
- 详细解剖大型H5单页面应用的核心技术点
项目 Xut.js 阐述下开发中一个比较核心的优化技术点,这是一套平台代码,并非某一个插件功能或者框架可以直接拿来使用,核心代码大概是6万行左右(不包含任何插件) .这也并非一个开源项目,不能商业使用 ...
- 当谈 SQL 优化时谈些什么?
欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者:孙银行 背景 Mysql数据库作为数据持久化的存储系统,在实际业务中应用广泛.在应用也经常会因为SQL遇 ...
- MongoDB副本集的常用操作及原理
本文是对MongoDB副本集常用操作的一个汇总,同时也穿插着介绍了操作背后的原理及注意点. 结合之前的文章:MongoDB副本集的搭建,大家可以在较短的时间内熟悉MongoDB的搭建和管理. 下面的操 ...
- 解决oracle用户锁定
故障现象: SQL> connect scott/scottERROR:ORA-01017: invalid username/password; logon deniedSQL> ...
- Android计时器 android.widget.Chronometer
说起做定时器,大家一般会想到Timer和Executors的定时器线程池,其实用这两个做都会有问题,在停止和重新计时时你回发现无法停止或者说计时加快(加快是因为多个线程在记录同一个变量),Androi ...
- OC中常见的结构体,以及NSNumber、NSValue、NSDate的使用
常见的结构体 NSPoint和CGPoint NSSize和CGSize NSRect 和 CGRect NSPoint和CGPoint的使用 NSPoint和CGPoint是同义的 typedef ...