Ios 正在迁移MPSCNNFULLY连接到MPSCNN卷积数据源

Ios 正在迁移MPSCNNFULLY连接到MPSCNN卷积数据源,ios,conv-neural-network,metal-performance-shaders,Ios,Conv Neural Network,Metal Performance Shaders,我正在将我的神经网络从不推荐的: init(device: MTLDevice, convolutionDescriptor: MPSCNNConvolutionDescriptor, kernelWeights: UnsafePointer<Float>, biasTerms: UnsafePointer<Float>?, flags: MPSCNNConvolutionFlags) 我已经实现了一个mpscnn卷积数据源,它经过良好的调试,适用于除一层之外的所有层。

我正在将我的神经网络从不推荐的:

init(device: MTLDevice, convolutionDescriptor: MPSCNNConvolutionDescriptor, kernelWeights: UnsafePointer<Float>, biasTerms: UnsafePointer<Float>?, flags: MPSCNNConvolutionFlags)
我已经实现了一个
mpscnn卷积数据源
,它经过良好的调试,适用于除一层之外的所有层。仅出于测试目的,我在这里亲自调用datasource函数以及
MPSCNNFullyConnected
中已弃用的init(),以确保正确实现datasource。我知道这不是它的预期用途,但我希望相同的数据进入两个MPSCNNFullyConnected()构造函数。以下代码运行,NN工作正常

  /* 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)
  /* 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)

有什么建议可以解释为什么两个调用不完全相同吗?

大多数这种金属材料的苹果文档似乎已经消失了,但如果您查看头文件(或者在Xcode中单击Alt,然后跳转到定义),它仍然存在

重量的顺序没有改变。您仍然以与以前相同的方式加载它们


有关如何编写此类数据源对象的示例,请查看此repo:

最后我解决了它。两个调用之间的区别在于,如果使用以下命令,则必须显式设置layer.offset:

init(device: MTLDevice, weights: MPSCNNConvolutionDataSource) 
不推荐的调用:

init(device: MTLDevice, convolutionDescriptor: MPSCNNConvolutionDescriptor, kernelWeights: UnsafePointer<Float>, biasTerms: UnsafePointer<Float>?, flags: MPSCNNConvolutionFlags)
我想这是不可能的!感谢苹果三天的硬核调试

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)