e-works数字化企业网  »  文章频道  »  基础信息化  »  终端和服务器

iOS 11:机器学习人人有份

2017/7/11    来源:搜狐    作者:Matthijs Hollemans      
关键字:iOS  机器学习  
WWDC 2017 使一件事情变得非常清楚,那就是:Apple 正在全力以赴地支持「设备上的机器学习」了。
    WWDC 2017 使一件事情变得非常清楚,那就是:Apple 正在全力以赴地支持「设备上的机器学习」了。
 
    他们希望 App 的开发者们能够尽可能的简单的加入他们的行列中。
 
    Apple 去年发布了可以用于创建基本的卷积神经网的 Metal CNN 和 BNNS 框架。今年,Metal 得到了进一步扩展,增加了一个全新的计算机视觉框架,以及 Core ML:一个能够轻松地将机器学习集成到 App 中的工具包。
 
iOS 11:机器学习人人有份
 
    Core ML framework
 
    在这片文章中,我将就 iOS 11 和 macOS 10.13 中这些新推出的机器学习的内容,分享我自己的一些想法和经验。
 
    Core ML
 
    Core ML 在 WWDC 上获得了极大的关注度,原因很简单:大部分开发者希望能够在他们的 App 中使用这个框架。
 
    Core ML 的 API 非常简单。你只能用它做这些事情:
 
    加载一个训练好的模型
 
    做出预测
 
    收益!!!
 
    这看起来好像很有限,但实际上你一般只会在 App 中加载模型和做出预测这两件事。
 
    在 Core ML 之前,加载训练好的模型是非常困难的 —— 实际上,我写过一个框架来减轻这种痛苦。所以现在我对这一个简单的两步过程感到非常高兴。
 
    模型被包含在了一个.mlmodel 的文件中。这是一种新的开源文件格式,用于描述模型中的 layer、输入输出、标签,以及需要在数据上产生的任何预处理过程。它还包括了所有的学习参数(权重和偏置)。
 
    使用模型所需的一切都在这一个文件里面了。
 
    你只需要将 mlmodel 文件放入你的项目中,Xcode 将会自动生成一个 Swift 或 Objective-C 的包装类,使你能简单的使用这个模型。
 
    举个例子,如果你把文件ResNet50.mlmodel 添加到你的 Xcode 项目中,那么你就可以这么写来实例化这个模型:
 
    let model = ResNet50()
 
    然后做出预测:
 
    let pixelBuffer: CVPixelBuffer = /* your image */if let prediction = try? model.prediction(image: pixelBuffer) {
 
    print(prediction.classLabel)
 
    }
 
    这差不多就是所有要写的东西了。你不需要编写任何代码来加载模型,或者将其输出转换成可以从 Swift 直接使用的内容 —— 这一切都将由 Core ML 和 Xcode 来处理。
 
    注意: 要了解背后发生了什么,可以在 Project Navigator 里选择 mlmodel 文件,然后点击 Swift generated source 右边的箭头按钮,就能够查看生成的帮助代码了。
 
    Core ML 将决定自己到底是在 CPU 上运行还是 GPU 上运行。这使得它能够充分的利用可以用的资源。Core ML 甚至可以将模型分割成仅在 GPU 上执行的部分(需要大量计算的任务)以及 CPU 上的其他部分(需要大量内存的任务)。
 
    Core ML 使用 CPU 的能力对于我们开发者来说另一个很大的好处是:你可以从 iOS 模拟器运行它,从而运行那些对于 Metal 来说做不到,同时在单元测试中也不太好的任务。
 
    Core ML 支持什么模型?
 
    上面的 ResNet50 例子展示的是一个图像分类器,但是 Core ML 可以处理几种不同类型的模型,如:
 
    支持向量机 SVM
 
    诸如随机森林和提升树的决策树集成
 
    线性回归和 logistic 回归
 
    前馈神经网、卷积神经网、递归神经网
 
    所有这些模型都可以用于回归问题和分类问题。此外,你的模型可以包含这些典型的机器学习预处理操作,例如独热编码(one-hot encoding)、特征缩放(feature scaling)、缺失值处理等等。
 
    Apple 提供了很多已经训练好的模型,例如 Inception v3、ResNet50 和 VGG16 等,但你也可以使用 这个 Python 库来转换自己的模型。
 
    目前,你可以转换使用 Keras、Caffe、scikit-learn、XGBoost 和 libSVM 训练的模型。转换工具只会支持具体指定的版本,比如 Keras 支持 1.2.2 但不支持 2.0。辛运的是,该工具是开源的,所以毫无疑问它将来会支持更多的训练工具包。
 
    如果这些都不行,你还是可以随时编写自己的转换器。mlmodel 文件格式是开源且可以直接使用的(由 Apple 制定发布的一种 protobuf 格式)
 
    局限
 
    如果你想在你的 App 上马上运行一个模型, Core ML 很不错。然而使用这样一个简单的 API 一定会有一些限制。
 
    仅支持有监督学习的模型,无监督学习和增强学习都是不行的。(不过有一个「通用」的神经网络类型支持,因此你可以使用它)
 
    设备上不能进行训练。你需要使用离线工具包来进行训练,然后将它们转换到 Core ML 格式。
 
    如果 Core ML 不支持某种类型的 layer,那么你就不能使用它。在这一点上,你不能使用自己的 kernel 来扩展 Core ML。在使用 TensorFlow 这样的工具来构建通用计算图模型时,mlmodel 文件格式可能就不那么灵活了。
 
    Core ML 转换工具只支持特定版本的数量有限的训练工具。例如,如果你在 TensorFLow 中训练了一个模型,则无法使用此工具,你必须编写自己的转换脚本。正如我刚才提到的:如果你的 TensorFlow 模型具有一些 mlmodel 不支持的特性,那么你就不能在 Core ML 上使用你的模型。
 
    你不能查看中间层的输出,只能获得最后一层网络的预测值。
 
    我感觉下载模型更新会造成一些问题,如果你不想每次重新训练模型的时候都重写一个新版本的 App,那么 Core ML 不适合你。
 
    Core ML 对外屏蔽了它是运行在 CPU 上还是 GPU 上的细节 —— 这很方便 —— 但你必须相信它对你的 App 能做出正确的事情。即便你真的需要,你也不能强迫 Core ML 运行在 GPU 上。
 
    如果你能够忍受这些限制,那么 Core ML 对你来说就是正确的选择。
 
    否则的话,如果你想要完全的控制权,那么你必须使用 Metal Performance Shader 或 Accelerate 框架 —— 甚至一起使用 —— 来驱动你的模型了!
 
    当然,真正的黑魔法不是 Core ML,而是你的模型。如果你连模型都没有,Core ML 是没有用的。而设计和训练一个模型就是机器学习的难点所在……
 
    一个快速示例程序
 
    我写了一个使用了 Core ML 的简单的示例项目,和往常一样,你可以在 GitHub 上找到源码。
 
iOS 11:机器学习人人有份
 
    The demo app in action

责任编辑:李欢
本文为授权转载文章,任何人未经原授权方同意,不得复制、转载、摘编等任何方式进行使用,e-works不承担由此而产生的任何法律责任! 如有异议请及时告之,以便进行及时处理。联系方式:editor@e-works.net.cn tel:027-87592219/20/21。
e-works
官方微信
掌上
信息化
编辑推荐
新闻推荐
博客推荐
视频推荐