论文精读-conditional pixelCNN-2016


Conditional Image Generation with PixelCNN Decoders

  • 杂志: NIPS
  • IF: None
  • 分区: None

Introduction

  1. 使用NN进行image modelling的研究众多,并且已经能够产生多样的图片。但实际应用中,我们一般需要conditioned on prior information。

  2. 本研究通过对PixelRNN【30】进行改进,加入卷积来实现conditional image modelling,使用的是自回归的方法,并且有明确的概率密度估计。

    原始文献【30】中的pixelRNN和pixelCNN有着不同的缺点:pixelRNN更加准确,但很慢;pixelCNN更快,但估计不如RNN准确。

    本研究提出了Gated PixelCNN,既能够有准确的估计,而且速度也有保障。

  3. 另外,本研究还提出了Gated PixelCNN的conditional版本,能够根据一些条件、标签了生成图像。

Methods


PixelCNN

上图展示了pixelCNN的基本原理,基本来说,还是遵循了AR模型的假设,需要逐个对像素点进行条件概率建模,其依赖于其前面的像素点。

pixelCNN在此基础上使用masked CNN来进行建模,其卷积核如上图middle所示。每个位置上,先建模R、然后是G、最后是B。最后使用256-softmax来输出一个像素值的概率。所以pixelCNN输入\(N\times N\times3\),输出\(N\times N\times3\times256\)

进行采样时,和传统的AR模型一样,逐个pixel的生成。

但pixelCNN有下面的缺点:

  • 相比于pixelRNN来说,其效果较差。

    这可能是因为pixelCNN相对于pixelRNN来说,其所能访问的像素点范围是随着NN的深度线性增加的,所以当网络不够深时,其无法向pixelRNN一样访问到之前所有的像素点。

    另外,pixelCNN缺乏multiplicative units(LSTM中的门控单元),这些units将有助于构建更加复杂的关系。

  • 盲点。

    如上图右上方所示,当使用3x3卷积的时候,随着卷积的增加,进行某个像素点的概率估计的时候,有一部分内容是看不到的,是blind spot。如果有重要的信息在此,可能会影响模型的训练。

Gated PixelCNN

本研究针对上面两个问题,进行了如下的改进:

  • 每一层将relu替换为gated units,从而增加multiplicative units,增加NN的拟合能力:

    \[\mathbf{y}=tanh(W_{k,f}\star\mathbf{x})\odot\sigma(W_{k,g}\star\mathbf{x})\]

    其中,\(\odot\)表示element-wise product,\(\star\)表示convolution,后面的是gated,使用tanh替代relu。gated units可以形成类似highway networks的效果,从而有助于模型的效能提升。

  • 针对blind spot的问题,我们使用两个convolutional network的stacks来解决这个问题:其中一个用来聚合像素点上面的行的信息(vertical stack),另一个用来聚合像素点所在行前面的像素点的信息(horizontal stack)。如果上图右下角所示,而下图展示了单层的设计:


    注意:

    • 每一层接受两个输入,必须输出两个结果,分别是horizontal stack和vertical stack。horizontal stack的输出将作为下一层horizontal stack的输入,vertical stack的输出也将作为下一层vertical stack的输入。

    • 实现两个stack,可以使用mask(上图是\(n\times n\)\(1\times n\)的卷积核,说明使用了masked),也可以使用正常的长方形卷积进行,然后通过padding、cropping和shifting来进行调整,使其卷积得到的信息是提供给我们想要的pixel。

      在我看来,就算是使用mask,也必须配合shift(在最后一层进行)才行。

    • horizontal stack的输出可以来自混合了horizontal stack和vertical stack的信息,这并没有破坏AR的conditional rules。

    • 但vertical stack的输出不得混合horizontal stack的信息,这将破坏conditional rules。

Conditional PixelCNN

所以现在我们需要建模的分布是:

\[p(x|\mathbf{h})=\prod_{i=1}^{n^2}{p(x_i|x_1,\dots,x_{i-1},\mathbf{h})}\]

这个通过在每一层都加入\(\mathbf{h}\)的信息来实现:

\[\mathbf{h}=tanh(W_{k,f}\star\mathbf{x}+V_{k,f}^T\mathbf{h})\odot\sigma(W_{k,g}\star\mathbf{x}+V_{k,g}^T\mathbf{h})\]

这里认为\(\mathbf{h}\)表示的是图像中有什么物体出现或者出现的内容,但并不指定物体的位置等等,所以其不包含位置信息。

如果想要进行\(\mathbf{h}\)包含位置信息的建模,可以使用下面的模型:

\[\mathbf{h}=tanh(W_{k,f}\star\mathbf{x}+V_{k,f}\star\mathbf{s})\odot\sigma(W_{k,g}\star\mathbf{x}+V_{k,g}\star\mathbf{s})\]

其中\(\mathbf{s}=m(\mathbf{h})\)\(m\)是一个deconvolution,\(s\)是一个长宽和\(\mathbf{x}\)相同的特征图,\(V\)\(1\times1\)卷积。

PixelCNN AE

对传统的AE进行修改,将decoder部分改变为conditional PixelCNN,其接受的\(\mathbf{h}\)是encoder的输出。

Results

Unconditional Modeling

首先是在CIFAR-10上的结果:


之后在Imagenet上的结果(20 layers、每个layers有384个hidden、kernel size是5x5、batch size是128):


Conditioning on ImageNet


Conditional on Portrait Embeddings



PixelCNN AE


Conclusion

其实从上面的结果来看,即使在32x32的图片上,实际效果也着实一般。但总归是有提高的。

未来的一个思路是使用PixelCNN替代VAE的Gaussian,从而提高VAE的性能。

实际上,后来的VQ-VAE就是通过以上的方案实现的。


Questions

  1. 现在因为有3个染色通道,怎么序列的进行r、g、b的建模的?
  2. 很多细节需要在代码中才比较好理解...

文章作者: Luyiyun
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Luyiyun !
评论
评论
  目录