MPSCNNConvolution

1.初始化时传人 UnsafePointer<Float> 时要传入w,不能是 &(w[0]).否则w其实传入失败,卷积的结果是nan或inf.

原因可能是 &(w[0])其实只引用了w[0]这一个元素,把w[0]当成整体来看.与C不同。。。

  let w:[Float] = xxxx   
  conv = MPSCNNConvolution(device: device,
                   convolutionDescriptor: convDesc,
                   kernelWeights: w, //!!!!! can not assign to &(w[0])
                   biasTerms: b,
                   flags: MPSCNNConvolutionFlags.none)

2. MPSCNNConvolution的kernel只支持half类型,实测MPSImage的format只能是.unorm8 或.unorm16 .float16,.float32不支持 

3. 权重的排列顺序:

weights:[outputChannels][kernelHeight][kernelWidth][inputChannels],bias:[outputChannels]

 

MPSImage

1.内存排列顺序:

a.slices == 1时

channles >= 3 内存中排列为  [r g b a] [r g b a] [r g b a] ,a通道占位

else  a通道不占位

b.slices >1时

最后一个slice不论多少个channels 都是 [r g b a] [r g b a] [r g b a],都占位

 

 

转载于:https://www.cnblogs.com/mlj318/p/6593762.html

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐