swift - MPSNNGraph reshape 节点

标签 swift tensorflow keras metal metal-performance-shaders

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 节点,但我不知道它是什么。

我尝试仅使用 https://developer.apple.com/documentation/metalperformanceshaders/objects_that_simplify_the_creation_of_neural_networks 中的对象

最佳答案

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/

相关文章:

python - 值错误 : Weights for model sequential have not yet been created

ios - 在 Swift 中将 map View 跨度调整为注释图钉

python - import_meta_graph 失败,数据丢失 : not an sstable (bad magic number)

swift - 不能从其他类调用函数

python - tensorflow 2.0 : An op outside of the function building code is being passed

ios - Tensorflow iOS 在使用重新训练的初始模型的简单示例和相机示例中返回不同的结果

python - Keras:接受 softmax 输出的整数标签

python - Keras fit_generator 上的错误,多运行了几步

swift - UIAlertController 快速管理系统声音

ios - Swift 2.2 中的 UIButton。如何添加不同的目标?