【问题标题】:DC-GAN: Discriminator loss going up while generator loss goes downDC-GAN:鉴别器损失上升,而生成器损失下降
【发布时间】:2019-12-22 03:12:34
【问题描述】:

我不知道这个错误是由于技术错误还是超参数造成的,但我的 DC-GAN 的鉴别器损失从低开始逐渐攀升,在 8 左右减慢,而我的生成器损失则大幅下降。我在大约 60,000 个 epoch 时结束了它。有趣的是,鉴别器的准确率似乎在 20-50% 左右浮动。有没有人有任何建议来解决这个问题?任何帮助表示赞赏。

重要信息

  • 数据格式:472 个 320x224 彩色 PNG 文件。
  • 优化器:Adam(0.0002, 0.5)
  • 损失:二元交叉熵

经过 50,000 多个 epoch 后生成的图像:(假设是白色背景上的运动鞋)

判别模型:

    def build_discriminator(self):

        img_shape = (self.img_size[0], self.img_size[1], self.channels)

        model = Sequential()

        model.add(Conv2D(32, kernel_size=self.kernel_size, strides=2, input_shape=img_shape, padding="same"))  # 192x256 -> 96x128
        model.add(LeakyReLU(alpha=0.2))
        model.add(Dropout(0.25))

        model.add(Conv2D(64, kernel_size=self.kernel_size, strides=2, padding="same"))  # 96x128 -> 48x64
        model.add(ZeroPadding2D(padding=((0, 1), (0, 1))))
        model.add(LeakyReLU(alpha=0.2))
        model.add(Dropout(0.25))
        model.add(BatchNormalization(momentum=0.8))

        model.add(Conv2D(128, kernel_size=self.kernel_size, strides=2, padding="same"))  # 48x64 -> 24x32
        model.add(LeakyReLU(alpha=0.2))
        model.add(Dropout(0.25))
        model.add(BatchNormalization(momentum=0.8))

        model.add(Conv2D(256, kernel_size=self.kernel_size, strides=1, padding="same"))  # 24x32 -> 12x16
        model.add(LeakyReLU(alpha=0.2))
        model.add(Dropout(0.25))

        model.add(Conv2D(512, kernel_size=self.kernel_size, strides=1, padding="same"))  # 12x16 -> 6x8
        model.add(LeakyReLU(alpha=0.2))
        model.add(Dropout(0.25))

        model.add(Flatten())
        model.add(Dense(1, activation='sigmoid'))

        model.summary()

        img = Input(shape=img_shape)
        validity = model(img)

        return Model(img, validity)

生成器模型:

    def build_generator(self):

        noise_shape = (100,)

        model = Sequential()
        model.add(
            Dense(self.starting_filters * (self.img_size[0] // (2 ** self.upsample_layers))  *  (self.img_size[1] // (2 ** self.upsample_layers)),
                  activation="relu", input_shape=noise_shape))
        model.add(Reshape(((self.img_size[0] // (2 ** self.upsample_layers)),
                           (self.img_size[1] // (2 ** self.upsample_layers)),
                           self.starting_filters)))
        model.add(BatchNormalization(momentum=0.8))

        model.add(UpSampling2D())  # 6x8 -> 12x16
        model.add(Conv2D(1024, kernel_size=self.kernel_size, padding="same"))
        model.add(Activation("relu"))
        model.add(BatchNormalization(momentum=0.8))

        model.add(UpSampling2D())  # 12x16 -> 24x32
        model.add(Conv2D(512, kernel_size=self.kernel_size, padding="same"))
        model.add(Activation("relu"))
        model.add(BatchNormalization(momentum=0.8))

        model.add(UpSampling2D())  # 24x32 -> 48x64
        model.add(Conv2D(256, kernel_size=self.kernel_size, padding="same"))
        model.add(Activation("relu"))
        model.add(BatchNormalization(momentum=0.8))

        model.add(UpSampling2D())  # 48x64 -> 96x128
        model.add(Conv2D(128, kernel_size=self.kernel_size, padding="same"))
        model.add(Activation("relu"))
        model.add(BatchNormalization(momentum=0.8))

        model.add(UpSampling2D())  # 96x128 -> 192x256
        model.add(Conv2D(64, kernel_size=self.kernel_size, padding="same"))
        model.add(Activation("relu"))
        model.add(BatchNormalization(momentum=0.8))

        model.add(Conv2D(32, kernel_size=self.kernel_size, padding="same"))
        model.add(Activation("relu"))
        model.add(BatchNormalization(momentum=0.8))

        model.add(Conv2D(self.channels, kernel_size=self.kernel_size, padding="same"))
        model.add(Activation("tanh"))

        model.summary()

        noise = Input(shape=noise_shape)
        img = model(noise)

        return Model(noise, img)

【问题讨论】:

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


    【解决方案1】:

    您遇到这个问题听起来完全可以理解。您的网络没有得到补偿,就神经元数量而言,生成器比判别器强大得多。我会尝试使生成器和鉴别器在层数、配置和大小方面彼此对称,这样你就可以确保没有一个比另一个更强大事实上

    【讨论】:

    • 有道理。我会改变它,看看会发生什么。
    • 如果您认为我能够帮助您,请考虑选择我的消息作为已接受的答案:D
    • 所以我平衡了参数,我在生成器和鉴别器之间获得了更多的平衡。但是,图像看起来与它们几乎相同。唯一明显的区别是更多的纯色,而不是第一张图像中的纤细颜色。有什么想法吗?
    • 是的! DC-GAN 是一个非常过时的模型。很多时候它不只是收敛。例如,我会尝试使用 WGAN-GP
    • 所以我意识到,当我测试我的更改时,我并没有让它运行足够长的时间。无论我如何缩小生成器的网络,鉴别器仍然有可怕的损失。增加鉴别器网络的大小会有所帮助吗?已经很大了
    【解决方案2】:

    我猜你正在使用你自己的数据集。如果不考虑使用与 DCGAN 论文中相同的超参数,并首先重现他们的结果。然后将该网络用于您的数据集。众所周知,尤其是具有交叉熵损失的 DCGAN 非常棘手,并且对超参数非常敏感,无法运行(参见 https://arxiv.org/abs/1711.10337)。特别是,如果您没有使用某种梯度惩罚(梯度惩罚或光谱范数)来约束判别器。

    在 GAN 中,对超参数使用您自己的想法通常是个坏主意,除非您真的知道自己在做什么,或者拥有大量 GPU 能力来进行大规模搜索。

    【讨论】:

      猜你喜欢
      • 2021-11-18
      • 1970-01-01
      • 2020-05-05
      • 1970-01-01
      • 2018-10-06
      • 2017-07-30
      • 2018-07-26
      • 2019-02-12
      • 2019-01-18
      相关资源
      最近更新 更多