我正在从不赞成使用的地方迁移我的神经网络:

init(device: MTLDevice, convolutionDescriptor: MPSCNNConvolutionDescriptor, kernelWeights: UnsafePointer<Float>, biasTerms: UnsafePointer<Float>?, flags: MPSCNNConvolutionFlags)


init(device: MTLDevice, weights: MPSCNNConvolutionDataSource)

我已经实现了一个MPSCNNConvolutionDataSource,它经过了很好的调试,可用于除图层外的所有图层。仅出于测试目的,我在这里将数据源自身与MPSCNNFullyConnected的init()一起使用,以确保数据源正确实现。我知道这不是它的预期用途,但是我希望将相同的数据放入两个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)

当我使用新的init()实例化完全连接的层时,网络将失败。以下代码运行,但是NN无法正常工作。
  /* 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)

有什么建议为什么两个电话都不相同?

最佳答案

终于我解决了。两次调用之间的区别在于,如果使用以下命令,则必须显式设置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)

我想这没有记载!感谢苹果三天的核心调试。

07-27 19:01