【问题标题】:CoreML – How to create a simple MLFeatureProvider classCoreML – 如何创建一个简单的 MLFeatureProvider 类
【发布时间】:2019-06-22 20:13:52
【问题描述】:

我有一个MLModel,其中包含一个名为length 的输入列和一个名为depth 的输出列。

你给它一个长度,它会预测一个深度。

我知道还有其他方法可以做到这一点,但这完全是为了学习 CoreML。

我需要构建一个MLFeatureProvider 类来获取该长度并输出一个深度。

我不确定如何创建该类,因为这是我第一次处理 CoreML,而且像往常一样,Apple 并不关心创建体面的文档。

这就是我所拥有的

class FeatureProviderX: MLFeatureProvider {
  var featureNames: Set<String> {
    get {
      return  ["length", "depth"]
    }
  }

  func featureValue(for featureName: String) -> MLFeatureValue? {
    guard featureName == "length" else {
      return MLFeatureValue(????????????) \\1
    }
  }

}

我不确定这个类是否远程正确。

如果正确,\\1应该怎么写?

【问题讨论】:

  • 我不同意文档不合适(尽管有一些完全不存在的罕见情况)(有书面文档、示例项目和相当数量的WWDC 会议形式的有关 CoreML 的深入信息)。话虽如此,你可以看看MLDictionaryFeatureProvider,它是一个字典的便利包装器,它将所有键映射到它们各自的值(如MLFeatureValues)。
  • 很抱歉不同意,但每个 doc apple 都会写 stink infinity squared plus infinity。我在那些喜欢编写文档的人所写的老式手册和书籍上学习了编程。 Apple 所写的所有内容都明显是轻蔑、含糊、缺乏对开发者的尊重。对于客户来说,他们是一家相对不错的公司,但对开发人员来说却不是。关于 Apple x Developers 有句老话,我发现它是正确的:“Apple 不是你的朋友”。

标签: swift macos coreml coremltools


【解决方案1】:

类似这样的:

class FeatureProviderX: MLFeatureProvider {
  let length: Double

  init(length: Double) {
    self.length = length
  }

  func featureValue(for featureName: String) -> MLFeatureValue? {
    guard featureName == "length" else {
      return MLFeatureValue(double: length)
    }
  }

  ...

要使用它进行预测,请创建 FeatureProviderX 的新实例并将其传递给您的 MLModel 类。

【讨论】:

  • 不适合我。我告诉我该类缺少初始化程序。当我要求 Xcode 修复它时,它会在开头添加一行 var featureNames: Set&lt;String&gt;。然后它在初始化时失败并显示消息return from initializer without initializing all stored properties。它在func featureValue 上也失败了......我想它需要在警卫之后返回零。无论如何,它不起作用。
  • 我曾希望我的回答显然不是一个完整的解决方案,只是一种为您指明正确方向的方法。无论如何,我忘了提到最简单的解决方案是创建一个MLDictionaryFeatureProvider 实例:let provider = MLDictionaryFeatureProvider(dictionary: ["length": 1234])
【解决方案2】:

Matthijs Hollemans 走在了正确的轨道上,并为我提供了如何解决该问题的线索,但不幸的是,他的解决方案缺少很多东西。

一段时间后,我找到了正确的解决方案......

class FeatureProviderX: MLFeatureProvider {

  var featureNames: Set<String> {
    get {
      return  ["length"]
    }
  }

  var sorteio: Double

  init(length: Double) {
    self.length = length
  }

  func featureValue(for featureName: String) -> MLFeatureValue? {
    if featureName == "length" {
      return MLFeatureValue(double: length)
    }
    return nil
  }
}

【讨论】:

    猜你喜欢
    • 2021-07-13
    • 2013-03-28
    • 2012-03-04
    • 2013-03-28
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多