0

在 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

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

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

4

1 回答 1

0

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

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

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

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

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

于 2018-06-28T08:56:19.950 回答