生成对抗网络生成带有一些随机像素的图像

时间:2017-10-27 11:32:29

标签: machine-learning conv-neural-network deconvolution image-generation

我正在尝试使用CelebA对齐网络上的生成对抗网络(GAN)生成图像,每个图像的大小调整为64 * 64.jpeg格式。我的网络定义类似于GANs architecture

def my_discriminator(input_var= None):
    net = lasagne.layers.InputLayer(shape= (None, 3,64,64), input_var = input_var)
    net = lasagne.layers.Conv2DLayer(net, 64, filter_size= (6,6 ),stride = 2,pad=2,W = lasagne.init.HeUniform(), nonlinearity= lasagne.nonlinearities.LeakyRectify(0.2))#64*32*32
    net = lasagne.layers.Conv2DLayer(net, 128, filter_size= (6,6),stride = 2,pad=2,W = lasagne.init.HeUniform(), nonlinearity= lasagne.nonlinearities.LeakyRectify(0.2))#128*16*16
    net = lasagne.layers.Conv2DLayer(net, 256, filter_size= (6,6),stride = 2,pad=2,W = lasagne.init.HeUniform(), nonlinearity= lasagne.nonlinearities.LeakyRectify(0.2))#256*8*8
    net = lasagne.layers.Conv2DLayer(net, 512, filter_size= (6,6),stride = 2,pad=2,W = lasagne.init.HeUniform(), nonlinearity= lasagne.nonlinearities.LeakyRectify(0.2))#512*4*4
    net = lasagne.layers.DenseLayer(net, 2048, W= lasagne.init.HeUniform(), nonlinearity= lasagne.nonlinearities.LeakyRectify(0.2))
    net = lasagne.layers.DenseLayer(net, 1, nonlinearity = lasagne.nonlinearities.sigmoid)

def my_generator(input_var=None):
    gen_net = lasagne.layers.InputLayer(shape = (None, 100), input_var = input_var)
    gen_net = lasagne.layers.DenseLayer(gen_net, 2048, W= lasagne.init.HeUniform())
    gen_net = lasagne.layers.DenseLayer(gen_net, 512*4*4, W= lasagne.init.HeUniform())
    gen_net = lasagne.layers.ReshapeLayer(gen_net, shape = ([0],512,4,4))
    gen_net = lasagne.layers.Deconv2DLayer(gen_net, 256,filter_size= (6,6),stride = 2,crop=2, W= lasagne.init.HeUniform(), nonlinearity= lasagne.nonlinearities.rectify)
    gen_net = lasagne.layers.Deconv2DLayer(gen_net, 128,filter_size= (6,6),stride = 2,crop=2, W= lasagne.init.HeUniform(), nonlinearity= lasagne.nonlinearities.rectify)
    gen_net = lasagne.layers.Deconv2DLayer(gen_net, 64, filter_size= (6,6), stride=2,crop=2,W= lasagne.init.HeUniform(), nonlinearity= lasagne.nonlinearities.rectify)
    gen_net = lasagne.layers.Deconv2DLayer(gen_net, 3, filter_size= (6,6),stride = 2,crop=2, nonlinearity= lasagne.nonlinearities.tanh)

使用生成器生成的图像,我得到一些随机彩色像素,还有一个"网格"像示例中的结构一样可以在示例图像中看到: enter image description here

我的问题是这两个问题的原因是什么,我也使用几乎相同的架构,在Cifar-10数据集上的Generator和Discriminator中使用少一个Convolution层,以.png格式提供32 * 32分辨率图像,但是生成的图像不是这样的。不确定图像格式是否可能是原因。如果有人可以提供一些想法或方法或链接,任何可以摆脱这些问题的东西,我将非常感激。

1 个答案:

答案 0 :(得分:0)

造成这些问题的原因是: -

  1. 随机像素 - 图像数据的归一化必须符合发生器[-1,1] - >的最后一层的激活函数。双曲正切

  2. "网格"在生成的图像中 - 每个图像的尺寸改变的方式。所以应该使用' transpose'转换功能而非转换(64,64,3) - >(3,64,64)