PyTorch 或 TensorFlow 中是否可以使用位置相关的卷积滤波器?

Is location-dependent convolution filter possible in PyTorch or TensorFlow?

让我们假设除了有一个图像之外,我还有一个在图像的 X 轴上从左到右的渐变,以及另一个在 Y 轴上从上到下的渐变。这两个渐变具有相同的图像大小,并且都可以在 -0.5 到 0.5 之间变化。

现在,我想让卷积核(a.k.a。卷积滤波器或卷积权重)取决于梯度中的 (x, y) 位置。因此内核是梯度的函数,就好像内核是嵌套微型神经网络的输出一样。这将使过滤器的权重在每个位置都不同,但与它们的邻居略有相似。我如何在 PyTorch 或 TensorFlow 中做到这一点?

当然,我可以自己计算一个 Toeplitz matrix (a.k.a. diagonal-constant matrix) ,但是如果假装 x==y==n,矩阵乘法将需要 O(n^3) 次运算,而卷积可以在 O(n^2) normally 中实现.或者我可以自己迭代每个元素并以非矢量化方式进行乘法运算。

有什么更好的主意吗?我想在这里看到创意,思考如何巧妙地实现这一点。我相信编码将是一种有趣的方式来构建一个网络层,该网络层能够做类似于 Spatial Transformer Networks 的简化版本的事情,但它的空间变换将独立于图像。

这是我为这个问题的简化版本想到的解决方案,其中将使用权重的线性组合而不是真正使用嵌套的迷你神经网络:

可能可以进行 4 次不同的卷积处理以获得 4 个特征图,然后将这 4 个图与梯度(2 个垂直梯度和 2 个水平梯度)相乘,并将它们加在一起,这样只有 1 个图遗迹。然而,这将是不同映射的线性组合,这比真正使用首先会改变内核的嵌套神经网络更简单。

仔细想想,这是一个等价问题的解决方案。这个解决方案的问题在于,它通过将 "mini neural net" 放在之后而不是之前,并且以一种完全不同的方式来解决问题。所以它解决了问题,但提供了一个非常不同的优化 space 和收敛行为,这对我来说比我如何提出问题更不自然。

从某种意义上说,问题的解决方案可能非常类似于将两个梯度简单地连接到 1 个常规特征图(来自常规卷积),例如在连接后具有 d_2 = d_1 + 2 的深度) ,然后在此之上执行更多的卷积。我不会证明为什么这是对等价问题的有效解决方案,但我仔细考虑了一下,它似乎是可以证明的。

优化 space(对于权重)在这里会非常不同,我认为它不会收敛于相同的行为。我想知道你们在优化收敛方面对这个解决方案的看法。

卷积比全连接层更有效的原因是因为它们是平移不变的。如果您希望具有依赖于位置的卷积,则需要向卷积添加两个额外参数,即具有 N+2 个输入通道,其中 x、y 坐标是两个附加通道的值(如 CoordConv).

至于替代方案,梯度有意义吗?如果不是,并且它在所有图像中都是统一的,最好在预处理阶段手动删除它(类似于方向校正、裁剪等)。如果不是(例如光照、阴影的差异),那么在假设它们将学习不同光照的不变性的情况下包括其他层是一种常见的不干涉方法。