在查看新的 CoreML API 时,我看不到在生成 .mlmodel 并将其捆绑到您的应用程序后继续训练模型的任何方法。这让我认为我将无法对用户的内容或动作执行机器学习,因为必须事先对模型进行完全训练。
发货后有什么方法可以将训练数据添加到我的训练模型中?
编辑:我刚刚注意到您可以从 URL 初始化生成的模型类,所以也许我可以将新的训练数据发布到我的服务器,重新生成经过训练的模型并将其下载到应用程序中?似乎它会起作用,但这完全破坏了能够在用户数据不离开设备的情况下使用 ML 的隐私方面。
在查看新的 CoreML API 时,我看不到在生成 .mlmodel 并将其捆绑到您的应用程序后继续训练模型的任何方法。这让我认为我将无法对用户的内容或动作执行机器学习,因为必须事先对模型进行完全训练。
发货后有什么方法可以将训练数据添加到我的训练模型中?
编辑:我刚刚注意到您可以从 URL 初始化生成的模型类,所以也许我可以将新的训练数据发布到我的服务器,重新生成经过训练的模型并将其下载到应用程序中?似乎它会起作用,但这完全破坏了能够在用户数据不离开设备的情况下使用 ML 的隐私方面。
.mlmodel 文件由 Xcode 编译成 .mlmodelc 结构(实际上是您的应用程序包中的一个文件夹)。
您的应用程序可能能够从服务器下载新的 .mlmodel,但我认为您不能从应用程序内部运行 Core ML 编译器。
也许您的应用程序可以从服务器下载已编译的 .mlmodelc 数据,将其复制到应用程序的 Documents 目录中,然后从中实例化模型。试试看。;-)
(这假设 App Store 在打包您的应用并将其发送给用户之前不会对 .mlmodelc 数据进行任何额外处理。)
Apple 最近为设备上的模型编译添加了一个新的 API。现在你可以下载你的模型并在设备上编译它
CoreML 3 现在支持设备上模型个性化。您可以改进每个用户的模型,同时保持其数据的私密性。
Core ML 支持推理,但不支持在设备上进行训练。
您可以通过将模型替换为来自服务器的新模型来更新模型,但这值得提出自己的问题。
为了动态更新模型(不更新整个应用程序),您需要直接使用 MPS(Metal Performance Shader)而不是依赖 .mlmodel,它必须与应用程序捆绑在一起。
这意味着您需要通过编写一些 Swift 代码来手动构建神经网络(而不是使用 coremltools 直接转换现有模型),并为每一层提供各种权重,这有点工作,但不是火箭科学。
如果您想了解更多关于 MPS 的信息,这是一个很好的视频。
现在有了iOS11 beta4,你可以编译模型,从服务器下载。
(详情)
作为捆绑mlmodel
应用程序的替代方法,您可以在 CoreML 应用程序中下载并编译模型。为此,您只需model definition
使用例如URLSession将文件下载到用户的设备上。model definition
在此之后,您必须通过调用抛出compileModel(at:)
类型方法来编译。
let newCompiledModel = try MLModel.compileModel(at: modelDescriptionURL)
您将获得一个新的编译模型文件,其名称与模型描述相同,但其结尾为mlmodelc
. 最后,通过将编译后的模型 URL 传递给它的初始化程序来创建一个新的 MLModel 实例。
let model = try MLModel(contentsOf: newCompiledModel)
但是,请记住编译过程可能很耗时,并且不应该在主线程上完成。