说到计算机生成的图像肯定就会想到deep fake:将马变成的斑马或者生成一个不存在的猫。在图像生成方面GAN似乎成为了主流,但是尽管这些模型在生成逼真的图像方面取得了巨大成功,但他们的缺陷也是十分明显的,而且并不是生成图像的全部。自编码器(autoencoder)作为生成的图像的传统模型还没有过时并且还在发展,所以不要忘掉自编码器!
GAN 并不是您所需要的全部
当谈到计算机视觉中的生成建模时,几乎都会提到GAN 。使用GAN的开发了很多许多惊人的应用程序,并且可以在这些应用程序中生成高保真图像。但是GAN的缺点也十分明显:
1、训练不稳定,经常会出现梯度消失、模式崩溃问题(会生成相同的图像),这使得我们需要做大量的额外工作来为数据找到合适的架构。
2、GAN 很难反转(不可逆),这意味着没有简单的方法可以从生成的图像反推到产生这个图像的噪声输入。例如:如果使用可逆生成模型进行生成的图像的增强,可以直接获得生成图像的特定输入,然后在正确的方向上稍微扰动它这样就可以获得非常相似的图像,但是GAN做到这一点很麻烦。
3、GAN 不提供密度估计。也就是说可以生成图像但无法知道特定特征出现在其中的可能性有多大。例如:如果对于异常检测来说密度估计是至关重要的,如果有生成模型可以告诉我们一只可能的猫与一只不太可能的猫的样子,我们就可以将这些密度估计传递给下游的异常检测任务,但是GAN是无法提供这样的估计的。
自编码器 (AE) 是一种替代方案。它们相对快速且易于训练、可逆且具有概率性。AE 生成的图像的保真度可能还没有 GAN 的那么好,但这不是不使用他们的理由!
自编码器还没有过时
有人说:一旦 GAN 出现,自编码器就已经过时了。这在某种程度上是正确的, 但时代在进步GAN的出现让自编码器的发展有了更多的动力。在仔细地研究后人们已经意识到 GAN 的缺点并接受它们并不总是最适合的模型。,所以目前对自编码器继续进行更加深入的研究。
例如,一种被称为矢量量化变分自编码器 (Vector Quantized Variational AutoEncoder / VQ-VAE ) 的自回归 AE 声称可以生成与 GAN 的质量相匹配的图像,同时不会有 GAN 的已知缺点,例如模式崩溃和缺乏多样性等问题。
使用 VQ-VAE-2 生成多样化的高保真图像”(链接:arXiv:1906.00446)
在论文中,作者通过生成渔民图像将他们的 AE 模型与 DeepMind 的 BigGAN 进行了比较。可以看到 AE 生成的图像之间还是有多少变化的。
另外,在自编码器领域另一个令人兴奋的研究的例子是 VAE / GAN。这种混合模型使用 GAN 的鉴别器在典型的对抗训练中学到的知识来提高 AE 的生成能力。
“Autoencoding beyond pixels using a learned similarity metric”(arXiv:1512.09300)
在上图中作者使用他们的模型从学习的表示中重建一组图像,这是 GAN 无法做到的,因为GAN缺乏上面说过的的可逆性。从图上看重建看起来很不错。
虽然GAN很重要,但是自编码器还在以某种方式在图像生成中发挥作用( 自编码器可能还没被完全的开发),熟悉它们肯定是件好事。
在本文的下面部分,将介绍自编码器的工作原理、有哪些不同类型的自编码器以及如何使用它们。最后还将提供一些 TensorFlow 的代码。
使用自编码器进行表示学习
自编码器都是关于如何有效地表示数据的。他们的工作是找到一个高维输入的低维表示,在不损失内容的情况下重建原始输入。
从下图所示的quickdraw 数据集中获取“斧头”。图像为 28x28 灰度,这意味着它由 784 个像素组成。自编码器会找到从这个 784 维空间到 2D 空间的映射,这样压缩后的 ax 图像将仅由两个数字描述:地图上的 X 和 Y 坐标。接下来,仅知道 X-Y 坐标,自编码器将尝试仅从这两个值重建原始的 784 个像素。
自编码器学习其输入的低维度表示。
重建肯定不会是完美的,因为在压缩过程中不可避免地会丢失一些信息,但是我们的目标是希望它足以识别原始图像。在我们示例中的”地图“是有效表示数据的潜在空间。虽然我们使用 2D 进行说明,但实际上潜在空间通常会更大,但仍比输入图像小得多。
自编码器的工作是创建一个低维表示让它重建原始输入。这确保了这个潜在空间压缩了最相关的输入特征,并且没有噪声和对重建输入不重要的特征。
要点:自编码器的潜在空间压缩了现在相关的输入特征,并且没有噪声和冗余特征。
这个特点使得它在许多方面都具有吸引力。可以使用自编码器进行降维或特征提取(可以构建一个在数学上等同于主成分分析或 PCA 的自编码器,我们以前有个相应的文章,有兴趣的可以搜索参考)。所以可以在任何数据管道中用自编码器学习的低维度表示替换高维度数据。
自编码器还有许多其他应用。它们可用于对图像进行去噪:只需输入一张有噪声的图像,自编码器会重建原始的无噪声图像。它们还可用于自监督预训练,其中模型从大量未标记数据中学习图像特征,然后针对一小部分标记数据上的某些监督任务进行微调。最后自编码器可以用作生成模型,这将是本文的重点。
要点:自编码器可用于降维、特征提取、图像去噪、自监督学习和生成模型。
传统的自编码器 AE
这里使用 Google 游戏“Quick, Draw!”的玩家制作的手绘形状的 quickdraw 数据集构建一个简单的自编码器。为了方便演示, 我们将只使用三类图像:狗、猫和树。这是图像的示例。
如何构建一个自编码器呢?它需要由两部分组成:编码器,它接收输入图像并将其压缩为低维表示,以及解码器,它做相反的事情:从潜在表示产生原始大小的图像.
让我们从编码器开始。因为是处理图像所以在网络中使用卷积层。该模型将输入图像依次通过卷积层和最大池化层,以将它们压缩成低维表示。
代码语言:javascript复制encoder = tf.keras.models.Sequential([
tf.keras.layers.Reshape([28, 28, 1], input_shape=[28, 28]),
tf.keras.layers.Conv2D(
16, kernel_size=3, padding="same", activation="selu"
),
tf.keras.layers.MaxPool2D(pool_size=2),
tf.keras.layers.Conv2D(
32, kernel_size=3, padding="same", activation="selu"
),
tf.keras.layers.MaxPool2D(pool_size=2),
tf.keras.layers.Conv2D(
64, kernel_size=3, padding="same", activation="selu"
),
tf.keras.layers.MaxPool2D(pool_size=2)
])
这种特殊的架构基于 Aurélien Géron 在他的书中用于 FashionMNIST 数据集的架构(参见底部的来源)。这里使用 SELU 激活而不是 ReLU,是因为他比较新,效果也好