ML-in-ios

在 iOS 中加入 机器学习

首先什么是机器学习….. 在这篇文章中, blabla…的讲了一堆, 感觉没有直接由国人用国人的理解用汉语讲出来的对口, 反正感觉这篇文章的描述过于和生物的神经网络结合在一起了, 不太好, 会误导. 或者英文原文会好一点? 反正关于机器学习的基本概念, 我是从其他地方看来的, 比较懒的话, 推荐一个叫莫烦的 UP主, b 站有开哦~

嗯, 关键点在这:

Apple 的 API 只允许在设备上进行推断, 因此你需要有一个预先训练好的模型来执行预测

选择一个预训练模型

  • Apple 提供了4种预训练模型, 大多数在日常图像方面做的不错
  • 使用开源产品提供的预训练模型, 如 Keras

机器学习 API

主要分了三层:

  • Vision, Natural Language Processing, GamePlayKit
  • Core ML
  • Accelerate & BNNS

一般我们可以方便的使用顶层的 API,
也可以使用Core ML 这一层的 API,将预训练模型集成进去, apple 提供了一个很好用的统一 API, 从而能够借助机器学习模型格式来使用任意类型的模型.

也可以深入底层, 直接使用底层提供的 API, 但是这样做就不得不自己处理很多事务.

集成 CoreML

大部分API 都是以 CPU 为中心的, 我们有几个关注点:

  • Core ML 工作流程
  • 如何导入模型
  • 借助 CoreML 能实现哪些类型的操作

CoreML中提供了许多不同类型的机器学习方法。其中有迷你神经网络、组合树、支持向量机和广义线性模型。Core ML 提供给我们的方法基本涵盖了绝大多数机器学习技术。

集成自带模型

集成很简单, 可以使用 apple 提供的4种机器学习模型中的某一个, 导入到 Xcode, Xcode 会自动用 Swift 生成一个具备该模型名称的类. (在 wwdc 中的例子就是 MarsHabitatPricer() 这个机器学习模型了)

然后, 就能使用 MarsHabitatPricer() 来初始化这个模型, -> 然后把数据输入其中, 并进行预测. 这些就是…使用所创建的模型, 基于拥有的输入来调用预测方法就可以了…编译运行… 很简单把?

集成第三方模型

这属于自定义机器学习模型

可以查看到 apple 提供的所有模型能干什么, 当 apple 提供的所有模型都无法为应用带来价值的时候, 就可以考虑使用自定义模型了

一个是 Google 的Places205-GoogleNet, 可以检测205个类别的图像场景, 比如可以检测是否爱机场里, 它会给出准确的信息, 而不是检测图片里是不是又飞机…

还有另外三种不同的数据模型:ResNet50、Inception V3 和 VGG16,用于检测照片中的焦点对象,因此它会将背景给忽略掉,并且可以识别大约 1,000 个类别。

每一个模型都有不同数量的类别, 要注意的是模型需要在构建的时候能正确加载, 这可能会消耗很多内存.

开源模型

可以去 Keras, 或者其他模型. Apple 提供了一个C CoreML 模型迁移工具, 大多数机器学习是以 Python 为中心的, 我们可以善于利用这一点, 依靠强大的社区支持. 我们使用 Apple 提供的这个工具, 不需要安装 Python 环境, 基本上只需要: pip install -U coremltools

你可以从其他机器学习工具中获取模型, 然后将其转换为 CoreML 模型, 并将模型保存下来. 在 Apple 的文档中, 已经告诉了哪些格式可以转换, 最受欢迎的是 Keras 和 Caffe

Keras

使用 Keras 来进行自定义模型的制作.
比如, 你想使用 Apple 提供的某个模型, 它能够识别骑车和自行车, 但是不能识别是哪类自行车, 这就需要你将拥有的数据集, 标记这些自行车, 然后创建自己的模型. Keras 由高效的数值计算库支持, 本质上是一个能够创建模型的引擎.

支持 Keras 的常见引擎还包括了TensorFlowTheano, TensorFlow 的文档很丰富全面.

关于 Python

自己网上搜搜把, 推荐 Udacity 的相关课程, 比较简单, 不用经历过多的无聊编程练习.

Python 环境的话, 建议使用虚拟环境 virtualenv 或者直接使用 Anaconda

Keras 模型

(下面是拷贝…我就不解释了,..)

Keras 模型由一组模型层 (layer) 所定义,就像之前对神经网络的大概描述一样。您可以在代码中创建这些模型层。我们这里将要创建一个序列模型,然后逐次添加模型层,直到我们对网络拓扑满意为止。首先我们要做的是确保输入的数字是正确的,因为我们在本次讲演中不会涉及到太多的细节,如果您对此好奇的话,可以查看此教程:使用 Keras 和 Python 构建您的第一个神经网络。

我们将简要地介绍几点步骤,以便您能够完成神经网络的创建。与 iOS 应用代码库相比,这里所涉及的代码部分非常少:

  1. 加载数据。
  2. 使用序列模型层 (sequential layer) 来定义模型。
  3. 比较模型。
  4. 适配模型,这意味着需要运行某些数据来训练模型。
  5. 评估模型——借助训练完的模型来运行一组数据,查看实际输出与预期输出是否匹配。
    万事大吉——只需要用 31 行代码就可以完成神经网络的建立,所以这个步骤是非常平易近人的。一旦您得到了这个自定义模型,那么您就可以使用 Apple 开发的 Core ML 工具包,它将为您生成一个 ML 模型,这样就可以在应用中使用了。

测试与 Instrument

我认为对您的应用进行充分测试是一个明智之举,然后再使用 Instrument 来调试应用。考虑到与应用的其余资源相比,这些模型的占用资源可能会非常大,您应该使用 Instrument 来确保不会引起大量的内存波动 (memory spike) 或者任何可能会对用户体验产生负面影响的因素。在使用机器学习库的时候,这一点是非常重要的,因为机器学习是一个非常新颖的玩意儿,而且通常占用的内存要多得多。

未来

以下是摘录, 其中的资源有兴趣的可以看看~

机器学习的未来

一年以来,我一直在关注这个领域,并且也关注其他的社区,例如 Android 以及开发者社区。我们认为以后会发生什么呢?Apple 将会继续大力推广机器学习,我们已经在 WWDC 2017 中看到这一趋势了并且在过去的几年里,他们聘请了很多机器学习专家,最终新的功能也会纳入到开发者工具以及我们开发的应用当中。看看开发者是如何利用这些新 API,这将会非常有趣,因为这可能会让很多应用极大地改善用户体验,并且为使用机器学习来改善应用这个领域开辟出一条新路。

我希望在机器学习资源方面未来能够有所改善。如果我们正视机器学习领域的话,2009 年麻省理工学院认为这并不是很实用的东西。从那时候起,在这过去的十年以来,机器学习得到了很大的发展,但是如今资源的数量才开始大幅上涨。我不建议大家从线性代数教科书开始看,因为这并不必要,并且还很有可能吓到你。我希望能够有更多适合 iOS 开发者的资源。

我认为这些资源将会来自于 Apple 和社区。Apple 在几个月前宣布将自行制作 GPU,所以我认为这样才真正能给设备所提供的功能带来帮助,包括移动设备、笔记本电脑以及其他 Apple 的产品。我认为他们可能会在设备上添加优化过的机器学习芯片。这一点在其他社区中都有所谈论,我关注了很多频道,大家都认为这种做法是自然而然的,这样做更容易让机器学习不会带来负面的性能效果。

其他资源

Apple’s machine learning documentation
Keras OSS Models
Setting up Anaconda
Neural Networks 101
这将是一个飞速发展的领域,所以如果您有兴趣的话,可以关注一些博客、新闻以及频道,我实际上建立了一个名为 Let’s Infer 的新闻频道。在 WWDC 结束之后,我将会在上面发布新闻,随后我也会建立一个与之相关的频道。

机器学习新闻:

This Week in Machine Learning and AI
Keras Blog
machinethink.net/blog
alexsosn.github.io/ml/2015/11/05/iOS-ML.html
课程:

Udacity’s Intro to Machine Learning:如何使用 Python,完全免费!
Udacity’s Intro to Data Science Nanodegree
Coursera’s Machine Learning at Stanford
我同时也在制作一个使用了机器学习功能的自行车应用,这就是为什么这里我使用了自行车相关的示例。这个应用将帮助用户弄清楚他们想购买什么类型的自行车,因为第一次购买的用户通常并没有详细的词汇来描述他的需求。例如,他需要一个带有固定把和钢框架的固定式齿轮自行车。应用将会给用户提供建议,然后就可以在应用中在线购买。