关闭。这个问题需要更多focused .它目前不接受答案。
想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post .
2年前关闭。
Improve this question
需求
您好,我正在 上试验 CNN 的使用来自圆柱域的图像 ,所以我有兴趣以循环(或循环)方式应用卷积层。 我的意思是一个卷积层 而不是用零填充图像只是 环绕图像 (或图像周围的内核)。
想法、搜索和想法
来自信号处理背景,我预计它已经涵盖:实际上,当在频域中执行计算(即通过 DFT)时,这种循环来自免费,而需要额外的努力(称为“零填充”)以避免循环模棱两可。
好吧:我了解到,由于内核大小通常非常小,因此在基域中可以更方便地进行计算。我想不出为什么这不可行的任何充分理由,所以我希望存在一些进行循环卷积的直接方法。
但是我没有发现这个函数的覆盖范围,无论是在 Keras 还是在 TensorFlow 文档中。此外,我发现很少或没有真正相关的讨论:Torch7 discussion
所以我剩下以下选项:
CyclicConv2D
通过子类化 Keras 来实现层 layer.Layer
类,如所述 here 问题
有没有更直接的选择,或者我应该首先解决的信息来源?
否则,我在哪里可以找到如何实现前者的任何建议?
对于后者,我必须承认我更多地描述它是为了激发一些集体思考如何从用户的角度实现它,但我真的觉得不能贡献一个好的拉取请求(即一个包含好的代码的请求)。无论如何,我会很感激任何从哪里开始的建议。
最佳答案
我正在实现这样的东西,所以尽管我会添加代码。我认为实际实现包装填充的最简单方法是使用 Numpy
pad function使用“包装”选项。例如与
input = np.array([[1,2,3],[4,5,6],[7,8,9]])
kernel = [1,1]
#We want symmetrical padding (same top and bottom)
# and np.pad format ((before_1, after_1), … (before_N, after_N))
pad = [[i,i] for i in kernel]
padded_input = np.pad(input, pad, "wrap")
这使,
array([[9, 7, 8, 9, 7],
[3, 1, 2, 3, 1],
[6, 4, 5, 6, 4],
[9, 7, 8, 9, 7],
[3, 1, 2, 3, 1]])
看起来像创建一个类似于 ZeroPadding2D 的自定义层被称为
CyclicPadding2D
然后可能是最小化对 Keras 代码的更改的最佳主意,就像这样,kernel = [7,7]
model = Sequential()
model.add(CyclicPadding2D(kernel, input_shape=(224, 224, 3)))
model.add(Conv2D(32, kernel=kernel, padding="valid"))
model.build()
您也可以在池化层和卷积层之间使用它。
CyclicPadding2D
中的代码可能需要考虑输入格式( channel 、批处理等),例如,if self.data_format is "channels_last":
#(batch, depth, rows, cols, channels)
pad = [[0,0]] + [[i,i] for i in self.kernel] + [[0,0]]
elif self.data_format is "channels_first":
#(batch, channels, depth, rows, cols)
pad = [[0, 0], [0, 0]] + [[i,i] for i in self.kernel]
inputs = np.pad(inputs, pad, "wrap")
这类似于 Keras Numpy backend使用硬连线选项“常量”,而 tensorflow 后端不提供任何选项,因此默认为常量(尽管有趣的是
tf.pad
提供了反射 option )。查看 Keras 源代码,也许可以将类似的内容添加为功能,只需将上面的代码放在 call function 中即可。的
_conv
当填充选项类似于“定期”时。也就是说,简单地添加一个新的填充层可能是最灵活的解决方案。
关于python - 来自圆形/循环域的图像上的 Keras 卷积层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54911015/