CoordConv:An intriguing failing of convolutional neural networks and the CoordConv solution

转载请注明作者和出处: http://blog.csdn.net/john_bh/

论文链接: An intriguing failing of convolutional neural networks and the CoordConv solution
作者及团队:Uber AI Lab
会议及时间:NeurlPS 2018
code(原作者): https://github.com/uber-research/CoordConv
code: https://github.com/mkocabas/CoordConv-pytorch

1.主要贡献

但凡涉及像素或空间表示的任何问题,直觉都认为卷积神经网络可能是合适的。所以作者揭示并分析了卷积神经网络在变换两种空间表征(笛卡尔空间坐标 ( i , j ) (i, j) (i,j)和 one-hot 像素空间坐标)时的常见缺陷,通过看似简单的坐标变换问题:只是需要学习坐标 ( x , y ) (x, y) x,y在笛卡尔空间与坐标在 one-hot像素空间之间的映射,就证明了卷积网络在这个任务上的缺陷。

  • 提出CoordConv,该解决方案通过使用额外的坐标通道使卷积访问其自身的输入坐标而起作用;
    在不牺牲普通卷积的计算和参数效率的情况下,CoordConv允许网络根据最终任务的要求学习完整的平移不变性或不同程度的平移依赖性。 CoordConv用完美的泛化方法解决坐标变换问题,比卷积少10-100倍的参数,速度快150倍。

  • 这种卷积的无能在多大程度上潜伏在其他任务中,从而从内部隐蔽地妨碍了性能? 将卷积交换为CoordConv可以改进多种任务集上的模型。
    目标检测任务 中,在一个简单的检测空白背景中零散 MNIST 数字的问题中,他们发现,使用 CoordConv 时 Faster R-CNN 的 IoU 提升了大约 24%;
    图像分类任务 中,当添加一个 CoordConv 层到 ResNet-50 的底层并在 ImageNet 上训练时,发现仅有小量的提高;
    生成模型任务 中,在诸如 GAN 和 VAE 的生成式模型中,在GAN中使用CoordConv可以减少模式崩溃,加入 CoordConv 后,几何变换变得更加平滑,包括平移和变形;
    强化学习(RL) 中,玩Atari游戏的域代理从CoordConv层的使用中获益良多。

Contributions

  1. 定义了一个简单的toy Not-so-Clevr 数据集,它由随机放置在画布上的正方形组成;
  2. 定义CoordConv操作,该操作允许卷积过滤器通过添加额外的硬编码输入通道(包含卷积过滤器看到的数据坐标)来知道它们在笛卡尔空间中的位置。该操作可以通过Tensorflow的几行额外代码来实现;
  3. 检查坐标转换问题,从最简单的场景开始,以最复杂的场景结束。(尽管对toy问题的结果通常应该持一定程度的怀疑态度,但从小处着手可以查明问题所在,探索和理解细节)

设想一个简单的任务——监督渲染,在该任务中,给出一个 ( i , j ) (i, j) (i,j) 位置作为网络的输入,使其生成一个 64 × 64 64\times 64 64×64 的图像,并在确定位置绘有一个正方形,如图 1第二行所示:
在这里插入图片描述

2. Not-so-Clevr dataset

Not-so-Clevr 数据集是Sort-of-CLEVR的单对象灰度版本,它本身是渲染3D形状的Clevr数据集的简单版本。 请注意,一系列Clevr数据集通常用于有关关系和视觉问题解答的研究,但是在这里将它们用于监督学习和生成模型。 Not-so-Clevr 由放置在 64 × 64 64 \times 64 64×64画布上的 9 × 9 9 \times 9 9×9个正方形组成。 限制正方形位置,以使整个正方形位于 64 × 64 64 \times 64 64×64网格内,以便正方形中心落在 56 × 56 56\times 56 56×56的可能较小范围内。枚举这些可能的中心位置将得到一个包含3136个示例的数据集。 对于每个示例正方形 i i i,数据集包含三个字段:

  • C i ∈ R 2 C_i \in R^2 CiR2,其中心位置在 ( x , y ) (x,y) (x,y)笛卡尔坐标
  • P i ∈ R 64 × 64 P_i \in R^{64\times64} PiR64×64,中心像素的 one-hot 表示
  • I i ∈ R 64 × 64 I_i \in R^{64\times64} IiR64×64, 在画布上绘制的 64 × 64 64 \times 64 64×64正方形图像的结果

为评估模型的泛化能力,定义两种训练/测试分割:

  • 一种是均匀分割,即将所有可能的中心区域随机分为训练集和测试集,二者的比例为 8:2;
  • 另一种是象限分割,即画布被分为四个象限:集中在前三个象限中的小方块被放入训练集,最后一个象限中的小方块被放入测试集。

两种数据集分割方法的分布见下图:
在这里插入图片描述

3. CoordConv

卷积是等变的,意味着当每个滤波器被应用于输入以产生输出时,它并不知道每个滤波器的位置。我们可以通过让滤波器了解自己的位置来帮助卷积。为此,我们在输入中添加了两个通道——一个 i i i 坐标,一个 j j j 坐标。将由此产生的层称为 CoordConv,如下图所示:
在这里插入图片描述
CoordConv层可以实现为标准卷积的简单扩展,其中实例化了额外的通道并填充了(恒定,未经训练的)坐标信息,然后将它们按通道级联到输入表示形式并应用了标准卷积层。图3描述了将两个坐标 i i i j j j 相加的操作。

允许卷积滤波器观察到坐标会破坏平移等变性,这似乎是个坏主意。平移等变性不是卷积的标志性优势吗?我们认为,卷积获得成功的重要因素有三:使用的学习参数相对较少;在现代 GPU 上计算速度快;学习了平移等变性函数。CoordConv 层保留了前两个属性——参数较少和计算效率高,并且它的等变程度也可以学习。如果坐标中的权重学习为零,CoordConv 的表现将与标准卷积一样。另一方面,如果平移依赖对下游任务有用,那它也能学习这个。

具体而言, i i i 坐标通道是一个 h × w h\times w h×w 矩阵,其第一行填充为0,第二行填充为1,第三行填充为2,依此类推。 j j j 坐标通道类似,但列填充为常数值而不是行。在所有实验中,对 i i i j j j 坐标值都进行最终的线性缩放,以使它们落在 [ − 1 , 1 ] [-1,1] [1,1]。对于二维卷积,两个 ( i , j ) (i,j) i,j坐标足以完全指定一个输入像素,但是如果需要,还可以添加其他通道以使模型偏向于学习特定的解决方案。在随后的一些实验中,作者还为 r r r 坐标使用了第三条通道,其中 r = ( i − h / 2 ) 2 + ( j − w / 2 ) 2 r = \sqrt{(i-h/2)^2+(j-w/2)^2} r=(ih/2)2+(jw/2)2

  • Number of parameters:
    忽略 bias 参数,具有核大小为 k × k k \times k k×k c c c 个输入通道, c 0 c_0 c0个输出通道的标准卷积层,权重参数量是 c ⋅ c 0 ⋅ k 2 c\cdot c_0 \cdot k^2 cc0k2,而相应的 CoordConv 层将包含 ( c + d ) ⋅ c 0 ⋅ k 2 (c + d) \cdot c_0 \cdot k^2 (c+d)c0k2权重,其中 d d d 是使用的坐标尺寸的数量(例如2或3)。
  • Translation invariance:
    具有通过初始化或学习为零设置的权重连接到输入坐标的CoordConv将是平移不变的,因此在数学上等效于普通卷积。 如果权重不为零,则该函数将包含某种程度的转换依赖性,理想情况下,其精确形式将取决于要解决的任务。 类似于具有非共享权值的局部连接层,CoordConv允许学习的转换依赖,但相比之下,它需要的参数要少得多:对于空间输入大小 h × w h\times w h×w ( c + d ) c ′ k 2    v s .    h w c c ′ k 2 (c + d)c^{'}k^2\ \ vs.\ \ hwcc^{'}k^2 (c+d)ck2  vs.  hwcck2。 请注意,所有CoordConv权重,甚至是坐标权重,都在所有位置上共享,因此平移依赖性仅来自于坐标规范; 结果是,与普通卷积一样,但与局部连接层不同的是,如果适当的坐标被外推,那么运算可以扩展到原始的空间域之外。

4. Supervised Coordinate tasks

4.1 Supervised Coordinate Classification

原本以为 CNN 可以轻而易举地完成该任务,因为第一,这一任务如此简单(整个数据集可能只需要两行 Python 代码就能生成,如论文所示),第二,这个数据集如此之小,可以轻易使用过参数化的模型。但结果表明,CNN 的表现令人大跌眼镜。
在这里插入图片描述
图5显示了训练集和测试集预测的总和,直观地显示了卷积模型的记忆和缺乏泛化。
在这里插入图片描述
与之形成鲜明对比的是,CoordConv模型在数据分割上都能获得完美的性能,而且只需要7.5k参数,只需10-20秒。参数的简捷性进一步证实了它们是更适合于坐标变换任务的模型。

图S3展示了用CoordConv学习到的概率质量有多精确和光滑,而用Deconv则没有那么多。首先展示logits的完整的 64 × 64 64\times 64 64×64 map,接着展示了softmax的结果和Target(图中红色框)。
在这里插入图片描述
其中Deconv中第一个像素(顶行)是训练集中的结果,如预期那样模型有比较正确的预测,虽然在目标像素外还是存在一些概率。下一个像素(第二行偏右)在测试集中也是正确的,但因为目标的周围像素捕获了相差不大的概率,所以模型仅仅只是勉强正确。而最后的像素(底第三行偏右)则是完全错误的。同时可以看到CoordConv的结果展示,是平滑的,而且预测的比较准确。

4.2 Supervised Coordinate Regression

表1 中描述了在监督坐标回归任务中应用的精确架构。
在这里插入图片描述

4.3 Supervised Rendering

在单像素坐标变换领域之外,比较了convolutional和CoordConv网络在监督渲染任务上的性能,该任务要求网络生成一个以给定(x;y)的位置。图6所示,观察到convolution和CoordConv之间同样的鲜明对比。即使参数高达 1M 且训练时间超过 90 分钟的模型(图6 右图)也无法在均匀分割的测试集上获得 0.83 以上的 IOU,或在象限分割上获得 0.36 以上的 IOU(图6 左图)。
在这里插入图片描述
在这里插入图片描述

5 Applicability to other tasks

将Conv交换为CoordConv可以改进多种模型——包括ResNet-50、更快的R-CNN、GANs、VAEs和RL模型。

  1. Image Classification
    对于要求简单的平移不变性的任务,CoordConv在图像分类测试中帮助不大。添加一个额外的带有8个输出通道的11个CoordConv层可以提高ResNet-50[9]的前5级精度,平均每处理5次提高0.04%;然而,这种差异在统计学上并不显著。CoordConv至少不会影响性能,因为它总是可以学会忽略坐标。
    在这里插入图片描述

  2. Object Detection
    在目标检测中,模型查看像素空间并在其中输出边界框笛卡儿空间。这就产生了一个自然的坐标转换问题,使得CoordConv看起来是一个自然的匹配。在检测分散在画布上的MNIST数字的一个简单问题上,我们发现使用CoordConv时,更快的R-CNN网络的相交-合并测试(IOU)提高了24%。
    在这里插入图片描述
    在这里插入图片描述

  3. Generative Modeling
    模式崩溃可以发生在许多维度中,包括那些与内容、样式或场景组件位置有关的维度。假设位置的模式崩溃可能是由于很难直接学习从包含坐标信息的高级潜在空间到像素空间的转换,使用CoordConv可以提供帮助。
    首先,研究了一个简单的任务,即使用GANs和VAEs生成具有所有可能几何位置的彩色图形。然后,通过Horovod的分布式训练,利用DCGAN将问题扩展到大规模场景理解(LSUN)卧室场景。

    使用GANs生成简单的彩色对象,图7a-d显示了采样后的图像和模型折叠分析。观察到,卷积型GAN将二维分布折叠为一维流形。相应的CoordConv GAN模型使用7%的conv GAN参数生成的对象能够更好地覆盖二维笛卡尔空间。
    在这里插入图片描述
    有了LSUN后,样品如图7e所示,更多见附录中S7.3节信息。观察到(1)从每个模型中随机抽取具有定性可比性的样本,(2)潜在空间插值时的几何平移行为。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  4. Reinforcement Learning
    在A2C中的actor网络中添加CoordConv层会对一些游戏产生显著的改进,但不是全部,如图8所示。
    在这里插入图片描述
    还尝试将CoordConv添加到我们自己的分布式优先体验重放(Ape-X)实现中,但是没有注意到任何区别。
    在这里插入图片描述

6. CoordConv layer Code

from tensorflow.python.layers import base
import tensorflow as tf
class AddCoords(base.Layer):
	"""Add coords to a tensor"""
	def __init__(self, x_dim=64, y_dim=64, with_r=False):
		super(AddCoords, self).__init__()
		self.x_dim = x_dim
		self.y_dim = y_dim
		self.with_r = with_r
		
	def call(self, input_tensor):
		"""
		input_tensor: (batch, x_dim, y_dim, c)
		"""
		batch_size_tensor = tf.shape(input_tensor)[0]
		xx_ones = tf.ones([batch_size_tensor, self.x_dim],dtype=tf.int32)
		xx_ones = tf.expand_dims(xx_ones, -1)
		xx_range = tf.tile(tf.expand_dims(tf.range(self.y_dim), 0),[batch_size_tensor, 1])
		xx_range = tf.expand_dims(xx_range, 1)
		xx_channel = tf.matmul(xx_ones, xx_range)
		xx_channel = tf.expand_dims(xx_channel, -1)
		yy_ones = tf.ones([batch_size_tensor, self.y_dim],dtype=tf.int32)
		yy_ones = tf.expand_dims(yy_ones, 1)
		yy_range = tf.tile(tf.expand_dims(tf.range(self.x_dim), 0),[batch_size_tensor, 1])
  • 6
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值