首页 > 解决方案 > Swift MPSCNNConvolution - 权重都设置为 1,输出不应该和输入一样吗?

问题描述

试图弄清楚如何使用MPSCNNConvolution. 我有一个 4 x 3 的图像和一个 4 x 3 的内核。我将所有权重设置为 1,将所有输入设置为 1,并且我有点希望将所有 1 都返回。我得到的是

12  9  6  3
 8  6  4  2
 4  3  2  1

问题是我不知道它是否应该表现得像这样。我已经翻遍了我能找到的所有 Apple 文档、每一篇在线文章、每一个 github 存储库,但我找不到任何说明当层设置正确时期望什么样的输出。

该模式适用于不同大小的图像。一个 3 x 2 给我

6 4 2
3 2 1

一个 2 x 2 给了我

4 2
2 1

我已经将我的“最小”示例推到了github。它不小。Xcode 12.4 不再支持 Float16,因此有用于在 Float16 和 Float32 之间浮动的实用程序代码,以及用于卷积的所有复杂设置,还有更多用于尝试解除不安全指针的代码。

我的具体问题:这个输出“只是正常行为”MPSCNNConvolution吗?这个函数/算法有名字吗,我可以查一下吗?

标签: swiftmacosneural-networkconv-neural-networkmacos-big-sur

解决方案


的文档MPSCNNConvolution有点混乱。对于外行来说,这似乎MPSCNNConvolution是一种包含卷积核的容器。不是这种情况。MPSCNNConvolution 本身就是一个内核。具体来说,它对内核窗口下的所有输入值进行加权和求和。只是一个直接的总和,没有平均或最大值。您所看到的是内核从 (0, 0) 开始并滑离右边缘并最终滑离底部边缘的结果。

在输入图像上设置内核偏移和剪辑矩形,并且与内核和所有其他的MPSCNNConvolution工作方式相同MPSCNNPooling*


推荐阅读