【问题标题】:i'm confused with CoordConv我对 CoordConv 感到困惑
【发布时间】:2021-06-06 08:49:56
【问题描述】:

我读了 uber lab 写的一篇论文 https://medium.com/@Cambridge_Spark/coordconv-layer-deep-learning-e02d728c2311 他们创建了一个名为 Coordconv 的网络,在这个 coordconv 中,他们不仅添加了两层网格网格,还添加了一个简单的 conv 网络。

  1. 它说通过这种方式他们将位置信息添加到每个像素点? 2.所以conv之后像素点仍然和原图一样?
  2. 这也是在为从神经网络绘制的特征图添加两层网格网格?
  3. Meshgrid 如何帮助向图像添加位置信息?
  4. 这是否只是简单地将两个与原始图像大小相同但位于 [-1,1] 网格网格中的层添加到原始输入图像?

提前致谢!

【问题讨论】:

    标签: python neural-network pytorch conv-neural-network


    【解决方案1】:

    关于 CoordConv

    这是提出 CoordConv 层的原始论文:CoordConv paper

    我将尝试表达我对这个操作的本能理解。

    AddCoords 的工作原理

    添加信息的方式是将两个新的二维张量堆叠(连接,更准确地说)数据。这两个通道没有相乘,因此这个过程不涉及网格。

    假设我们处于网络的特定层。最后一个卷积步骤产生了 4 个形状为 8x8 的 2D 张量,每个都是前一个滤波器卷积的结果(因此我们在上一步中有 4 个内核)。它们实际上堆叠在一个大小为bs * 8 * 8 * 4 的张量中,其中bsbatch 大小,但现在让我们忽略batch 大小。

    AddCoords 方法将创建另外两个二维张量:

    xx_channel:

    [[0, 0, 0, 0, 0, 0, 0, 0],
     [1, 1, 1, 1, 1, 1, 1, 1],
     [2, 2, 2, 2, 2, 2, 2, 2],
     [3, 3, 3, 3, 3, 3, 3, 3],
     [4, 4, 4, 4, 4, 4, 4, 4],
     [5, 5, 5, 5, 5, 5, 5, 5],
     [6, 6, 6, 6, 6, 6, 6, 6],
     [7, 7, 7, 7, 7, 7, 7, 7]]
    

    yy_channel:

    [[0, 1, 2, 3, 4, 5, 6, 7],
     [0, 1, 2, 3, 4, 5, 6, 7],
     [0, 1, 2, 3, 4, 5, 6, 7],
     [0, 1, 2, 3, 4, 5, 6, 7],
     [0, 1, 2, 3, 4, 5, 6, 7],
     [0, 1, 2, 3, 4, 5, 6, 7],
     [0, 1, 2, 3, 4, 5, 6, 7],
     [0, 1, 2, 3, 4, 5, 6, 7]]    
    

    这些是 tf.rangetf.ones 的 matmuls 的结果。

    然后它们将被缩放以适应[-1, 1] 的范围并转换为 tensorflow.float32 类型:

    xx_channel:

    [[-1.        , -1.        , -1.        , -1.        , -1.        , -1.        , -1.        , -1.        ],
     [-0.71428571, -0.71428571, -0.71428571, -0.71428571, -0.71428571, -0.71428571, -0.71428571, -0.71428571],
     [-0.42857143, -0.42857143, -0.42857143, -0.42857143, -0.42857143, -0.42857143, -0.42857143, -0.42857143],
     [-0.14285714, -0.14285714, -0.14285714, -0.14285714, -0.14285714, -0.14285714, -0.14285714, -0.14285714],
     [ 0.14285714,  0.14285714,  0.14285714,  0.14285714,  0.14285714,  0.14285714,  0.14285714,  0.14285714],
     [ 0.42857143,  0.42857143,  0.42857143,  0.42857143,  0.42857143,  0.42857143,  0.42857143,  0.42857143],
     [ 0.71428571,  0.71428571,  0.71428571,  0.71428571,  0.71428571,  0.71428571,  0.71428571,  0.71428571],
     [ 1.        ,  1.        ,  1.        ,  1.        ,  1.        ,  1.        ,  1.        ,  1.        ]]
    

    yy_channel:

    [[-1., -0.71428571, -0.42857143, -0.14285714,  0.14285714, 0.42857143,  0.71428571,  1.],
     [-1., -0.71428571, -0.42857143, -0.14285714,  0.14285714, 0.42857143,  0.71428571,  1.],
     [-1., -0.71428571, -0.42857143, -0.14285714,  0.14285714, 0.42857143,  0.71428571,  1.],
     [-1., -0.71428571, -0.42857143, -0.14285714,  0.14285714, 0.42857143,  0.71428571,  1.],
     [-1., -0.71428571, -0.42857143, -0.14285714,  0.14285714, 0.42857143,  0.71428571,  1.],
     [-1., -0.71428571, -0.42857143, -0.14285714,  0.14285714, 0.42857143,  0.71428571,  1.],
     [-1., -0.71428571, -0.42857143, -0.14285714,  0.14285714, 0.42857143,  0.71428571,  1.],
     [-1., -0.71428571, -0.42857143, -0.14285714,  0.14285714, 0.42857143,  0.71428571,  1.]]
    

    然后它们将沿着最后一个维度(“-1”)连接到其他 2D 张量,最终得到一个形状为 8 * 8 * 6 的 3D 张量(同样,批量大小的维度在我的解释)。

    这两个生成的通道是paper 中的作者所称的坐标信息。该方法实际上添加了每个 2D 位置的坐标:y 坐标和 x 坐标。

    在我们的示例中,让我们考虑位置 [4, 5] 的输入张量的值,这意味着沿最后一个维度(大小 4)的值,可以像这样访问:input_tensor[4, 5, :]。它可能会返回如下内容:

    input_tensor[4, 5, :]
    # > [0.75261177, 0.62114716, 0.76845441, 0.44747785]
    

    AddCoords之后变成:

    ret[4, 5, :]
    # > [0.75261177, 0.62114716, 0.76845441, 0.44747785, 0.14285714, 0.42857143]
    

    ... 其中0.142857144 的缩放值,即它的y 坐标0.428571435 即它的 x 坐标。坐标信息现在包含在结果张量中,由AddCoords 方法返回。

    CoordConv

    这是一个设计层,将AddCoords 应用于输入并将生成的张量提供给经典的 Conv2D 层。因此,它可以添加到神经网络中,就像使用 Conv2D 层一样。

    这就是作者所做的,例如,在使用 GAN 进行实验时,他们将 Conv2D 替换为 CoordConv(同样包含一个 Conv2D)。

    如果这能回答您的问题和/或纠正任何误解,请告诉我。

    这对神经网络意味着什么?

    更多可训练参数...

    让我们为前面的示例提供更多背景信息。 在我们之前的示例中,最后一层产生了一个形状为8 x 8 x 4 的张量。假设我们希望下一个卷积层从 3 * 3 的卷积窗口产生 16 个输出滤波器。

    你可以看到this link to get what convolution does mathematically , chapter 2.1。你可以对what the convolution operation yields thanks to this visualizer有一个基本的了解。就收下吧 请记住,两个链接都显示单个内核和单个通道输入 矩阵。

    • 如果我们不添加坐标张量,那么接下来的卷积将有 16 个形状为 3 x 3 x 4 的内核。
    • 如果我们确实应用了 AddCoords,我们将提供一个形状为 8 x 8 x 6 的张量,而我们的 16 个内核将分别具有形状 3 x 3 x 6

    您可以将这些内核视为神经元。每个神经元都有3 x 3 x 4 == 36 权重(Conv2D)或3 x 3 x 6 == 54 权重(AddCoords+Conv2D,或 CoordConv)。他们的权重将在学习过程中更新。知道了这一点,很明显 CoordConv 的坐标通道意味着卷积层的每个内核都有新的和特定的权重。这就是神经网络考虑这些坐标的方式。

    ...隐含在类似的训练过程中

    如果您还没有尝试过机器学习,那么神经网络的监督学习过程可能很难理解,但它更通用,可以恢复(过度简化)如下:

    • 我们计算误差,这是一种数学方法来描述如何 预测与事实相去甚远。然后我们更新(添加) 网络中的每个参数(或权重),从 输出层到输入层,通过一个代表它的值 此错误的含义以及减少错误应采取的方向。这个过程称为“反向传播 错误”。

    【讨论】:

    • 首先非常感谢您的非凡解释!!!确实您的惊人答案解决了我的大部分困惑!但仍然有一些小麻烦想问:只需添加两个包含 (x ,y) 可以使卷积平滑地将原始图像中的点转换为新图像的坐标?这是否有某种数学原因?卷积过程知道如何将其添加到新图像中?
    • 我很高兴它很有用。我试图添加有关添加坐标通道的效果的见解,但我不确定您所说的“新图像”是什么意思。
    • “新图像”是coordconv的结果,coordconv创建的新图像。
    • 是的,我更新了我的答案来解决这个问题。这些图像称为feature maps,但我在回答中将它们称为“结果张量”。
    • 非常感谢您的更新!!!!!!!!!!!!我明白了!!祝你好!!!
    猜你喜欢
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多