【问题标题】:How to apply Sigmoid on MLMultiarray elements?如何在 MLMultiarray 元素上应用 Sigmoid?
【发布时间】:2021-01-27 16:34:59
【问题描述】:

对于 python 中的火炬张量,我可以使用
y = x[i].sigmoid()

如何在 Swift 中使用 MLMultiArray 复制它?
我可以通过VNCoreMLFeatureValueObservation.featureValue.multiArrayValue 获取数组
现在我想在这个上应用 sigmoid

我使用的 sigmoid 函数是:

func sigmoid(z: Double) -> Double {
        return 1.0 / (1.0 + exp(-z))
    }

【问题讨论】:

    标签: ios swift computer-vision coreml


    【解决方案1】:

    这是从内存中输入的,所以可能会有错误,但基本上你抓住一个指向内存的指针然后循环遍历它:

    let ptr = multiArray.dataPointer.assumingMemoryBound(to: Double.self)
    for i in 0..<multiArray.count {
      ptr[i] = sigmoid(ptr[i])
    }
    

    但是,将 sigmoid 操作添加到 Core ML 模型本身并让 Core ML 担心要简单得多。您可以通过在转换之前或之后将 sigmoid 操作添加到原始模型来做到这一点(有关如何执行此操作的说明,请参阅我的书 Core ML Survival Guide)。

    【讨论】:

    • 这行得通,但我在操作 MLMultiArrays 时遇到了困难。我试图从输出 3 个 multiArrays 的 yolov5 coreml 模型中推断。我已经确定我需要从 python 转换为 swift,就像提到的 here 一样,但我似乎无法理解它。你能以任何方式帮助我吗?
    • 这是人们付钱让我做的事情。 ;-) 但是如果你读了我的书,你应该已经在路上了。
    • 啊,我明白了。尽管我对此感到沮丧,但我现在真的很想自己破解这个。感谢您的帮助和本书!
    • 如果您还没有看到,this repo 展示了如何解码来自 YOLOv2 的预测。 YOLOv5 的方法是类似的,除了你有多个输出网格而不是只有一个,而且数学略有不同。
    【解决方案2】:

    我没有测试这个功能,但我认为它可以达到你想要的效果

    public func sigmoid_multiarray(inputs: [MLMultiArray], outputs: [MLMultiArray]) {
    for i in 0..<inputs.count {
        let input=inputs[i]
        let output=outputs[i]
        
        let count = input.count
        let iptr = UnsafeMutablePointer<Float>(OpaquePointer(input.dataPointer))
        let optr = UnsafeMutablePointer<Float>(OpaquePointer(output.dataPointer))
        
        // output = -input
        vDSP_vneg(iptr, 1, optr, 1, vDSP_Length(count))
    
        // output = exp(-input)
        var countAsInt32 = Int32(count)
        vvexpf(optr, optr, &countAsInt32)
    
        // output = 1 + exp(-input)
        var one: Float = 1
        vDSP_vsadd(optr, 1, &one, optr, 1, vDSP_Length(count))
        
        // output = 1 / 1 + exp(-input)
        var one_ar = [Float] (repeating: 1, count: input.count)
        vvdivf(optr, &one_ar, optr, &countAsInt32)
    }
    

    }

    【讨论】:

      猜你喜欢
      • 2020-04-20
      • 2018-05-29
      • 2017-04-03
      • 2011-01-09
      • 1970-01-01
      • 2017-11-11
      • 2021-09-18
      • 1970-01-01
      • 2019-09-08
      相关资源
      最近更新 更多