如何在 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)
}
}
对于 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)
}
}