转自:https://www.raywenderlich.com/181760/beginning-machine-learning-keras-core-ml?utm_source=raywenderlich.comWeekly
苹果公司的Core ML和Vision框架已经将开发者带入了一个机器学习的崭新世界,带来了激动人心的可能性。Vision可以检测和跟踪人脸,Apple的机器学习页面提供了可以检测物体和场景以及NSLinguisticTagger自然语言处理的即用模型。如果你想建立你自己的模型,试试苹果新的Turi Create来扩展一个预先训练好的模型和你的数据。
但是,如果你想做什么需要更多的定制?那么,现在是使用Google,Microsoft,Amazon或Berkeley的众多框架之一进入机器学习(ML)的时候了。而且,为了让生活更加激动人心,你需要选择一种新的编程语言和一套新的开发工具。
在这个Keras机器学习教程中,您将学习如何训练深度学习卷积神经网络模型,将其转换为Core ML,并将其集成到iOS应用程序中。您将学习一些ML术语,使用一些新的工具,并且一路拾取一些Python。
该示例项目使用ML的Hello-World示例 : 一种对MNIST数据集上的手写数字进行分类的模型。
让我们开始吧!
为什么要使用Keras?
ML模型涉及许多复杂的代码,操纵数组和矩阵。但ML已经存在了很长一段时间,研究人员创建了图书馆,使得像我们这样的人创建ML模型变得更容易。其中很多是用Python编写的,尽管研究人员也使用R,SAS,MATLAB和其他软件。但是您可能会在基于Python的工具中找到所需的一切:
scikit-learn提供了一个简单的方法来运行许多经典的ML算法,如线性回归和支持向量机。我们开始的机器学习与scikit学习教程(即将推出!)显示你如何训练这些。
另一方面是PyTorch和Google的TensorFlow,它们可以更好地控制深度学习模式的内部运作。
微软的CNTK和Berkeley的Caffe是类似的深度学习框架,它们有Python API来访问他们的C ++引擎。
那么Keras在哪里?这是TensorFlow和CNTK的封装,亚马逊的MXNet即将推出。(它也与Theano合作,但是2017年9月,蒙特利尔大学停止了这个工作。)它提供了一个易于使用的API来构建模型,您可以在一个后端上进行训练,并部署到另一个后端上。
使用Keras而不是直接使用TensorFlow的另一个原因是,coremltools包括一个Keras转换器,而不是一个TensorFlow转换器 - 虽然存在一个TensorFlow到CoreML转换器和一个MXNet到CoreML转换器。虽然Keras支持CNTK作为后端,但coremltools只适用于Keras + TensorFlow。
注意:在使用这些工具之前,您是否需要学习Python?那么,我没有;当你完成本教程的时候,你会发现Python的语法与Swift类似:更简洁一点,缩进是语法的一个重要部分。如果您感到紧张,请在浏览器选项卡中将其打开,以供快速参考:Jason Brownlee 针对机器学习开发人员的Python碰撞课程。
另一个注意:研究人员同时使用Python 2和Python 3,但coremltools在Python 2.7中效果更好。
入门
下载并解压缩启动器文件夹:它包含一个启动器iOS应用程序,您将在其中添加ML模型和代码来使用它。它还包含一个docker-keras文件夹,其中包含本教程的Jupyter笔记本。
设置Docker
Docker是一个容器平台,可以让你在自定义的环境中部署应用 - 有点像虚拟机,但不同。通过安装Docker,您可以访问大量的ML资源,主要分布在Docker镜像中的交互式Jupyter笔记本中。
注意:安装Docker并构建映像将需要几分钟的时间,所以在等待的时候,请在一个Nutshell部分阅读ML。
下载,安装并启动Docker Community Edition for Mac。在终端中,一次输入以下命令:
cd < 你解压缩启动器的位置> / starter / docker-keras
docker build -t keras-mnist
docker run --rm -it -p 8888:8888 -v $(pwd)/notebook:/workspace/notebook keras-mnist
这最后一个命令将Docker容器的笔记本文件夹映射到本地笔记本文件夹,即使在注销Docker服务器之后,您也可以访问笔记本写入的文件。
在命令的最后,输出是一个包含令牌的URL。它看起来像这样,但具有不同的标记值:http://0.0.0.0:8888/?token=7b189c8e200f49dcc33845d39101e8a0ab257db5f3b539a7
将此URL粘贴到浏览器中以登录到Docker容器的笔记本服务器。
打开笔记本文件夹,然后打开keras_mnist.ipynb。点击“ Not Trusted”按钮将其更改为“ Trusted”:这可让您保存笔记本文件夹以及模型文件所做的更改。
ML in a Nutshell
亚瑟·塞缪尔(Arthur Samuel)将机器学习定义为“使计算机没有明确程序地学习的能力的学习领域”。你有数据,有一些功能可以用来对数据进行分类,或者用它来做一些预测,但是你没有一个明确的公式来计算这个数据,所以你不能编写一个程序去做。如果你有足够的数据样本,你可以训练一个计算机模型来识别这个数据中的模式,然后把它的学习应用到新的数据上。当你知道所有训练数据的正确结果时,这就是所谓的监督式学习:那么模型只是根据已知的结果检查其预测结果,并调整自身以减少错误并提高准确性。无监督学习超出了本教程的范围。
权重和阈值
假设你想和一群朋友一起选择一家餐厅吃饭。有几个因素影响您的决定:饮食限制,公共交通,价格范围,食物类型,儿童友好等。您为每个因素分配一个权重,以表明其对您的决定的重要性。然后,对于选项列表中的每个餐馆,根据餐厅满足该因素的程度,为每个因素分配一个值。您将每个因子值乘以因子的权重,然后将它们相加得到加权总和。最好的餐厅是最好的选择。另一种使用这种模式的方法是产生二进制输出:是或否。您设置了一个阈值,并从您的列表中删除加权总和低于此阈值的餐厅。
培训ML模型
提出权重是不是一件容易的工作。但幸运的是,你有很多来自以前的晚餐的数据,包括选择哪家餐厅,所以你可以训练一个ML模型来计算权重,尽可能地产生相同的结果。然后,将这些计算的权重应用于未来的决策。
为了训练ML模型,您从随机权重开始,将其应用于训练数据,然后将计算输出与已知输出进行比较以计算误差。这是一个具有最小值的多维函数,训练的目标是确定非常接近这个最小值的权重。权重还需要处理新的数据:如果大量验证数据上的错误高于训练数据上的错误,则模型过度配置 - 权重在训练数据上工作得太好,表明训练错误检测到一些不会推广到新数据的功能。
随机梯度下降
要计算减少误差的权重,可以计算当前图形位置的误差函数的梯度,然后调整权重以“降低”斜率。这被称为渐变下降,并在训练过程中发生多次。对于大型数据集,使用所有数据计算梯度需要很长时间。随机梯度下降(SGD)从随机选择的小批量训练数据中估计梯度- 例如在选举日之前对选民进行调查:如果您的样本代表整个数据集,则调查结果准确预测最终结果。
优化器
错误函数是块状的:你必须小心不要过分,否则你可能会错过最小值。你的步伐率也需要有足够的动力来推动你走出任何虚假的最低限度。ML研究人员花费了大量的精力来设计优化算法来做到这一点。目前最受欢迎的是Adam(自适应矩估计),它结合了先前最喜欢的RMSprop(均方根传播)和AdaGrad(自适应梯度算法)的特性。
Keras代码时间!
好了,Docker容器应该现在就准备好了:回去按照说明打开笔记本。现在是时候写一些Keras代码!
在keras_mnist.ipynb单元格中输入以下代码,并使用匹配的标题。当您完成在每个单元格中输入代码时,按下Control-Enter运行它。代码正在运行时,In []:标签中会出现一个星号,然后会出现一个数字,以显示您运行单元的顺序。登录到笔记本时,所有内容都保留在内存中。每隔一段时间,点击保存和检查点按钮。
注意:双击减价单元格以添加您自己的评论; 按下Control-Enter来渲染降价并运行你的Python代码。您还可以使用其他笔记本按钮添加或复制粘贴单元格,并移动单元格。
导入实用程序和依赖项
输入下面的代码,并运行它来检查Keras版本。
from __future__ import print_function
from matplotlib import pyplot as plt
import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras.utils import np_utils
from keras import backend as K
import coremltools
# coremltools supports Keras version 2.0.6
print('keras version ', keras.__version__)
__future__ 是Python 2和Python 3之间的兼容层:Python 2有一个print 命令(不包括圆括号),但是Python 3需要一个print()函数。导入print_function允许您在Python 2代码中使用print()语句。
Keras使用NumPy数学库来操作数组和矩阵。Matplotlib是NumPy的绘图库:您将使用它来检查训练数据项。
注意:您可能会看到FutureWarningNumPy 1.14。