Tensorflow VQ-VAE-2文件的实现
我正在尝试构建一个2阶段的VQ-VAE-2+像素CNN,如论文所示: “使用VQ-VAE-2生成各种高保真图像”()。 我有3个实施问题:Tensorflow VQ-VAE-2文件的实现,tensorflow,autoencoder,Tensorflow,Autoencoder,我正在尝试构建一个2阶段的VQ-VAE-2+像素CNN,如论文所示: “使用VQ-VAE-2生成各种高保真图像”()。 我有3个实施问题: 该文件提到: 我们允许层次结构中的每个级别分别依赖于像素 我知道VQ-VAE-2中的第二个潜在空间必须 条件是第一个潜在空间和 图像的下采样版本。对吗 “使用PixelCNN解码器的条件图像生成”(Conditional Image Generation with PixelCNN Decoders)一文说: h是一个单键编码,它指定了一个与之等价的类 在
与论文作者之一讨论后,我收到了所有这些问题的答案,并在下面分享 问题1 这是正确的,但图像的下采样是通过跨步卷积实现的,而不是通过非参数调整大小。这可以作为编码器体系结构的一部分吸收到类似的内容中(每个变量后面的数字表示它们的空间尺寸,例如h64是[B,64,64,D]等等) 现在,为了获得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卷积将特征维度与像素CNN的隐藏重复匹配,然后添加它
问题3
分开训练他们是个好主意。除了隔离损失等,并能够为每个阶段调整适当的学习速率外,您还能够为每个阶段使用GPU/TPU的全部内存容量。这些前科在更大范围内做得越来越好,所以不要否认这一点是个好主意
hq32 = ResNet(Conv2D(q32, (1, 1)))
hq64 = Conv2DTranspose(hq32, stride=(2, 2))
h64 = Conv2D(concat([h64, hq64]), (1, 1))
q64 = Quantize(h64)