【问题标题】:DCGAN producing noise but not expected structure, Can someone help me get proper results out of a DCGAN?DCGAN 产生噪音但不是预期的结构,有人可以帮我从 DCGAN 中获得正确的结果吗?
【发布时间】:2021-10-30 11:11:27
【问题描述】:

有人可以帮我从我的 DCGAN 中获得正确的结果/图像吗?

我从一张照片中得到了不同颜色(噪点)的照片 迭代到另一个,但不是任何接近我应该的地方 得到。我正在用标签喂人脸/猫/狗来训练我的发电机 和鉴别器,我应该得到看起来的输出
像猫、狗或人脸。

对于不同的潜在向量,我得到不同的结果/像素 值,不同的颜色用于不同的迭代,但不是 面孔或动物的结构。

我正在使用二元交叉熵损失函数 生成器、鉴别器和GAN。我尝试使用 MAE 除了生成器的交叉熵,但没有得到任何东西 不同的。我尝试训练生成器和鉴别器 一起、分开和交替的生成器和 鉴别器,但这些尝试也没有什么好处。 我每次运行 700 多个 epoch(5 天) CPU 上的迭代耗时超过 5 分钟。

def generator(latent_dim, n_classes):
    
    initializer = tf.random_normal_initializer(0., 0.021)
    in_label = Input(shape=(1,))
    li = Embedding(n_classes, 25)(in_label)
    n_nodes = 64 * 64
    
    li = Dense(n_nodes)(li)
    
    li = Reshape((64, 64, 1))(li)
    
    
    in_lat = Input(shape=(latent_dim,))
    n_nodes = 128 * 64 * 64
    
    gen = Dense(n_nodes)(in_lat)
    
    gen = LeakyReLU(alpha=0.2)(gen)
    gen = BatchNormalization(axis=-1)(gen)
    gen = Reshape((64, 64, 128))(gen)

    merge = Concatenate()([gen, li])
    gen = Conv2DTranspose(128, (4,4), strides=(2,2), padding='same',kernel_initializer=initializer,use_bias=False)(merge)
    gen = LeakyReLU(alpha=0.2)(gen)
    gen = BatchNormalization(axis=-1)(gen)
    

    gen = Conv2DTranspose(128, (4,4), strides=(2,2), padding='same',kernel_initializer=initializer,use_bias=False)(gen)
    gen = LeakyReLU(alpha=0.2)(gen)
    gen = BatchNormalization(axis=-1)(gen)

    
    out_layer = Conv2D(3, (7,7), activation='tanh', padding='same',kernel_initializer=initializer,use_bias=False)(gen)
    model = Model([in_lat, in_label], out_layer, name="generator")
    
    opt = Adam(lr=0.0002, beta_1=0.5)
    model.compile(optimizer=opt,loss='binary_crossentropy', metrics='accuracy')
    
    return model



def define_discriminator(n_classes,in_shape=(256,256,3)):
    
    initializer = tf.random_normal_initializer(0., 0.021)
    in_label = Input(shape=(1,))
    li = Embedding(n_classes, 25)(in_label)     
    n_nodes = in_shape[0] * in_shape[1]
    
    li = Dense(n_nodes)(li)

    li = Reshape((in_shape[0], in_shape[1],1))(li)
    
    in_image = Input(shape=in_shape)
    merge = Concatenate()([in_image, li])
    
    fe = Conv2D(128, (3,3), strides=(2,2), padding='same',kernel_initializer=initializer,use_bias=False)(merge)
    fe = LeakyReLU(alpha=0.2)(fe)
    fe = BatchNormalization(axis=-1)(fe)

    fe = Conv2D(128, (3,3), strides=(2,2), padding='same',kernel_initializer=initializer,use_bias=False)(fe)
    fe = LeakyReLU(alpha=0.2)(fe)
    fe = BatchNormalization(axis=-1)(fe)
    
    
    fe = Flatten()(fe)
    fe = Dropout(0.4)(fe)

    out_layer = Dense(1, activation='sigmoid')(fe)
    model = Model([in_image, in_label], out_layer, name="discriminator")

    opt = Adam(lr=0.0002, beta_1=0.5)
    model.compile(optimizer=opt, loss='binary_crossentropy', metrics=['accuracy'])
    
    return model



def define_gan(g_model, d_model):
    
    g_model.trainable = True
    d_model.trainable = False
    
    gen_noise, gen_label = g_model.input
    gen_output = g_model.output
    
    gan_output = d_model([gen_output, gen_label])
    model = Model([gen_noise, gen_label], gan_output, name="gan")
    opt = Adam(lr=0.0002, beta_1=0.5)
    model.compile(optimizer=opt,  loss='binary_crossentropy', metrics='accuracy')
    return model

以下是不同迭代的结果/图像。 16个正方形是16 不同的潜在向量种子。

【问题讨论】:

标签: python deep-learning generative-adversarial-network


【解决方案1】:

没有看到任何代码很难推测,但您可以查看this repo 以供参考。

注意这个注意事项:

另外,由于我们无法理解的原因,如果您仅在 CPU 上训练,此笔记本中的判别器几乎总是无法学习。由于这个失败,GAN 将很少学习如何生成草图——即,它将输出仅仅是随机噪声的图像。我们已经确定了两种解决这种情况的方法:

  1. 使用 GPU。如果您没有,请按照上面的建议使用 Colab。在 Colab 中,您可以从菜单栏中的“运行时”项中选择“更改运行时类型”,然后选择“GPU”作为您的硬件加速器。这个硬件加速器训练 GAN 的速度比“None”或“TPU”选项快几个数量级,并且判别器(我们不知道为什么!)会正确训练。
  2. 更改鉴别器的优化器。正如本笔记本的鉴别器编译步骤中的评论所指出的,从默认的 RMSprop 优化器切换到另一个(例如,Adam 或 AdaDelta)使鉴别器能够有效地学习,因此 GAN 会生成草图。无论您使用仅 CPU、GPU 还是 TPU,此解决方案都是有效的。 (也就是说,使用 GPU 训练 GAN 仍然比仅使用 CPU 或 TPU 快得多。)

您也可以查看此讨论:https://github.com/the-deep-learners/deep-learning-illustrated/issues/2

【讨论】:

  • 您好 tromgy,感谢您的回复...问题不在于鉴别器,而在于生成器。鉴别器完美地对假图像和真实图像进行分类,我已经在使用亚当优化器,正如您在我的代码中看到的那样。无论如何,正如你所建议的,我将尝试使用不同的优化器作为鉴别器,可能是 SGD,不是为了提高它的性能,而是给生成器一些学习空间。谢谢。
猜你喜欢
  • 1970-01-01
  • 2013-02-26
  • 2016-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-10
相关资源
最近更新 更多