作者:Augustus Odena, Vincent Dumoulin, Chris Olah
来源:distill.pub
译者:刘小芹
原文链接:消除 Artifact,用缩放卷积神经网络生成高清图像(TensorFlow 代码)
本文为新智元授权转载,严禁二次转载。
【新智元导读】非常仔细地观察神经网络生成的图像时,经常会看到一些奇怪的棋盘格子状的伪影(棋盘效应,checkboard artifacts)。本文作者讨论了棋盘效应出现的原因以及反卷积难以避免棋盘效应的原因,最后作者提出了一种避免棋盘效应的替代方法(缩放卷积),并提供了在TensorFlow上实现的代码。
当我们非常仔细地观察神经网络生成的图像时,经常会看到一些奇怪的棋盘格子状的伪影(artifact)。这种现象有些情况下比其他情况更明显,但最近的模型很多都会出现这种现象。
不可思议的是,这些棋盘图案在颜色深的图像中最突出。这是怎么回事?神经网络讨厌明亮的颜色吗?这些伪影出现的实际原因其实非常简单。
当我们用神经网络生成图像时,我们经常从低分辨率、高阶描述中构建图像。这会让网络先描绘粗糙的图像,再填充细节。
因此,我们需要能让图像从较低分辨率达到较高分辨率的方法。我们通常使用反卷积操作。大致来说,反卷积层允许模型使用小图像中的每个点来“绘制”更大的图像中的方块。
【译注:反卷积有许多解释和不同的术语,包括“转置卷积”(transposed convolution);为了简洁起见,本文使用“反卷积”(deconvolution),有关反卷积的更多讨论参见:Dumoulin & Visin, 2016 and Shi, et al., 2016a.】
但是,反卷积很容易“不均匀重叠”(uneven overlap),使图像中某个部位的颜色比其他部位更深(Gauthier, 2015)。尤其是当核(kernel)的大小(输出窗口的大小)不能被步长(stride)整除时,反卷积就会不均匀重叠。虽然原则上网络可以仔细地学习权重来避免这种情况,但在实践中神经网络很难完全避免不均匀重叠。
(注:在原文网站上可以调节图示的大小(size)和步长(stride)更直观地理解,下同)
重叠图案也在二维中形成。两个轴上的不均匀重叠相乘,产生不同亮度的棋盘状图案。
事实上,不均匀重叠往往在二维上更极端!因为两个模式相乘,所以它的不均匀性是原来的平方。例如,在一个维度中,一个步长为2,大小为3的反卷积的输出是其输入的两倍,但在二维中,输出是输入的4倍。
现在,生成图像时,神经网络通常使用多层反卷积,从一系列较低分辨率的描述中迭代建立更大的图像。虽然这些堆栈的反卷积可以消除棋盘效应,但它们经常混合,在更多尺度上产生棋盘效应。
步长为1的反卷积层——通常被认为是成功的模型中的最后一层(eg. Salimans et al., 2016)——在减轻棋盘效应方面非常有效。它们可以消除频率整除其大小的棋盘效应,也可以减少其他频率小于其大小的棋盘效应。但是,棋盘效应仍然会发生,就像最近的模型出现的。
除了我们在上文观察到的高频棋盘状伪影外,早期的反卷积可以产生较低频率的伪影,我们将在后文更详细地探讨。
不均匀重叠虽然是有效的框架,也可以说它是一种简单化。无论好坏,模型要为它们的反卷积学习权重。
理论上,模型可以学习仔细地写入不均匀重叠的位置,以使输出均匀平衡。
这种平衡行为的实现相当棘手,尤其是当模型有多个交互通道时。避免棋盘效应会显著限制可能的过滤器,牺牲模型容量。在实践中,神经网络很难学习完全避免这些模式。
事实上,不仅具有不均匀重叠的模型不会学习避免这种情况,而且均匀重叠的模型也经常学习会导致类似的棋盘效应的核!虽然对它们来说这不是默认的行为,不像不均匀重叠模型。但均匀重叠反卷积仍然非常容易产生棋盘效应。
最好的情况下,反卷积非常脆弱,因为它非常容易呈现人工创造的功能。最坏的是,产生棋盘效应是反卷积的默认行为。
那么,是否有一种不同的上采样(upsample)方法能更好地阻止棋盘效应?
为了避免棋盘效应,我们想要一个常规反卷积的代替方法。与反卷积不同,这种上采样方法默认不应发生棋盘效应。理想情况下,它会进一步对抗这些棋盘效应。
方法之一是确保反卷积核的大小可以被步长整除,从而避免重叠问题。这等价于最近成功用于图像超分辨率解析的技术“子像素卷积”(sub-pixel convolution) (Shi, et al., 2016b)。但是,尽管这种方法有效,但反卷积仍然容易产生棋盘效应。
另一种方法是将上采样分离为较高分辨率的卷积到计算特征。例如,您可以调整图像大小(使用最近邻居插值或双线性插值),然后进行卷积层。这似乎是一个自然的方法,大致类似的方法在图像超分辨率(例如,Dong,et al。,2015)中工作良好。
另一种方法是从卷积操作中分离出对卷积后更高分辨率的特征图上采样来计算特征。例如,可以先缩放图像(最近邻插值或双线性插值),再卷积。这似乎是自然的方法。
反卷积与缩放卷积(resize-convolution)方法都是线性操作,并可用矩阵去解释。对于每个输出窗口,反卷积操作的输入唯一,缩放卷积会以阻碍高频棋盘效应的方式来隐式地集中权重(weight-tying)。
代码:
在TensorFlow实现缩放卷积可以使用以下代码:tf.image.resize_images()
为了得到最好的结果,在用 tf.nn.conv2d() 做卷积前可以用 tf.pad() 避免边界效应。
用反卷积的常规方法生成图像(尽管这种方法非常成功 ),仍然存在一些概念上非常简单的问题,使得在生成的图像中出现棋盘效应。使用没有这些问题的替代方法可以消除棋盘效应。
我们提供了一个易用的解决方案,提高了用神经网络生成图像的质量。我们期待看到这种方法会被怎样使用,以及它是否能对音频之类的领域有所帮助,这类领域中的高频伪影是尤其棘手的问题。
【译注:原文标题是Deconvolution and Checkerboard Artifacts,本文中”Checkerboard Artifact “翻译成“棋盘效应”,“Artifact”视情况翻译成“棋盘效应”或“伪影”。】
参考文献: