出货后持续训练 CoreML 模型

Posted

技术标签:

【中文标题】出货后持续训练 CoreML 模型【英文标题】:Continuously train CoreML model after shipping 【发布时间】:2017-11-11 14:41:45 【问题描述】:

在查看新的 CoreML API 时,我看不出有任何方法可以在生成 .mlmodel 并将其绑定到您的应用程序后继续训练模型。这让我认为我将无法对用户的内容或动作执行机器学习,因为必须事先对模型进行完全训练。

有什么方法可以在发货后将训练数据添加到我的训练模型中?

编辑:我刚刚注意到您可以从 URL 初始化生成的模型类,所以也许我可以将新的训练数据发布到我的服务器,重新生成经过训练的模型并将其下载到应用程序中?似乎它会起作用,但这完全破坏了能够在用户数据离开设备的情况下使用 ML 的隐私方面。

【问题讨论】:

我昨天向 Core ML 工程师提出了同样的问题。他们基本上说他们目前不支持从服务器加载它,因为它与您的应用程序一起编译。他们确实暗示可能会根据兴趣在未来支持它。我特别关注模型的安全性以及培训是一项昂贵的任务,因此它是一种宝贵的资源。我询问是否在编译时包含部分训练或通用模型并稍后下载更新的模型,他们说这是不可能的。以下 Matthijs 的回答值得研究。 @Patrick 关于设备上培训的原始问题本身就是一个很好的问题。如果您可以针对服务器端培训提出单独的问题,这将很有用,因为答案将涵盖一些不同的技术领域。 【参考方案1】:

.mlmodel 文件由 Xcode 编译成 .mlmodelc 结构(实际上是您的应用程序包中的一个文件夹)。

您的应用可能能够从服务器下载新的 .mlmodel,但我认为您不能从应用内部运行 Core ML 编译器。

也许您的应用可以从服务器下载已编译的 .mlmodelc 数据,将其复制到应用的 Documents 目录中,然后从中实例化模型。试试看。 ;-)

(假设 App Store 在打包您的应用并将其发送给用户之前不会对 .mlmodelc 数据进行任何额外处理。)

【讨论】:

使用xcrun coremlcompiler compile /path/to/MyModel.mlmodel /path/to/ 编译你的模型 如果您愿意,您可以将 mlmodelc 文件直接加载到应用程序中。如果这不起作用,请提出另一个问题。 有没有人确认编译好的模型可以在已经上线的应用上下载和使用? developer.apple.com/documentation/coreml/core_ml_api/… 在用户设备上下载和编译模型 我们现在可以即时更新:venturebeat.com/2020/06/24/…【参考方案2】:

Core ML 支持推理,但不支持在设备上进行训练。


您可以通过将模型替换为来自服务器的新模型来更新模型,但这值得自己提出问题。

【讨论】:

没有。 BNNS 支持使用先前从训练中获得的输入数据来实现和操作用于推理的神经网络。然而,BNNS 不进行训练。它的目的是在已经训练好的神经网络上提供非常高性能的推理。【参考方案3】:

为了动态更新模型(不更新整个应用程序),您需要直接使用 MPS(Metal Performance Shader)而不是依赖 .mlmodel,它必须与应用程序捆绑在一起。

这意味着您需要通过编写一些 Swift 代码来手动构建神经网络(而不是使用 coremltools 直接转换现有模型),并为每一层提供各种权重,这有点工作,但不是火箭科学。

如果您想了解有关 MPS 的更多信息,可以观看此视频。

https://developer.apple.com/videos/play/wwdc2017/608/

【讨论】:

非常感谢。我想知道是否有办法使用较低级别的框架来做到这一点【参考方案4】:

Apple 最近添加了new API 用于设备上的模型编译。现在你可以下载你的模型并在设备上编译它了

【讨论】:

假设我已经训练了我在 app 中给出的模型。现在用户拍摄更多照片并将其添加到现有模型中。现有模型将使用新图像更新(合并)。当用户使用应用程序时,是否真的可以在应用程序上以编程方式训练现有模型?【参考方案5】:

现在有了ios11 beta4,你可以编译模型,从服务器下载。

(Details)

【讨论】:

这个链接也可以帮助你,我想。 developer.apple.com/documentation/coreml/core_ml_api/…【参考方案6】:

CoreML 3 现在支持设备上的模型个性化。您可以为每个用户改进模型,同时保持其数据的私密性。

https://developer.apple.com/machine-learning/core-ml/

【讨论】:

【参考方案7】:

作为将 mlmodel 与应用程序捆绑在一起的替代方法,您可以在 CoreML 应用程序中下载并编译模型。为此,您只需使用例如 URLSessionmodel definition 文件下载到用户的设备上。在此之后,您必须通过调用抛出 compileModel(at:) 类型的方法来编译 model definition

let newCompiledModel = try MLModel.compileModel(at: modelDescriptionURL)

您将获得一个与模型描述同名的新编译模型文件,但其结尾将是mlmodelc。最后,通过将编译后的模型 URL 传递给它的初始化程序来创建一个新的 MLModel 实例。

let model = try MLModel(contentsOf: newCompiledModel)

但是,请记住,编译过程可能很耗时,不应该在主线程上完成。

【讨论】:

以上是关于出货后持续训练 CoreML 模型的主要内容,如果未能解决你的问题,请参考以下文章

继续训练 CoreML 模型

使用表格数据进行 CoreML 设备上模型训练

将预训练的 CoreML 模型拆分为两部分

将训练好的 Keras 图像分类模型转换为 coreml 并集成到 iOS11

从 TensorFlow 转换的 CoreML 模型无法在 Xcode 中使用

如何创建和训练用于 Core ML 的神经模型 [关闭]