MPSNNGraph Reshape 节点

MPSNNGraph Reshape node

Metal/Metal-Performance-Shaders 中是否有类似于 Keras/TensorFlow 的重塑层?我正在将训练有素的 Keras 模型转换为 MPSNNGraph,但我在处理 conv2d->dense->conv2dTranspose 部分时遇到了问题。我正在尝试构建以下配置:

Conv2D_1, output_shape: (1,1,128) <-- i've handled up to here
Reshape_1(Conv2D_1), output_shape: (128)
Dense_1(Reshape_1), output_shape: (1024)
Dense_2(Dense_1), output_shape: (8192)
Reshape_2(Dense_2), output_shape: (4,4,512) <--hung up here
Conv2DTranspose(Reshape_2), output_shape: (8,8,256) <-- i know how to do this

我理解在金属中将致密层表示为 4D 块的概念(我认为?),但我不明白如何使用金属将形状 (8192) 变为 (4,4,512)。我觉得可以做一些聪明的事情来获得 Dense_2 并重塑为单个 MPSNN 节点,但我不知道它是什么。

我试图只使用来自 https://developer.apple.com/documentation/metalperformanceshaders/objects_that_simplify_the_creation_of_neural_networks

的对象

MPSCNNFullyConnected 图层输出 1x1 图像,在您的情况下具有 8192 个通道(这也是金属纹理支持的最大通道数)。

reshape 选项将接收该 1x1x8192 图像并输出具有 512 个通道的 4x4 图像。在 Keras 等中,这只是改变底层 TF 张量的步幅的问题,但在 Metal 中,你必须复制数据。

从 iOS 11.3 开始,有一个 MPSNNReshape 对象可以进行这种重新排列。我自己没用过它,但看起来你只要给它源图像和目标图像(在编码这个内核时),它就会自己弄清楚如何在它们之间复制数据。

但是...MPSNNReshape 似乎不是可以放入 MPSNNGraph 节点 ,因为它扩展了 [=14] =],而不是 MPSNNFilterNode。这似乎有点疏忽...

因此您必须创建两张图,一张到此重塑节点为止,另一张包含其余代码。然后 运行 第一个图,使用第一个图的输出对重塑节点进行编码,然后 运行 使用重塑节点的输出对第二个图进行编码。这应该足够快了,但是有点烦人,因为你不能在一张图中完成所有事情。