《Conditional Image Generation with PixelCNN Decoders》之Pixcel CNN---gated Pixcel CNN 阅读笔记

   最近在看Generative models,Aaron courville的lecture 资料中提到了pixcel RNN,但是由于其必须逐一提取当前像素点的信息(从左到右、从上到下),虽然效果好,但是速度太慢了;进而将model中的RNN装换成CNN,从而有了Pixcel CNN,但是该model的问题是Blind spot 和效果没有Pixcel RNN 好;进而提出改进模型 gated Pixcel CNN model,引入了两种stack方式:horizontal stack and vertical stack。并在此基础上进行了一些小 trick的实验。具体如下:

转载原文:图片生成模型-gated Pixcel CNN

google DeepMind团队在《pixel recurrent neural networks》中提出了pixelRNN/CNN之后又发表了一篇论文——《Conditional Image Generation with PixelCNN Decoders》——这篇论文中提出了一个基于pixelRNN/CNN上进行改进的一个模型——gated pixelCNN。 gated pixelCNN依旧还是一个图片生成模型。它基于对像素点的概率分布进行建模,训练好模型之后,只要给这个模型一组描述性的向量(这些向量可以是一组具有描述性的标签,也可以是基于其他网络生成的特征信息),gated pixelCNN就可以生成大量的有变化的图片。 ———-

图片生成模型

生成模型是一种训练模型进行无监督学习的模型,给模型一组数据,希望从数据中学习到信息后的模型能够生成一组和训练集尽可能相近的数据。 图片生成模型就是更具体的指向说给模型一组图片作为训练集让模型进行学习,希望模型生成一组和训练集图片尽可能相近的图片。 下图是从斯坦福的课程上截下来的图:

图中可以看到图片生成模型更直观的理解就是要让生成的图片的像素点的联合分布和训练集的图片像素点的联合分布相近。 具体来说,图像生成模型又可以根据模型对像素点分布的预测情况进一步细分。

其中当下最流行的三种图片生成器模型当属:pixelRNN/CNN、VAE、GAN。

-**自回归模型**:auto regressive models,代表模型pixelRNN/CNN

-**变化自编码器**:VAE(variational auto encoder),一种概率图形模型,建模过程就是要达到数据的对数似然最大化的下限。过程中包括encode过程(将图片信息压缩)和decode过程(将压缩后的信息作为输入,进行图片再生成)

-**生成对抗网络**:GAN(generative adversarial network),生成两个网络,分别是生成器网络和判别式网络来联合进行建模                                                                     

pixelRNN/CNN

怎么想

现在需要构建一个模型来实现生成一张图片,那么最简单的想法就是一个像素点一个像素点的进行生成,同时将前面生成的像素点作为参考。相当于将预测一张图上所有像素点的联合分布转换为对条件分布的预测。

                                                             

这里的x i 就是指在i 处的像素点。

怎么做

既然是用已经预测得到的像素来预测当前点的像素,自然能够想到其实这就是对一组有顺序的序列的预测,那么就应该可以想到用RNN来建模。因此这个模型就叫pixelRNN。 在pixelRNN中用了12个两维LSTM层。 在《pixel recurrent neural networks》这篇论文中,作者提到了用两种方式来构建不同的pixelRNN,由于本文是对gated pixelCNN进行梳理,所以这里就不对pixelRNN进行展开说明。

怎么改

由于使用了RNN模型,所以pixel RNN的训练时间特别长,需要对模型进行改进。作者又考虑到这是对图像进行处理,那为什么不可以使用 CNN来进行建模呢?用CNN构建出来的模型叫pixelCNN。 但是标准的卷积层会把所有像素的信息一次性进行提取,所以在pixelCNN中就是基于传统的CNN技术,用到masked convolutions以及去掉池化层来进行建模。

masked convolutions

这是一个5*5的掩膜卷积核。它的作用就是只保留中心点处之前的像素信息。
可以看到当要提取中心点的像素信息的时候,这个点的左边和前面的像素信息都得到了提取,右边和后面的像素信息被“遮盖”住了,而关于这个点的信息的提取论文中又提出了两种方式进行获取(这两种方式对应了mask A和mask B这两种掩膜方式)。

可以看到两种mask的区别就是在信息传递上RGB这三个通道中像素点信息是否传递给自己这一点上有不同。可以看到,maskA这种掩膜的传递方式是不传递给自己,maskB这种方式是信息要传递给自己。
这里还需要进行说明,为什么三个通道之间的传递关系是这样的,因为每个点的像素信息是由RGB这三个通道的值构成的,所以像素的信息传递不仅仅是基于前后的context的像素点信息的传递,还有自己的三个通道上面的值的一个传递。而按照RGB的位置顺序来说,R算是前面的信息,G属于中间的信息,B是后面的信息,所以在记录当前像素点的R通道上面的信息时就不能把后面的GB信息当作已知条件,同样的,在记录当前像素点的B通道上的信息时可以将RG两个通道上的信息当作已知条件。所以可以看到有这样的传递关系。
论文中提到,在pixelCNN中,只有在第一个卷积层上使用了maskA,后面所有的层上都是使用的maskB这种掩膜。

最左边的那一列是作者给出的关于pixelCNN的一个结构示意图。 由于pixelRNN它还是一个RNN,所以不管是生成图片的过程还是训练的过程,它都是以序列的形式在进行,所以速度较慢,而pixelCNN在训练的时候得益于卷积可以并行运算,所以训练时间较pixelRNN有提高,但是最后生成图片的效果没有pixelRNN的效果好。 最后论文中还构建了一个multi-scale version 的pixelRNN模型,这里也不展开多说。 ———-

gated pixelCNN

为什么要从pixelCNN到gated pixelCNN

gated pixelCNN是在pixelCNN上进行了某些改进的到的,为什么要进行这些改进主要有以下两个原因: 第一,从表现效果上面看,pixelCNN的速度虽然比pixelRNN快,但是模型的效果并没有它好,所以希望能够在pixelCNN的速度基础上通过某些改进提高模型最后的表现效果。 第二,pixelCNN存在“盲点”问题。在生成图像的时候因为使用了mask的原因,所以存在“盲点”的问题。下图中灰色的区域就是提取当前像素点的信息的时候存在的“盲点”。

(所谓的“盲点”就是指当前的像素值信息提取的过程中无论如何都不会包括到灰色区域的像素信息。)

怎么改

作者分别针对两个需要改进的方面提出了相应的解决方案:

表现效果

为什么pixel RNN的效果不错,可以推测是因为pixelRNN模型中每一个LSTM层都能够获取到之前像素的所有信息。
而在CNN中,随着卷积层的层数的增加,获取到的信息也在不断增多。
所以如果能够合理增加pixelCNN中的卷积层,那么有可能提高其表现效果。
另外一个方面,pixelRNN表现效果不错,是因为RNN可以对更复杂的结构进行建模。因为RNN模型结构中存在大量的单元(输入门、遗忘门、输出门),这些单元可以帮助模型的神经元之间有更加复杂的联系。所以,在对pixel CNN的改进工作中,可以将masked convolutions之间的简单线性链接单元换成和RNN中门与门之间的激活方式一样的连接方式:

                                                      
其中σ σ 是sigmoid激活函数,k是指这是第几层,⨀指元素之间的点乘运算,*指卷积运算
这样的单元相当于在pixelCNN中也引入了“门”的概念,这也是为什么改进之后的这个模型叫gated pixelRNN的原因。

“盲点”问题

要如何改进“blind spot”问题,论文中提到将两种卷积网络进行结合使用,论文中分别叫这两种卷积网络horizonal stack和vertical stack。
Horizonal stack是将当前像素所在的行(当然也是指当前像素之前的像素值)作为条件进行卷积,所以horizonal stack的卷积核的规格为1*n,在horizonal stack中仍然要使用掩膜技术来实现只提取前面的信息。
Vertical stack是将当前像素所在的行的前面所有行当作条件来进行卷积,由于vertical stack是对前面的信息进行提取,所以vertical stack中不进行掩膜操作。

将每一层的两种stacks的结果进行结合,就可以得到当前像素点的信息,这样就消除了“盲点”问题。

所以使用门的技术和更多的卷积层来提高pixelCNN的表现效果,使用horizonal stack和vertical stack结合的方式来解决“盲点”问题之后,就得到了论文最终想要的模型gated pixelCNN。

A single layer in the gated pixelCNN architecture

改后的gated pixelCNN的作用

论文中提到

这仍然是一个基于像素的概率分布进行预测的图像生成器(生成式模型)。

论文中还提到

只要给这个模型一组描述性的向量,就可以生成相应的图片。提供给模型的向量可以有两种:可以是一组描述性的标签;也可以是基于其他网络生成的向量。
这两种向量的生成效果具体来说的话,用ImageNet数据集中的分类标签(一组描述性的标签)进行生成图像,这个模型可以生成大量多变的真实场景,比如说动物、风景等等;如果是用由其它卷积网络中间生成的没见过的人脸照片(其他网络生成的向量)输入pixel CNN模型中,则可以生成这个人不同的表情、姿势等等的图片。

另外,论文中也提到

如果把门这种元件纳入条件pixelCNN中,则可以把这个条件pixelCNN当作图片自动编码器的解码器,可以使pixelCNN的性能达到和pixelRNN的性能一样好,但计算时间减小很多。

下面将对这三种情况进行具体的阐述:

unconditional gated pixelCNN

unconditional gated pixelCNN是指直接用gated pixelCNN生成图像。
gated pixelCNN本身还是一个基于像素的概率分布进行预测的图像生成器(生成式模型),所以gated pixelCNN仍然可以在训练好模型之后直接进行图片生成。在论文中作者在CIFAR-10这个数据集上训练了gated pixelCNN模型,并基于同一个数据集进行训练的生成模型进行了对比。

Table 1: Test set performance of different models on CIFAR-10 in bits/dim (lower is better), training performance in brackets.

这里的NLL值是指负对数似然的值,是用来衡量一个生成模型的总体效果的,这个值越小越好。
可以看到gated pixelCNN的效果已经在pixelCNN上得到了很大的提升,而且和pixel RNN的效果已经很接近了(虽然还是赶不上pixelRNN)。

Table 2: Performance of different models on ImageNet in bits/dim (lower is better), training performance in brackets.

可以看到,在ImageNet这个数据集上,可以看到gated pixel CNN的效果已经非常好了。

conditional gated pixelCNN

Gated pixel CNN作为一个条件图片生成器就是指,在预测像素点的概率的时候,添加一些先验信息来使生成的图片往我们想要的方向生成。上面提到的给模型一组向量来生成图片就是指作为conditional gated pixelCNN的作用。

                             
这里的h h就是我们给的一个先验信息,就是前面提到的那组“向量”。h 可以以两种方式提供给模型:一组描述性的标签;基于其他网络生成的向量。

(一) h 是a one-hot encoding that specifies a class

若h  是a one-hot encoding that specifies a class,也就是指一组描述性的标签的时候,gated pixel CNN可以准确的生成这个种类,同时生成这个种类在不同的地方摆出不同造型的图片。
更通俗的说h  只告诉模型要生成的东西是什么,不告诉模型这个东西在哪里的时候,训练好的模型会生成大量基于不同地点的图片。
更NB的地方是,作者指出,h 甚至可以直接是imagenet 这个数据集中1000类别里面的类别id,最后得到了大量的真实场景下的这些类别的图片。
在作者的实验中,作者训练pixelCNN生成了八种不同类型的动物图片,可以看到这些图片角度光线等等环境条件是不同的,但是场景相似。

Figure 3: Class-Conditional samples from the Conditional PixelCNN.

(二)h 是基于其他网络生成的向量

若h h是一个用由其它卷积网络中间生成的没见过的人脸信息,模型将会生成这个人在不同的场景下摆出不同姿势的新图片。
作者在训练过程中用Flicker这个数据集中的人脸图片来对gated pixelCNN进行训练,然后给模型一张不在整个训练集中的完全陌生的人脸信息给模型,最后模型生成了大量这个人的新图片。

Figure 4: Left: source image. Right: new portraits generated from high-level latent representation.

gated pixelCNN auto-encoder

最后Gated pixelCNN还可以在一个auto-encoder中用作一个强有力的图片decoder。
就像前面介绍VAE中介绍到的那样,一个auto-encoder由两部分组成,一个encoder一个decoder。
在将gated pixelCNN 用作一个auto-encoder的时候,encoder部分就是将输入的图片降维变成一个低纬度表示的特征,这个特征就是在前面conditional pixelCNN中提到的那个h h ,然后将这个h h 送入decoder中,将h h 进行重构,还原为原来的图片。Gated pixelCNN用作一个decoder的实质其实还是主要实现了conditional pixelCNN的功能,它将encoder中生成的h h 作为条件输入,尽可能的还原为原始图片。
在作者的实验中,作者在ImageNet上训练了一个gated pixelCNN auto-encoder,和使用MSE进行模型选择的convolutional auto-encoder,最后生成的图片效果如下:

Figure 6: Left to right: original image, reconstruction by an auto-encoder trained with MSE,conditional samples from a PixelCNN auto-encoder. Both auto-encoders were trained end-to-end with a m = 10-dimensional bottleneck and a m = 100 dimensional bottleneck.

最左边的这个张图是原图,中间的是用卷积auto-encoder生成的图片,右边的是gated pixel CNN生成的图片。可以看到,卷积auto-encoder是尽力去重构真实的图像,而gated pixelCNN在尽力去生成不同的但是相似的图像。


 

总结

最后作者对整个模型进行了一个总结,并提出了展望,作者指出,从前面的各种案例中可以看到,gated pixel CNN可以生成在不同光照条件下的图片,所以gated pixel CNN可以客服生成模型中训练集光照条件不好的问题。

猜你喜欢

转载自blog.csdn.net/Jasminexjf/article/details/82499513
今日推荐