如何解决如何在MLMultiarray元素上应用Sigmoid?
对于python中的割炬张量,我可以使用y = x[i].sigmoid()
如何在Swift中使用MLMultiArray复制此内容?
我可以通过VNCoreMLFeatureValueObservation.featureValue.multiArrayValue
获得数组
现在我想在此应用乙状结肠
我正在使用的S型函数是:
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担心它要简单得多。您可以通过在转换之前或之后向原始模型添加S型操作来实现此目的(有关如何执行此操作的说明,请参阅我的《 Core ML生存指南》一书)。
,我没有测试这个功能,但我认为它可以实现你想要的
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,vDSP_Length(count))
// output = exp(-input)
var countAsInt32 = Int32(count)
vvexpf(optr,&countAsInt32)
// output = 1 + exp(-input)
var one: Float = 1
vDSP_vsadd(optr,&one,vDSP_Length(count))
// output = 1 / 1 + exp(-input)
var one_ar = [Float] (repeating: 1,count: input.count)
vvdivf(optr,&one_ar,&countAsInt32)
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。