CoordConv:给卷积加上坐标,从而使其具备了空间感知能力【附Pytorch实现】

论文地址:https://arxiv.org/pdf/1807.03247.pdf

CoordConv:给卷积加上坐标,从而使其具备了空间感知能力【附Pytorch实现】

1、动机

传统卷积具备平移不变性,这使得其在应对分类等任务时可以更好的学习本质特征。不过,当需要感知位置信息时,传统卷积就有点力不从心了。为了使得卷积能够感知空间信息,作者在输入feature map后面增加了两个coordinate通道,分别表示原始输入的x和y坐标,然后再进行传统卷积,从而使得卷积过程可以感知feature map的空间信息,该方法称之为CoordConv。使用了CoordConv之后,能够使得网络可以根据不同任务需求学习平移不变性或者一定程度的平移依赖性。

2、一个小实验

作者为了证明传统卷积没有空间感知能力,设计了一个小实验:在一个自定义的数据集Not-so-Clevr(见下图2)上,使用传统卷积和CoordConv分别进行训练,然后在训练集、测试集上测试。

CoordConv:给卷积加上坐标,从而使其具备了空间感知能力【附Pytorch实现】

数据集的设定如下:

  • 对于分类任务,输入数据为数据点的坐标(x, y),输出为图像中对应像素高亮表示;
  • 对于回归任务,与分类相反,输入为图像上的高亮像素,输出为对应坐标点;
  • 训练集为前三个象限,测试集为第四象限。

作者使用传统卷积和CoordConv分别进行实验,结果如图5所示:

CoordConv:给卷积加上坐标,从而使其具备了空间感知能力【附Pytorch实现】

从图5可以看出:

  • 左列分类实验:使用前三个象限的坐标训练之后,在训练集上传统卷积也能大致分类正确,但在测试集上就几乎不能正确分类了;而CoordConv不管是训练集还是测试集都能100%分类正确;
  • 右列回归实验:与分类实验类似,CoordConv相比传统卷积,取得了压倒性优势;

 

这个小实验,证实了传统卷积在卷积核进行局部运算时,是不知道当前卷积核所处的空间位置的,相当于盲人摸象,能感受到局部信息,但对这部分信息在整体的哪个位置没有概念。

3、CoordConv方法

CoordConv的构造如最上面的图3所示:与传统卷积相比,CoordConv就是在输入的feature map后面增加了两个通道,一个表示x坐标,一个表示y坐标,后面就是与正常卷积过程一样了。

众所周知,传统卷积具备三个特性:参数少、计算高效、平移不变性。而CoordConv则仅继承了其前两个特性,但运行网络自己根据学习情况去保持或丢弃平移不变性。看似这会损害模型的归纳能力,但其实拿出一部分网络容限能力去建模非平移不变性,实际上会提升模型的泛化能力。

事实上,如果CoordConv的坐标通道没有学习到任何信息,那么CoordConv此时就等价于传统卷积,具备了传统卷积完全的平移不变性;而如果坐标通道学习到了 一定的信息,那么此时CoordConv就具备了一定的平移依赖性。可见,CoordConv的平移不变性和平移依赖性是可以根据不同任务进行动态调整的。就像残差连接那样,即可以进行恒等映射,又可以多学习一部分内容。因此,我们完全可以在需要感知空间信息的时候使用CoordConv,一方面增加不了多少计算量,另一方面对平移不变性也没有完全消除,而是让网络根据任务的不同学习不同程度的平移不变性和平移依赖性。

4、Pytorch实现

ins_feat = x # 当前实例特征tensor
# 生成从-1到1的线性值
x_range = torch.linspace(-1, 1, ins_feat.shape[-1], device=ins_feat.device)
y_range = torch.linspace(-1, 1, ins_feat.shape[-2], device=ins_feat.device)
y, x = torch.meshgrid(y_range, x_range) # 生成二维坐标网格
y = y.expand([ins_feat.shape[0], 1, -1, -1]) # 扩充到和ins_feat相同维度
x = x.expand([ins_feat.shape[0], 1, -1, -1])
coord_feat = torch.cat([x, y], 1) # 位置特征
ins_feat = torch.cat([ins_feat, coord_feat], 1) # concatnate一起作为下一个卷积的输入

 

上一篇:开源GIS-geos实现空间快速连接


下一篇:卷积神经网络常用函数Pytorch