DC-GAN:鉴别器损耗上升而发电机损耗下降

时间:2019-08-15 17:29:05

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

我无法确定此错误是否是由于技术错误或超参数导致的,但我的DC-GAN的鉴频器损耗开始时较低,然后逐渐升高,逐渐降低了约8,而发电机损耗则下降了。我结束了大约60,000个纪元。有趣的是,鉴别器的准确性似乎在20%至50%之间浮动。有人对解决这个问题有什么建议吗?任何帮助表示赞赏。

重要信息

  • 数据格式:472 320x224彩色PNG文件。
  • 优化程序:Adam(0.0002, 0.5)
  • 损失:二进制互熵

经过50,000个以上的时间后生成的图像:(假定是白色背景上的运动鞋)

enter image description here

鉴别器模型:

    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)

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

在GAN中,将您自己的想法用于超参数通常是一个坏主意,除非您真的知道自己在做什么,或者拥有大量的GPU能力可以在大规模搜索中燃烧。