如何在 MLMultiarray 元素上应用 Sigmoid?

How to apply Sigmoid on MLMultiarray elements?

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

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

我使用的 sigmoid 函数是:

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

凭记忆输入,所以可能会有错误,但基本上你会获取一个指向内存的指针,然后循环遍历它:

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)。

这个功能我没有测试,但是我觉得可以达到你想要的效果

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)
}

}