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

标签 python keras conv-neural-network keras-layer

关闭。这个问题需要更多focused .它目前不接受答案。












想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post .

2年前关闭。




Improve this question




需求
您好,我正在 上试验 CNN 的使用来自圆柱域的图像 ,所以我有兴趣以循环(或循环)方式应用卷积层。 我的意思是一个卷积层 而不是用零填充图像只是 环绕图像 (或图像周围的内核)。
想法、搜索和想法
来自信号处理背景,我预计它已经涵盖:实际上,当在频域中执行计算(即通过 DFT)时,这种循环来自免费,而需要额外的努力(称为“零填充”)以避免循环模棱两可。
好吧:我了解到,由于内核大小通常非常小,因此在基域中可以更方便地进行计算。我想不出为什么这不可行的任何充分理由,所以我希望存在一些进行循环卷积的直接方法。
但是我没有发现这个函数的覆盖范围,无论是在 Keras 还是在 TensorFlow 文档中。此外,我发现很少或没有真正相关的讨论:Torch7 discussion
所以我剩下以下选项:

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

  • 问题
    有没有更直接的选择,或者我应该首先解决的信息来源?
    否则,我在哪里可以找到如何实现前者的任何建议?
    对于后者,我必须承认我更多地描述它是为了激发一些集体思考如何从用户的角度实现它,但我真的觉得不能贡献一个好的拉取请求(即一个包含好的代码的请求)。无论如何,我会很感激任何从哪里开始的建议。

    最佳答案

    我正在实现这样的东西,所以尽管我会添加代码。我认为实际实现包装填充的最简单方法是使用 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/

    相关文章:

    python - 将 .png 文件转换为 .nii(NiFti 文件)

    python - 如何使用 Keras 构建多类卷积神经网络

    python - os.listdir 和 os.path.isdir 混淆,isdir 是随机的吗?

    python - IPython 和 REPL 在没有打印功能的情况下显示数据时表现不同

    python - 来自 Theano 表达式的梯度,用于 Keras 中的过滤器可视化

    machine-learning - 如何避免简单前馈网络的过度拟合

    python - sklearn 和 n_jobs 中的超参数优化 > 1 : Pickling

    python - Tensorflow:小批量中每个样本的不同过滤器的卷积

    python - 带有来自 Pandas DataFrame 的数据的 Spacy NLP

    python - Tkinter Entry 小部件后的事件回调