关于 CoordConv
这是提出 CoordConv 层的原始论文:CoordConv paper。
我将尝试表达我对这个操作的本能理解。
AddCoords 的工作原理
添加信息的方式是将两个新的二维张量堆叠(连接,更准确地说)数据。这两个通道没有相乘,因此这个过程不涉及网格。
假设我们处于网络的特定层。最后一个卷积步骤产生了 4 个形状为 8x8 的 2D 张量,每个都是前一个滤波器卷积的结果(因此我们在上一步中有 4 个内核)。它们实际上堆叠在一个大小为bs * 8 * 8 * 4 的张量中,其中bs 是batch 大小,但现在让我们忽略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.range 与 tf.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.14285714 是4 的缩放值,即它的y 坐标,0.42857143 是5 即它的 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 的坐标通道意味着卷积层的每个内核都有新的和特定的权重。这就是神经网络考虑这些坐标的方式。
...隐含在类似的训练过程中
如果您还没有尝试过机器学习,那么神经网络的监督学习过程可能很难理解,但它更通用,可以恢复(过度简化)如下:
- 我们计算误差,这是一种数学方法来描述如何
预测与事实相去甚远。然后我们更新(添加)
网络中的每个参数(或权重),从
输出层到输入层,通过一个代表它的值
此错误的含义以及减少错误应采取的方向。这个过程称为“反向传播
错误”。