Порождающая состязательная сеть, генерирующая изображение с несколькими случайными пикселями

Я пытаюсь сгенерировать изображения с использованием Generative Adversarial Networks(GAN) на выровненном наборе данных CelebA, размер каждого изображения которого составляет 64*64 в формате.jpeg. Мое определение сети выглядит следующим образом Архитектура GAN

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)

С изображениями, сгенерированными генератором, я получаю несколько случайно окрашенных пикселей, а также структуру, похожую на "сетку", как это видно на примере изображения:

Мой вопрос заключается в том, каковы причины этих двух проблем, я также использовал почти ту же архитектуру с одним меньшим слоем Convolution в Generator и Discriminator на наборе данных Cifar-10 с изображениями с разрешением 32*32 в формате.png, но там сгенерированные изображения были не так. Не уверен, что формат изображения может быть причиной. Я был бы очень благодарен, если бы кто-то мог предоставить некоторые идеи или способы или ссылки, что-нибудь, чтобы избавиться от таких проблем.

1 ответ

Решение

Причины этих проблем были:

  1. Случайные пиксели - нормализация данных изображения должна соответствовать функции активации последнего слоя Генератора [-1,1] -> tanh

  2. "Сетка" в сгенерированных изображениях - способ изменения размеров каждого изображения. Поэтому следует использовать функцию "transpose" вместо "reshape" для преобразования (64,64,3)->(3,64,64)

Другие вопросы по тегам