Metal Performance Shader框架为构建您自己的卷积神经网络提供支持。例如,当创建MSPCNNConvolution时,它需要4D权重张量作为init参数,以1D浮点指针表示。

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

文档中有关于4D张量的说法



不幸的是,这些信息并没有真正告诉我如何将4D数组排列到一维Float指针中。

我尝试订购权重,如BNNS要求的那样,但是没有运气。

如何正确地将4D张量(数组)表示为1D Float指针(数组)?

PS:我曾尝试像C数组一样安排它,并获得指向平面数组的指针,但是它没有用。

更新

@RhythmicFistman:这就是我将其存储在一个普通数组中的方式,可以将其转换为UsafePointer<Float>(但不起作用):
var output = Array<Float>(repeating: 0, count: weights.count)

for o in 0..<outputChannels {
    for ky in 0..<kernelHeight {
        for kx in 0..<kernelWidth {
            for i in 0..<inputChannels {
                let offset = ((o * kernelHeight + ky) * kernelWidth + kx) * inputChannels + i
                output[offset] = ...
            }
        }
    }
}

最佳答案

好的,所以我知道了。这是我用来重构卷积和完全连接矩阵的2个python函数

# shape required for MPSCNN [oC kH kW iC]
# tensorflow order is [kH kW iC oC]
def convshape(a):
    a = np.swapaxes(a, 2, 3)
    a = np.swapaxes(a, 1, 2)
    a = np.swapaxes(a, 0, 1)
    return a

# fully connected only requires a x/y swap
def fullshape(a):
    a = np.swapaxes(a, 0, 1)
    return a

10-08 05:31