我正在将相关的 Keras 图转换为 Metal Performance Shaders(在https://developer.apple.com/documentation/metalperformanceshaders/objects_that_simplify_the_creation_of_neural_networks中具有图层对象的 MPSCNNGraph ),并且无法让该图输入或输出负数。这是一个问题,因为网络经过训练可以接受 -1.0 和 1.0 之间的输入。
我正在从 iPhone 相机捕获帧并将 SampleBuffers(格式 kCVPixelFormatType_32BGRA)转换为 MTLTextures(格式 MTLPixelFormat.bgra8Unorm(我想使用 MTLPixelFormat.rgba16Float,但在将 SampleBuffers 转换为 MTLTextures 时遇到问题))。
图表的第一层如下所示:
let input = MPSNNImageNode(handle: nil)
let scale = MPSNNLanczosScaleNode(source: input,
outputSize: MTLSize(width: 256,
height: 256,
depth: 1))
let bgrSwap = MPSCNNConvolutionNode(source: scale.resultImage,
weights: ConvDataSource("BGRLayer"))
“bgrSwap”从 bgr 转换为 rgb,并将 f(x) = 2x - 1 应用于每个像素(将 LanczosScaleNode 的 [0,1] 输出转换为所需的范围 [-1.0,1.0])。
当我将 bgrSwap.resultImage 转换为浮点数时(使用来自@Hollance https://github.com/hollance/YOLO-CoreML-MPSNNGraph/blob/master/TinyYOLO-NNGraph/TinyYOLO-NNGraph/MPSImage%2BFloats.swift的助手(谢谢你hollance!我希望我没有误用这个扩展)),我只看到[0.0,1.0]中的值。我怀疑在幕后进行了一些转换,这使我无法在结果(重新调整?)之前看到结果,但我不确定。