Core ML是Apple的机器学习框架。仅在一年前发布,Core ML为开发人员提供了一种方法,只需几行代码即可将强大的智能机器学习功能集成到他们的应用程序中!今年,在2018年WWDC上,Apple发布了Core ML 2.0-下一版Core ML,所有这些都集中在通过优化模型的大小,提高性能以及让开发人员定制自己的Core ML模型来简化流程。
在本教程中,我将了解Core ML 2.0中引入的所有新功能以及如何将其应用到您的机器学习应用程序中!如果您是Core ML的新手,我建议您通过本教程熟悉Core ML 。如果你熟悉它,让我们开始吧!
注意:要尝试这些技术,您需要在Mac上安装macOS Mojave。此外,您应该安装coremltools beta。如果没有,不要担心。我将在本教程后面解释如何下载它。
快速回顾
App Store中有许多优秀的应用程序,能够执行强大的任务。例如,您可以找到一个理解文本的应用程序。或者也许是一个应用程序,它会根据您设备的运动知道您正在做什么锻炼。更进一步,有些应用程序根据之前的图像对图像应用过滤器。这些应用程序有一个共同点:它们都是机器学习的例子,所有这些都可以使用Core ML模型创建。
资料来源:Apple
Core ML使开发人员可以轻松地将机器学习模型集成到他们的应用程序中。您可以创建一个能够理解对话中的上下文或可以识别不同音频的应用。此外,Apple使开发人员能够通过他们的两个框架:视觉和自然语言,采用实时图像分析和自然语言理解的额外步骤。
使用VNCoreMLRequest
API和NLModel
API,您可以大大增加应用程序的ML功能,因为Vision和Natural Language是基于Core ML构建的!
今年,Apple专注于帮助Core ML开发者提供3个要点。
- 型号尺寸
- 模型的表现
- 自定义模型
让我们探讨这三点!
型号尺寸
Core ML的一个巨大优势是一切都在设备上完成。这样,用户的隐私始终是安全的,并且可以从任何地方计算计算。但是,随着使用更精确的机器学习模型,它们可以具有更大的尺寸。将这些模型导入您的应用可能会占用用户设备上的大量空间。
Apple决定为开发人员提供量化 Core ML模型的工具。量化模型是指用于以更紧凑的形式存储和计算数字的技术。在任何机器学习模型的核心根源,它只是一台试图计算数字的机器。如果我们要减少数量或将它们存储在一个占用更少空间的形式中,我们可以大幅减小模型的大小。这可以减少运行时内存使用量并加快计算速度!
机器学习模型有3个主要部分:
- 模型数量
- 权重的数量
- 权重的大小
当我们量化模型时,我们正在减小 权重 的 大小!在iOS 11中,Core ML模型存储在32位模型中。借助iOS 12,Apple让我们能够将模型存储在16位甚至8位模型中!这是我们将在本教程中看到的内容!
如果你不熟悉什么是权重,这里有一个非常好的类比。说你要从你家到超市。第一次,你可能走一条路。第二次,您将尝试找到一条通往超市的较短路径,因为您已经了解了进入市场的方式。第三次,您将采用更短的路线,因为您已了解前两条路径。每次去市场的时候,你会继续服用一个较短的路径,你学习一段时间!知道哪条路线的知识称为权重。因此,最准确的路径是权重最大的路径!
让我们付诸实践。一些代码的时间!
权重量化
举个例子,让我们使用一个名为Inception v3的流行机器学习模型进行演示。您可以在此处下载Core ML格式的模型。
打开这个模型,你可以看到它占用了94.7 MB的相当大的空间。
我们将使用 Python 包 coremltools
量化这个模型。我们来看看怎么样!
如果您的设备上没有python
或没有pip
安装,您可以在此处了解安装步骤。
首先,您需要确保安装测试版coremltools
。打开终端并输入以下内容:
pip install coremltools==2.0b1
你应该看到这样的输出。
此命令成功安装了Core ML Tools beta 1的测试版。接下来的几个步骤需要一些Python。不用担心,它非常简单,不需要太多代码!打开您选择的Python编辑器或在终端中跟随。首先,让我们导入coremltools
包。键入python
终端,然后在编辑器出现后键入以下内容:
import coremltools
from coremltools.models.neural_network.quantization_utils import *
这将导入Core ML工具包以及所有量化实用程序。接下来,让我们定义一个变量model
并将其URL设置为Inceptionv3.mlmodel
刚下载的。
model = coremltools.models.MLModel('/PATH/TO/Inceptionv3.mlmodel')
在我们量化模型之前(它只需要2行!),让我给你一些神经网络的背景信息。
神经网络由不同的层组成。这些图层只是具有许多参数的数学函数。这些参数称为权重。
资料来源:走向数据科学
当我们量化权重时,我们采用权重的最小值和权重的最大值并映射它们。有许多方法可以映射它们,但最常用的方法是线性和查找。线性量化是指均匀映射权重并减少它们。在查找表量化中,模型构造表格并基于相似性对权重进行分组并减少它们。
如果这听起来很复杂,请不要担心。我们需要做的就是选择我们希望我们的模型表示的位数和要选择的算法。首先,让我们看看如果我们选择线性量化模型会发生什么。
lin_quant_model = quantize_weights(model, 16, "linear")
在上面的代码中,我们将Inceptionv3模型的权重量化为16位并使用线性量化。运行代码应该为您提供程序量化的每个层的长列表。
让我们保存模型,看看它与原始模型的比较。选择保存位置的路径并键入以下内容。
lin_quant_model.save('Path/To/Save/QuantizedInceptionv3.mlmodel')
现在打开两个模型并比较尺寸。
当我们以16位格式表示Inceptionv3模型时,它占用的空间更少!
但是,重要的是要记住权重量化的真正含义。早些时候,在我的比喻中,我说更多的权重会产生更多的准确性。当我们量化模型时,我们也会降低模型的精度和尺寸。量化是一种准确性权衡。量化模型是权重大小的近似值,因此运行量化模型并了解它们的运行方式始终非常重要。
理想情况下,我们希望量化我们的模型,同时保持最高的准确度。这可以通过找到正确的量化算法来完成。在前面的例子中,我们使用了线性量化。现在让我们尝试使用Lookup Quantization,看看会发生什么。就像之前一样,在终端中键入以下内容:
lut_quant_model = quantize_weights(model, 16, "kmeans")
当模型完成量化时,我们需要通过运行一些样本数据来比较我们lin_quant_model
和我们lut_quant_model
的原始模型。这样,我们可以找出哪个量化模型与原始模型最相似。在此处下载示例图像文件夹。键入以下行,我们可以看到哪个模型表现更好!
compare_models(model, lin_quant_model, '/Users/SaiKambampati/Desktop/SampleImages')
这可能需要一段时间,但在两个模型完成处理后,您将收到如下所示的输出:
我们对前1协议感兴趣。它显示100%,这意味着它与我们的模型匹配100%!这对我们来说非常好,因为我们现在有一个量子化的模型,它占用的空间更少,并且与我们的原始模型具有大致相同的精度!如果我们想要的话,我们现在可以将它导入到项目中,但我们也可以比较Lookup Table Quantized模型!
compare_models(model, lut_quant_model, '/Users/SaiKambampati/Desktop/SampleImages')
我们也收到100%的输出,因此两种型号都兼容!我鼓励你玩量化不同的模型。在上面的例子中,我们将Inceptionv3
模型量化为16位模型。看看你是否可以继续将模型量化为8位表示甚至是4位表示,并将其与样本数据进行比较!它是如何表现的?
上图描绘了当我Inceptionv3
使用线性算法将模型量化为1位表示时发生的情况!如您所见,模型尺寸急剧减小,但精度也是如此!实际上,它的准确度为0%是完全不准确的。通过量化来尝试找到快乐的媒介。永远记得测试量化模型,以确保它们准确执行!
性能
苹果专注于核心ML 2的下一点是性能。由于我们在设备上运行ML计算,我们希望它快速准确。这可能非常复杂。幸运的是,Apple为我们提供了一种提高CoreML模型性能的方法。让我们来看一个例子。
Style Transfer是一种机器学习应用程序,它基本上将某个图像转换为另一个图像的样式。如果您之前使用的是Prisma应用程序,则可以使用Style Transfer。
如果我们要研究样式转移的神经网络,我们会注意到这一点。该算法有一组输入。神经网络中的每个层都为原始图像添加了一定的变换。这意味着模型必须接收每个输入并将其映射到输出并从中进行预测。然后,预测有助于创建权重。这会在代码中看起来像什么?
// Loop over inputs
for i in 0..< modelInputs.count {
modelOutputs[i] = model.prediction(from: modelInputs[i], options: options)
}
在上面的代码中,您会看到对于每个输入,我们要求模型生成预测并根据某些输出生成输出options
。但是,迭代每个输入可能需要很长时间。
为了解决这个问题,Apple推出了全新的Batch API!与for循环不同,机器学习中的批处理是将所有输入馈送到模型并且其结果是准确的预测!这可以花费更少的时间,更重要的是,更少的代码!
以下是使用新Batch Predict API编写的上述for循环代码!
modelOutputs = model.prediction(from: modelInputs, options: options)
就这样!只需一行代码即可!你可能想知道,“等等!我之前从未这样做过?这听起来很复杂。我在哪里使用它?“这使我最后一点是定制。
定制
当你打开神经网络的引擎盖时,你会发现它们由许多层组成。但是,当您尝试将神经网络从Tensorflow转换为Core ML时,可能会出现一些情况。或者也许是从Keras到Core ML的管道。但是,可能偶尔有一个例子,其中Core ML根本没有正确转换模型的工具!这是什么意思?让我们再看一个例子。
使用卷积神经网络(CNN)构建图像识别模型。CNN由一系列高度优化的层组成。当您将神经网络从一种格式转换为Core ML时,您正在转换每一层。但是,可能有一些罕见的情况,Core ML根本不提供转换图层的工具。在过去,你无法做任何事情但是在iOS 12中,Apple工程师已经引入了MLCustonLayer
允许开发人员在Swift中创建自己的图层的协议。使用MLCustomLayer
,您可以在Core ML模型中定义自己的神经网络层的行为。但是,值得注意的是,自定义图层仅适用于神经网络模型。
现在,如果这听起来很复杂,请不要担心。通常需要熟练的数据科学家或机器学习工程师来理解神经网络的所有复杂性,并具有编写自己的模型的才能。这超出了本教程的范围,因此我们不会深入研究这一点。
结论
这总结了Core ML 2.0中的所有新变化。Core ML 2.0旨在使模型更小,更快,更可定制。我们看到了如何通过权重量化来减小Core ML模型的大小,通过新的Batch API提高模型的性能,以及我们可能需要为模型编写自定义层的示例。作为开发人员,我预测(看看我在那里做了什么)你将比其他两种技术(Batch API和Custom Layers)更多地使用权重量化。
如果您有兴趣更多地探索Core ML 2.0,这里有一些很好的资源可供查看!
- Core ML的新功能,第1部分 - WWDC 2018
- Core ML的新功能,第2部分 - WWDC 2018
- 核心ML的愿景 - WWDC 2018
- 介绍自然语言框架 - WWDC 2018
- 核心ML文档
- Apple的机器学习页面
原文:https://www.appcoda.com/coreml2/
作者: