这篇论文中提出了一个基于pixelRNN/CNN上进行改进的一个模型——gated pixelCNN。 gated pixelCNN依旧还是一个图片生成模型。它基于对像素点的概率分布进行建模,只要给这个模型一组描述性的向量(这些向量可以是一组具有描述性的标签,gated pixelCNN就可以生成大量的有变化的图片。 ———-
图片生成模型
生成模型是一种训练模型进行无监督学习的模型,希望从数据中学习到信息后的模型能够生成一组和训练集尽可能相近的数据。 图片生成模型就是更具体的指向说给模型一组图片作为训练集让模型进行学习https://img-,图像生成模型又可以根据模型对像素点分布的预测情况进一步细分。 ![generative models的分类](blog.csdn.net/20180129103934889?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlrZV9yZWQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 其中当下最流行的三种图片生成器模型当属:pixelRNN/CNN、VAE、GAN。 -**自回归模型**:auto regressive models,一种概率图形模型,进行图片再生成) -**生成对抗网络**:GAN(generative adversarial network),分别是生成器网络和判别式网络来联合进行建模 ———-
pixelRNN/CNN
怎么想
现在需要构建一个模型来实现生成一张图片,同时将前面生成的像素点作为参考。相当于将预测一张图上所有像素点的联合分布转换为对条件分布的预测。
这里的xixi就是指在ii处的像素点。
怎么做
既然是用已经预测得到的像素来预测当前点的像素,那么就应该可以想到用RNN来建模。因此这个模型就叫pixelRNN。 在pixelRNN中用了12个两维LSTM层。 在《pixel recurrent neural networks》这篇论文中,由于本文是对gated pixelCNN进行梳理,所以pixel RNN的训练时间特别长,那为什么不可以使用 CNN来进行建模呢?用CNN构建出来的模型叫pixelCNN。 但是标准的卷积层会把所有像素的信息一次性进行提取,用到masked convolutions以及去掉池化层来进行建模。
masked convolutions
这是一个5*5的掩膜卷积核。它的作用就是只保留中心点处之前的像素信息。
可以看到当要提取中心点的像素信息的时候,右边和后面的像素信息被“遮盖”住了,maskA这种掩膜的传递方式是不传递给自己,为什么三个通道之间的传递关系是这样的,所以像素的信息传递不仅仅是基于前后的context的像素点信息的传递,R算是前面的信息,B是后面的信息,同样的,在pixelCNN中,后面所有的层上都是使用的maskB这种掩膜。
可以看到两种mask的区别就是在信息传递上RGB这三个通道中像素点信息是否传递给自己这一点上有不同。可以看到,maskB这种方式是信息要传递给自己。
这里还需要进行说明,因为每个点的像素信息是由RGB这三个通道的值构成的,还有自己的三个通道上面的值的一个传递。而按照RGB的位置顺序来说,G属于中间的信息,所以在记录当前像素点的R通道上面的信息时就不能把后面的GB信息当作已知条件,在记录当前像素点的B通道上的信息时可以将RG两个通道上的信息当作已知条件。所以可以看到有这样的传递关系。
论文中提到,只有在第一个卷积层上使用了maskA,所以不管是生成图片的过程还是训练的过程,所以速度较慢,所以训练时间较pixelRNN有提高,这里也不展开多说。 ———-
gated pixelCNN
为什么要从pixelCNN到gated pixelCNN
gated pixelCNN是在pixelCNN上进行了某些改进的到的,从表现效果上面看,但是模型的效果并没有它好,pixelCNN存在“盲点”问题。在生成图像的时候因为使用了mask的原因,可以推测是因为pixelRNN模型中每一个LSTM层都能够获取到之前像素的所有信息。
而在CNN中,获取到的信息也在不断增多。
所以如果能够合理增加pixelCNN中的卷积层,pixelRNN表现效果不错,这些单元可以帮助模型的神经元之间有更加复杂的联系。所以,可以将masked convolutions之间的简单线性链接单元换成和RNN中门与门之间的激活方式一样的连接方式:
其中σσ是sigmoid激活函数,�8�6指元素之间的点乘运算,这也是为什么改进之后的这个模型叫gated pixelRNN的原因。
“盲点”问题
要如何改进“blind spot”问题,论文中分别叫这两种卷积网络horizonal stack和vertical stack。
Horizonal stack是将当前像素所在的行(当然也是指当前像素之前的像素值)作为条件进行卷积,在horizonal stack中仍然要使用掩膜技术来实现只提取前面的信息。
Vertical stack是将当前像素所在的行的前面所有行当作条件来进行卷积,所以vertical stack中不进行掩膜操作。
将每一层的两种stacks的结果进行结合,这样就消除了“盲点”问题。
所以使用门的技术和更多的卷积层来提高pixelCNN的表现效果,就得到了论文最终想要的模型gated pixelCNN。
改后的gated pixelCNN的作用
论文中提到
这仍然是一个基于像素的概率分布进行预测的图像生成器(生成式模型)。
论文中还提到
只要给这个模型一组描述性的向量,用ImageNet数据集中的分类标签(一组描述性的标签)进行生成图像,比如说动物、风景等等;如果是用由其它卷积网络中间生成的没见过的人脸照片(其他网络生成的向量)输入pixel CNN模型中,论文中也提到
如果把门这种元件纳入条件pixelCNN中,可以使pixelCNN的性能达到和pixelRNN的性能一样好,所以gated pixelCNN仍然可以在训练好模型之后直接进行图片生成。在论文中作者在CIFAR-10这个数据集上训练了gated pixelCNN模型, training performance in brackets.
这里的NLL值是指负对数似然的值,这个值越小越好。
可以看到gated pixelCNN的效果已经在pixelCNN上得到了很大的提升, training performance in brackets.可以看到,可以看到gated pixel CNN的效果已经非常好了。
conditional gated pixelCNN
Gated pixel CNN作为一个条件图片生成器就是指,添加一些先验信息来使生成的图片往我们想要的方向生成。上面提到的给模型一组向量来生成图片就是指作为conditional gated pixelCNN的作用。
p(X|h)=∏i=1n2p(xi|x1...xi�6�11h)p(X|h)=∏i=1n2p(xi|x1,xi�6�11y=tanh(Wkf�6�5X+VTkfh)�8�6σ(Wkg�6�5x+VTkgh)y=tanh(Wk,fTh)�8�6σ(Wk,gTh)
这里的hh就是我们给的一个先验信息hh可以以两种方式提供给模型:一组描述性的标签;基于其他网络生成的向量。hh是a one-hot encoding that specifies a class
若hh是a one-hot encoding that specifies a class,gated pixel CNN可以准确的生成这个种类hh只告诉模型要生成的东西是什么,训练好的模型会生成大量基于不同地点的图片。
更NB的地方是,hh甚至可以直接是imagenet 这个数据集中1000类别里面的类别id,作者训练pixelCNN生成了八种不同类型的动物图片,但是场景相似。Figure 3: Class-Conditional samples from the Conditional PixelCNN.hh是基于其他网络生成的向量
若hh是一个用由其它卷积网络中间生成的没见过的人脸信息,然后给模型一张不在整个训练集中的完全陌生的人脸信息给模型,一个auto-encoder由两部分组成,encoder部分就是将输入的图片降维变成一个低纬度表示的特征hhhh送入decoder中hh进行重构,它将encoder中生成的hh作为条件输入,作者在ImageNet上训练了一个gated pixelCNN auto-encoder,最后生成的图片效果如下:
Figure 6: Left to right: original image,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.最左边的这个张图是原图,右边的是gated pixel CNN生成的图片。可以看到,而gated pixelCNN在尽力去生成不同的但是相似的图像。
总结
最后作者对整个模型进行了一个总结,作者指出,gated pixel CNN可以生成在不同光照条件下的图片,所以gated pixel CNN可以客服生成模型中训练集光照条件不好的问题。