我试图建立一个2阶段的VAE 2+ PixelCNN,如论文所示:“用VAE 2生成多样化的高可信度图像”(https://arxiv.org/pdf/1906.00446.pdf)。我有三个执行问题:
本文提到的
我理解VAE 2中的第二个潜在空间必须以第一个潜在空间的级联和图像的下采样版本为条件。是这样吗?
据我所知,这个条件是以一维张量的形式进入的,它通过卷积注入到偏置中。现在对于一个2阶段的条件PixelCNN,需要对类向量施加条件,但也需要对前一阶段的潜在代码进行条件化。我看到的一种可能性是附加它们并提供一个三维张量。有没有人能找到其他方法来做到这一点?
,
发布于 2020-04-01 15:29:21
与论文作者之一讨论时,我收到了所有这些问题的答案,并在下面分享了这些问题。
问题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卷积将特征维与隐藏的像素表示匹配,然后再添加它。
问题3
把他们分开训练是个好主意。除了隔离损失等,并能够为每个阶段调整适当的学习速度,您还可以使用您的GPU/TPU的每个阶段的全部内存容量。这些前科做得越来越好,规模更大,所以最好不要否认这一点。
https://stackoverflow.com/questions/60884274
复制相似问题