Python i';我对CoordConv感到困惑

Python i';我对CoordConv感到困惑,python,neural-network,pytorch,conv-neural-network,Python,Neural Network,Pytorch,Conv Neural Network,我读了优步实验室写的一篇论文 他们创建了一个名为Coordconv的网络,在这个Coordconv中,他们不仅添加了两层meshgrid,还添加了一个简单的conv网络 它说通过这种方式,他们将位置信息添加到每个像素点? 2.在conv之后,像素点仍然保持在原始图像中的相同位置 这也在为从神经网络绘制的自然地图添加两层网格 Meshgrid如何帮助向图像添加位置信息 这是否只是简单地添加了两个与原始图像大小相同,但在原始输入图像的[-1,1]网格中的层 提前表示衷心的感谢 关于CoordConv

我读了优步实验室写的一篇论文 他们创建了一个名为Coordconv的网络,在这个Coordconv中,他们不仅添加了两层meshgrid,还添加了一个简单的conv网络

  • 它说通过这种方式,他们将位置信息添加到每个像素点? 2.在conv之后,像素点仍然保持在原始图像中的相同位置
  • 这也在为从神经网络绘制的自然地图添加两层网格
  • Meshgrid如何帮助向图像添加位置信息
  • 这是否只是简单地添加了两个与原始图像大小相同,但在原始输入图像的[-1,1]网格中的层
  • 提前表示衷心的感谢

    关于CoordConv 以下是提出CoordConv层的原始文件:

    我将试图表达我对这次行动的本能理解

    AddCoords的工作原理 添加信息的方式是将两个新的二维张量叠加到数据中(更准确地说,将其连接起来)。这两个通道不会相乘,因此此过程中不涉及网格网格

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

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

    xx\u频道

    [[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]]
    
    [[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]]    
    
    [[-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.        ]]
    
    [[-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.]]
    
    和yy_频道:

    [[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]]
    
    [[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]]    
    
    [[-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.        ]]
    
    [[-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.]]
    
    这些是
    tf.one
    tf.range
    进行匹配的结果

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

    xx\u频道

    [[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]]
    
    [[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]]    
    
    [[-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.        ]]
    
    [[-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.]]
    
    yy_频道

    [[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]]
    
    [[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]]    
    
    [[-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.        ]]
    
    [[-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张量(同样,在我的解释中,批次大小的维度被忽略)

    这两个生成的通道被作者称为坐标信息。该方法逐字添加每个二维位置的坐标:y坐标和x坐标

    在我们的例子中,让我们考虑一个输入张量在位置<代码>(4, 5)< /代码>中的值,这意味着沿着最后一个维度(大小4)的值,这是可以访问的:<代码>输入句柄张量(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.14285714
    4即其y坐标的标度值,
    0.42857143
    5即其x坐标的标度值。关于坐标的信息现在包含在生成的张量中,该张量由
    AddCoords
    方法返回

    合作社 它是一个设计好的层,将
    AddCoords
    应用于输入,并将结果张量提供给经典的Conv2D层。因此,它可以添加到神经网络中,就像您对Conv2D层所做的那样

    这就是作者所做的,例如,在实验GANs时,他们用
    CoordConv
    取代了
    Conv2D
    (这同样包括一个Conv2D)

    让我知道这是否回答了您的问题和/或纠正了任何误解

    这对神经网络意味着什么? 更多可训练参数。。。 让我们为前面的示例提供更多的上下文。 在我们前面的示例中,最后一层生成了一个形状为
    8x8x4
    的张量。假设我们希望下一个卷积层从3*3的卷积窗口产生16个输出滤波器

    你可以看到。你可以对这个问题有一个基本的了解。保持 请记住,两个链接都显示一个内核和一个通道输入 矩阵

    • 如果我们不加坐标张量,接下来的卷积将有16个核,每个核的形状
      3x3x4
    • 如果我们应用AddCoords,我们将用shape
      8x8x6
      来填充一个张量,我们的16个内核将分别具有shape
      3x3x6
    你可以把这些核想象成神经元。每个神经元都有
    3x3x4==36
    weights(Conv2D)或
    3x3x6==54
    weights(AddCoords+Conv2D或CoordConv)。他们的权重将在学习过程中更新。知道了这一点,CoordConv的坐标通道显然意味着卷积层的每个内核都有新的和特定的权重。这就是神经网络考虑这些坐标的方式

    ... 在类似的培训过程中暗示 如果您没有尝试过机器学习,那么神经网络的监督学习过程可能非常复杂,难以理解,但它更一般,可以恢复(过于简化)如下:

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

    首先,非常感谢您非同寻常的解释!!!你惊人的回答确实解决了我大部分的困惑!但仍然有一些小麻烦想问:只需添加两层,其中包含(x,y)坐标,可以使卷积平滑地将原始图像中的点转换为新图像?这是否有某种数学原因?卷积过程知道如何将其添加到新图像中?我很高兴它是有用的。我试图添加有关eff的见解