将 MPSCNNFullyConnected 迁移到 MPSCNNConvolutionDataSource
Migrating MPSCNNFullyConnected to MPSCNNConvolutionDataSource
我正在从已弃用的神经网络迁移:
init(device: MTLDevice, convolutionDescriptor: MPSCNNConvolutionDescriptor, kernelWeights: UnsafePointer<Float>, biasTerms: UnsafePointer<Float>?, flags: MPSCNNConvolutionFlags)
到
init(device: MTLDevice, weights: MPSCNNConvolutionDataSource)
我已经实现了一个 MPSCNNConvolutionDataSource
,它调试得很好,适用于我的所有图层,只有一个图层除外。仅出于测试目的,我在这里调用数据源函数以及已弃用的 MPSCNNFullyConnected
的 init() 函数,以确保正确实现数据源。我知道这不是它的预期用途,但我希望相同的数据进入两个 MPSCNNFullyConnected() 构造函数。以下代码运行,神经网络正常工作。
/* This code runs as intended */
let datasource = DataSource("test", 8, 8, 224, 1024, .reLU)
_ = datasource.load()
let layer = MPSCNNFullyConnected(device: device,
convolutionDescriptor: datasource.descriptor(),
kernelWeights: UnsafeMutablePointer<Float>(mutating: datasource.weights().assumingMemoryBound(to: Float.self)),
biasTerms: datasource.biasTerms(),
flags: .none)
当我用新的 init() 实例化全连接层时,网络失败。以下代码运行但神经网络无法正常工作。
/* This code does run, but the layer does NOT output the correct values */
let datasource = DataSource("test", 8, 8, 224, 1024, .reLU)
let layer = MPSCNNFullyConnected(device: device, weights: datasource)
为什么两个调用不相同有什么建议吗?
大部分 Metal 内容的 Apple 文档似乎已经消失,但如果您查看头文件(或按住 Alt 键单击 Xcode 然后跳转到定义),它仍然存在。
权重的顺序没有改变。您仍然以与以前相同的方式加载它们。
有关如何编写此类数据源对象的示例,请查看此存储库:https://github.com/hollance/YOLO-CoreML-MPSNNGraph/blob/2ba3435bfacb8d2f792b95887fc9df85d7048ae1/TinyYOLO-NNGraph/TinyYOLO-NNGraph/YOLO.swift#L254
终于解决了。这两个调用之间的区别在于,如果您使用
,则必须显式设置 layer.offset
init(device: MTLDevice, weights: MPSCNNConvolutionDataSource)
已弃用的调用:
init(device: MTLDevice, convolutionDescriptor: MPSCNNConvolutionDescriptor, kernelWeights: UnsafePointer<Float>, biasTerms: UnsafePointer<Float>?, flags: MPSCNNConvolutionFlags)
似乎暗中这样做了。
此代码有效:
let datasource = DataSource("test", 8, 8, 224, 1024, .reLU)
let layer = MPSCNNFullyConnected(device: device, weights: datasource)
layer.offset = MPSOffset(x: 8/2, y: 8/2, z: 0)
我想这没有任何记录!感谢苹果三天硬核调试
我正在从已弃用的神经网络迁移:
init(device: MTLDevice, convolutionDescriptor: MPSCNNConvolutionDescriptor, kernelWeights: UnsafePointer<Float>, biasTerms: UnsafePointer<Float>?, flags: MPSCNNConvolutionFlags)
到
init(device: MTLDevice, weights: MPSCNNConvolutionDataSource)
我已经实现了一个 MPSCNNConvolutionDataSource
,它调试得很好,适用于我的所有图层,只有一个图层除外。仅出于测试目的,我在这里调用数据源函数以及已弃用的 MPSCNNFullyConnected
的 init() 函数,以确保正确实现数据源。我知道这不是它的预期用途,但我希望相同的数据进入两个 MPSCNNFullyConnected() 构造函数。以下代码运行,神经网络正常工作。
/* This code runs as intended */
let datasource = DataSource("test", 8, 8, 224, 1024, .reLU)
_ = datasource.load()
let layer = MPSCNNFullyConnected(device: device,
convolutionDescriptor: datasource.descriptor(),
kernelWeights: UnsafeMutablePointer<Float>(mutating: datasource.weights().assumingMemoryBound(to: Float.self)),
biasTerms: datasource.biasTerms(),
flags: .none)
当我用新的 init() 实例化全连接层时,网络失败。以下代码运行但神经网络无法正常工作。
/* This code does run, but the layer does NOT output the correct values */
let datasource = DataSource("test", 8, 8, 224, 1024, .reLU)
let layer = MPSCNNFullyConnected(device: device, weights: datasource)
为什么两个调用不相同有什么建议吗?
大部分 Metal 内容的 Apple 文档似乎已经消失,但如果您查看头文件(或按住 Alt 键单击 Xcode 然后跳转到定义),它仍然存在。
权重的顺序没有改变。您仍然以与以前相同的方式加载它们。
有关如何编写此类数据源对象的示例,请查看此存储库:https://github.com/hollance/YOLO-CoreML-MPSNNGraph/blob/2ba3435bfacb8d2f792b95887fc9df85d7048ae1/TinyYOLO-NNGraph/TinyYOLO-NNGraph/YOLO.swift#L254
终于解决了。这两个调用之间的区别在于,如果您使用
,则必须显式设置 layer.offsetinit(device: MTLDevice, weights: MPSCNNConvolutionDataSource)
已弃用的调用:
init(device: MTLDevice, convolutionDescriptor: MPSCNNConvolutionDescriptor, kernelWeights: UnsafePointer<Float>, biasTerms: UnsafePointer<Float>?, flags: MPSCNNConvolutionFlags)
似乎暗中这样做了。
此代码有效:
let datasource = DataSource("test", 8, 8, 224, 1024, .reLU)
let layer = MPSCNNFullyConnected(device: device, weights: datasource)
layer.offset = MPSOffset(x: 8/2, y: 8/2, z: 0)
我想这没有任何记录!感谢苹果三天硬核调试