【问题标题】:CoreML how to Normalize input arrayCoreML如何规范化输入数组
【发布时间】:2019-07-03 13:15:00
【问题描述】:

我尝试将 sklearn normalizer 转换为 coreml 模型,如下所示:

normalized = sklearn.preprocessing.Normalizer()

coreml_model = coremltools.converters.sklearn.convert(normalized)

但我收到此错误:

“错误处理特征列表:如果给出单个特征名称,则必须提供num_dimensions”

如何设置“num_dimensions”?

另一种选择是直接使用 CoreML 中的 Normalizer:

https://apple.github.io/coremltools/coremlspecification/sections/FeatureEngineering.html#normalizer

但是我如何在 IOS 中使用此功能的文档为零。例如,如何在浮点数组上运行它?

【问题讨论】:

    标签: ios scikit-learn coreml coremltools


    【解决方案1】:

    要在 Core ML 中创建规范化器,您需要构建一个管道模型。管道只是一系列 Core ML 模型,捆绑为一个新的 Core ML 模型。

    管道中的第一个模型是Normalizer 模型。第二个是你的常规模型。归一化模型的输出然后成为常规模型的输入。

    您可以手动完成此操作(请参阅我的书,我的个人资料中的链接),但实际上,让 scikit-learn 转换器处理此操作是最简单的,因为这就是它的用途。

    num_dimensions 错误的发生是因为仅转换 sklearn Normalizer 不会为 coremltools 转换器提供足够的信息来处理。如果你想在 scikit-learn 中进行标准化,看起来你还需要在 scikit-learn 中创建一个管道模型并将其转换。

    【讨论】:

    • 谢谢我已经有书了!好东西。管道看起来不错但仍然没有回答我如何使用 corelmltools 转换规范化输入的问题。我不清楚你的意思是“看起来你还需要在 scikit-learn 中创建一个管道模型并转换它”?另一方面,由于coremltools支持scikit规范化,我不认为我是唯一遇到这个问题的人。没有任何官方示例/解决方案吗?
    • sklearn 的 Normalize 通常与其他东西(例如 SVM 或随机森林或其他东西)结合到管道中,以便您可以将所有这些不同的东西作为单个模型运行。 only Normalize 并没有多大意义。
    • 我使用 Keras TF 进行了训练。我仅将 SKLearn 用于标准化和缩放。在这种情况下,根据您的说法,这些应该是我使用 tf 组件而不是 SKLearn 的 keras 模型的一部分。对吗?
    • 确实如此。我认为 coremltools sklearn 转换器不适合您的用例。
    【解决方案2】:

    您可以像这样指定输入尺寸:

    coreml_model = coremltools.converters.sklearn.convert(normalized, input_features={'input': [0, 1, 2]})
    

    这里input 是输入功能名称(默认为input),列表([0, 1, 2])是输入功能ID(为简单起见,您可以只使用range(num_features),或者只列出像我一样明确地索引值)。

    【讨论】:

      猜你喜欢
      • 2023-01-25
      • 2020-07-05
      • 2015-06-05
      • 2017-12-10
      • 2019-09-19
      • 2017-07-16
      • 1970-01-01
      • 2019-08-19
      • 2018-04-23
      相关资源
      最近更新 更多