Python i';我对CoordConv感到困惑
我读了优步实验室写的一篇论文 他们创建了一个名为Coordconv的网络,在这个Coordconv中,他们不仅添加了两层meshgrid,还添加了一个简单的conv网络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
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
来填充一个张量,我们的16个内核将分别具有shape8x8x6
3x3x6
3x3x4==36
weights(Conv2D)或3x3x6==54
weights(AddCoords+Conv2D或CoordConv)。他们的权重将在学习过程中更新。知道了这一点,CoordConv的坐标通道显然意味着卷积层的每个内核都有新的和特定的权重。这就是神经网络考虑这些坐标的方式
... 在类似的培训过程中暗示
如果您没有尝试过机器学习,那么神经网络的监督学习过程可能非常复杂,难以理解,但它更一般,可以恢复(过于简化)如下:
- 我们计算误差,这是一种数学方法来描述 这一预测与事实相去甚远。然后我们更新(添加) 网络中的每个参数(或权重),从 输出层到输入层,通过表示其 这一错误的含义以及减少错误的方向。这个过程称为“反向传播” 错误”