Metal/Metal-Performance-Shaders 中是否有与 Keras/TensorFlow 的 Reshape 层类似的东西?我正在将经过训练的 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
我理解将密集层表示为 Metal 中的 4D block 的概念(我认为?),但我不明白如何使用 Metal 从形状 (8192) 到 (4,4,512)。我觉得可以采取一些巧妙的措施来获得 Dense_2 并将其 reshape 为单个 MPSNN 节点,但我不知道它是什么。
最佳答案
MPSCNNFullyConnected
层提供 1x1 图像作为输出,在您的情况下具有 8192 个 channel (这也是 Metal 纹理支持的最大 channel 数)。
reshape 选项将接收该 1x1x8192 图像并输出具有 512 个 channel 的 4x4 图像。在 Keras 等中,这只是更改底层 TF 张量中的步幅的问题,但在 Metal 中,您必须复制数据。
从 iOS 11.3 开始,有一个 MPSNNReshape
对象可以执行这种重新排列。我自己没有使用过它,但看起来你只需给它源图像和目标图像(在编码该内核时),它就会自行弄清楚如何在它们之间复制数据。
但是... MPSNNReshape
似乎不是可以放入 MPSNNGraph
中的节点,因为它扩展了 MPSCNNKernel
,而不是MPSNNFilterNode
。这似乎有点疏忽......
因此,您必须创建两张图表,一张直到此 reshape 节点,另一张包含其余代码。然后运行第一个图,使用第一个图的输出对 reshape 节点进行编码,然后使用 reshape 节点的输出运行第二个图。这应该足够快,但是有点烦人,因为您无法在单个图表中完成所有事情。
关于swift - MPSNNGraph reshape 节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51075161/