来自圆形/循环域的图像上的 Keras 卷积层

lur*_*x66 6 python conv-neural-network keras keras-layer

需求

您好,我正在尝试在来自圆柱域的图像上使用 CNN ,所以我有兴趣以圆形(或循环)方式应用卷积层。我的意思是一个卷积层,它不是用零填充图像,而是环绕图像(或图像周围的内核)。

想法、搜索和想法

来自信号处理背景,我预计它已经涵盖:实际上,当在频域中执行计算(即通过 DFT)时,这种循环来自免费,而需要额外的努力(称为“零填充”)以避免循环模棱两可。

好吧:我了解到,由于内核大小通常非常小,因此在基域中可以更方便地进行计算。我想不出为什么这不可行的任何充分理由,所以我希望存在一些进行循环卷积的直接方法。

但是我没有发现这个函数的覆盖范围,无论是在 Keras 还是在 TensorFlow 文档中。此外,我发现很少或没有真正相关的讨论:Torch7 Discussion

所以我剩下以下选项:

  • CyclicConv2D通过继承 Keras 的layer.Layer类来实现我自己的层,如here所述
  • 提交的实验性新功能,我自己拉的要求,如所描述这里。很快,我会考虑为“padding=”参数添加一些“wrap”值,或者添加一个新的“wrap=”参数。它应该指定图像应该沿着哪些轴环绕。事实上,这可能只需要沿着一个维度,圆形维度,而不是两个维度。

问题

有没有更直接的选择,或者我应该首先解决的信息来源?

否则,我在哪里可以找到如何实施前者的任何建议?

对于后者,我必须承认,我更多地描述它是为了激发一些集体思考如何从用户的角度实现它,但我真的觉得不能贡献一个好的拉取请求(即一个包括好的代码)。无论如何,我会很感激任何从哪里开始的建议。

Ed *_*ith 1

我正在实现类似的东西,所以尽管我会添加代码。我认为实际实现包装填充的最简单方法是使用带有“wrap”选项的Numpy pad 函数。例如与

\n\n
input = np.array([[1,2,3],[4,5,6],[7,8,9]])\nkernel = [1,1]\n#We want symmetrical padding (same top and bottom)\n# and np.pad format ((before_1, after_1), \xe2\x80\xa6 (before_N, after_N))\npad = [[i,i] for i in kernel]\npadded_input = np.pad(input, pad, "wrap")\n
Run Code Online (Sandbox Code Playgroud)\n\n

这使,

\n\n
array([[9, 7, 8, 9, 7],\n       [3, 1, 2, 3, 1],\n       [6, 4, 5, 6, 4],\n       [9, 7, 8, 9, 7],\n       [3, 1, 2, 3, 1]])\n
Run Code Online (Sandbox Code Playgroud)\n\n

看起来创建一个类似于ZeroPadding2D 的自定义层(称为类似的东西)CyclicPadding2D可能是最小化 Keras 代码更改的最佳想法,如下所示,

\n\n
kernel = [7,7]\nmodel = Sequential()\nmodel.add(CyclicPadding2D(kernel, input_shape=(224, 224, 3)))\nmodel.add(Conv2D(32, kernel=kernel, padding="valid"))\nmodel.build()\n
Run Code Online (Sandbox Code Playgroud)\n\n

您还可以在池化层和转换层之间使用它。中的代码CyclicPadding2D可能需要考虑输入格式(通道、批次等),例如:

\n\n
if self.data_format is "channels_last":\n    #(batch, depth, rows, cols, channels)\n    pad = [[0,0]] + [[i,i] for i in self.kernel] + [[0,0]]\nelif self.data_format is "channels_first":\n    #(batch, channels, depth, rows, cols)\n    pad = [[0, 0], [0, 0]] + [[i,i] for i in self.kernel]\ninputs = np.pad(inputs,  pad, "wrap")\n
Run Code Online (Sandbox Code Playgroud)\n\n

这类似于 Keras Numpy 后端使用硬连线选项“constant”所做的事情,而张量流后端不提供任何选项,因此默认为常量(尽管有趣的是tf.pad提供了一个 Reflect选项)。

\n\n

查看 Keras 源代码,也许可以将类似的内容添加为功能,只需将上面的代码放入当填充选项类似于“周期性”时的调用函数中即可。_conv也就是说,简单地添加一个新的填充层可能是最灵活的解决方案。

\n