持续训练CoreML模型的方法

19
在查看新的CoreML API时,我没有发现任何一种方法可以在生成.mlmodel并将其捆绑到应用程序后继续训练模型。这让我想到,我将无法对用户的内容或操作执行机器学习,因为模型必须完全预先训练好。
是否有办法在发布后向已经训练好的模型添加训练数据?
编辑:我刚注意到你可以从URL初始化一个生成的模型类,所以也许我可以将新的训练数据发布到我的服务器,重新生成已训练好的模型并将其下载到应用程序中?似乎会起作用,但这完全违背了能够在不使用户的数据离开设备的情况下使用ML的隐私方面。

1
我昨天向一位Core ML工程师提出了同样的问题。他们基本上说目前不支持从服务器加载它,因为它是与您的应用程序一起编译的。他们暗示可能会根据兴趣在未来支持它。我的担心特别是模型的安全性以及培训是一项昂贵的任务,因此它是一种有价值的资源。我问过关于在编译时包含部分训练或通用模型,并稍后下载更新模型的可能性,他们说这是不可能的。 Matthijs的下面的答案值得一看。 - aasatt
@Patrick关于设备端训练的问题非常值得单独探讨。如果您能提出一个关于服务器端训练的单独问题,那将非常有用,因为答案将涵盖一些不同的技术领域。 - Alex Brown
7个回答

11

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

你的应用程序可能能够从服务器下载新的.mlmodel文件,但我不认为你可以在应用程序内部运行Core ML编译器。

也许你的应用程序可以从服务器下载已编译的.mlmodelc数据,将其复制到应用程序的Documents目录中,并从那里实例化模型。尝试一下吧。;-)

(假设App Store在打包并将应用程序提供给用户之前不对.mlmodelc数据进行任何附加处理。)


1
使用 xcrun coremlcompiler compile /path/to/MyModel.mlmodel /path/to/ 来编译你的模型。 - Alex Brown
如果您希望的话,可以直接将mlmodelc文件侧载到应用程序中。如果这不起作用,请提出另一个相关问题。 - Alex Brown
1
有人确认编译后的模型可以下载并在已经上线的应用程序中使用吗? - Dylan
在用户设备上下载和编译模型 - diegodsp
现在我们可以实时更新了:https://venturebeat.com/2020/06/24/apples-core-ml-now-lets-app-developers-update-ai-models-on-the-fly/ - Zahid Usman Cheema

10

苹果最近为设备上的模型编译添加了一个新API。现在您可以下载您的模型并在设备上进行编译。


假设我已经在应用程序中训练了我的模型。现在用户拍摄更多照片并将其添加到现有模型中。现有模型将与新图像进行更新(合并)。是否真的可以在用户使用应用程序时通过编程方式训练现有模型? - Jamshed Alam

3

2
为了动态更新模型(而不是更新整个应用程序),您需要直接使用MPS(Metal Performance Shader)而不是依赖于必须捆绑在应用程序中的.mlmodel。这意味着您需要通过编写一些Swift代码(而不是使用coremltools直接转换现有模型)手动构建神经网络,并为每个层提供各种权重,这需要一些工作,但并不是特别难。如果您想了解更多关于MPS的信息,可以观看此视频:https://developer.apple.com/videos/play/wwdc2017/608/

非常感谢。我在想是否有一种使用较低级别框架的方法来实现它。 - Patrick Goley

2

现在使用iOS11 beta4,您可以编译模型并从服务器下载。

(详情)


这个链接也可能会对你有帮助,我认为。https://developer.apple.com/documentation/coreml/core_ml_api/downloading_and_compiling_a_model_on_the_user_s_device - michaelxing

2

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


您可以通过从服务器替换模型来更新它,但这需要另一个问题来解决。


1
BNNS支持实现和操作用于推断的神经网络,使用先前从培训中导出的输入数据。但是,BNNS不进行培训。它的目的是在已经训练好的神经网络上提供非常高的性能推断。 - John Difool

1
作为将mlmodel与应用程序捆绑在一起的替代方法,您可以在CoreML应用程序中下载并编译模型。为此,您只需要使用例如URLSession模型定义文件下载到用户设备上。然后,您需要通过调用抛出异常的compileModel(at:)类型方法来编译模型定义
let newCompiledModel = try MLModel.compileModel(at: modelDescriptionURL)

您将得到一个新的编译模型文件,与模型描述的名称相同,但其结尾将是mlmodelc。最终,通过将编译后的模型URL传递给其初始化程序来创建一个新的MLModel实例。
let model = try MLModel(contentsOf: newCompiledModel)

然而,需要记住编译过程可能会耗费时间,并且不应该在主线程上执行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接