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