VQ-VAE-2论文的实现



我正在尝试构建一个2级VQ-VAE-2+PixelCNN,如论文所示:"用VQ-VAE-2生成多样化的高保真图像"(https://arxiv.org/pdf/1906.00446.pdf)。我有3个实现问题:

  1. 论文提到:

    我们允许层次结构中的每个级别分别依赖于像素。

我知道VQ-VAE-2中的第二个潜在空间必须以第一潜在空间和图像的下采样版本。这是正确的吗?

  1. 论文"PixelCNN解码器的条件图像生成"(https://papers.nips.cc/paper/6527-conditional-image-generation-with-pixelcnn-decoders.pdf)说:

    h是一个热编码,它指定了一个等价于在每一层添加一个类相关的偏差。

据我所知,条件是作为1D张量输入的,通过卷积注入到偏差中。现在,对于2阶段的条件PixelCNN,需要对类向量进行条件处理,但也需要对前一阶段的潜在代码进行条件处理。我看到的一种可能性是附加它们并提供一个3D张量。有人看到另一种方法吗?

  1. 损失和优化在两个阶段保持不变。只需将每个阶段的损失添加到经过优化的最终损失中。这是正确的吗

与论文的一位作者讨论后,我收到了所有这些问题的答案,并在下面分享了这些答案。

问题1

这是正确的,但图像的下采样是用跨步卷积实现的,而不是非参数调整大小。这可以作为编码器架构的一部分来吸收(每个变量后面的数字表示它们的空间昏暗,因此例如h64是[B,64,64,D]等等(。

h128 = Relu(Conv2D(image256, stride=(2, 2)))
h64 = Relu(Conv2D(h128, stride=(2, 2)))
h64 = ResNet(h64)

现在,为了获得h32和q32,我们可以做:

h32 = Relu(Conv2D(h64,  stride=(2, 2)))
h32 = ResNet(h32)
q32 = Quantize(h32)

通过这种方式,梯度一直流回到图像,因此我们在h32和image256之间具有相关性。

无论在哪里,您都可以使用1x1卷积来调整最后一个维度(特征层(的大小,使用跨步卷积进行下采样,使用跨步转置卷积进行上采样空间维度。因此,对于这个量化底层的例子,您需要首先在空间上对q32进行上采样,使其成为64x64,并将其与h64组合,然后将结果提供给量化器。为了增加表现力,我们在两者之间插入了一个剩余的堆栈。它看起来像这样:

hq32 = ResNet(Conv2D(q32, (1, 1)))
hq64 = Conv2DTranspose(hq32, stride=(2, 2))
h64 = Conv2D(concat([h64, hq64]), (1, 1))
q64 = Quantize(h64)

问题2

PixelCNN的原始论文还描述了如何使用卷积来使用空间条件。对类嵌入进行展平和附加作为全局条件不是一个好主意。你想做的是应用转置卷积来对齐空间维度,然后应用1x1卷积来将特征维度与pixelcnn的隐藏重复匹配,然后添加它。

问题3

单独训练他们是个好主意。除了隔离损失等并能够为每个阶段调整适当的学习率外,您还可以为每个阶段使用GPU/TPU的全部内存容量。这些先验在更大的范围内做得越来越好,所以最好不要否认这一点。

相关内容

  • 没有找到相关文章

最新更新