首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的DCGAN不收敛?

为什么我的DCGAN不收敛?
EN

Data Science用户
提问于 2022-08-16 10:10:56
回答 2查看 409关注 0票数 0

我正在MVTec 榛子数据集上训练tf,我发现了一些困难。问题是,在经历了许多时代之后,生成的图像并不能产生一些高质量的图像。

我的模型如下:

代码语言:javascript
复制
    def build_generator(self, noise_dim):
        #
        # Input shape (None, 100)
        # Output shape (None, 64, 64, 3)
        #
        model = Sequential(name = "Generator")

        model.add(Dense(4*4*512, input_dim = noise_dim, activation = "relu", use_bias = False))
        model.add(BatchNormalization())
        model.add(Reshape((4,4,512)))

        model.add(Conv2DTranspose(512, (5, 5), strides = (2, 2), padding = "same", activation = "relu", use_bias = False))
        model.add(BatchNormalization())

        model.add(Conv2DTranspose(256, (5, 5), strides = (2, 2), padding = "same", activation = "relu", use_bias = False))
        model.add(BatchNormalization())

        model.add(Conv2DTranspose(128, (5, 5), strides = (2, 2), padding = "same", activation = "relu", use_bias = False))
        model.add(BatchNormalization())

        model.add(Conv2DTranspose(64, (5, 5), strides = (2, 2), padding = "same", activation = "relu", use_bias = False))
        model.add(BatchNormalization())

        model.add(Conv2DTranspose(3, (5, 5), activation = "tanh", padding = "same", use_bias = False))

        assert model.output_shape == (None, 64, 64, 3)

        return model

    def build_discriminator(self, image_shape):

        model = Sequential(name = "Discriminator")

        model.add(Conv2D(64, kernel_size = (5, 5), strides = (2, 2), input_shape = image_shape, padding = "same"))
        model.add(BatchNormalization())
        model.add(LeakyReLU(0.2))
        model.add(Dropout(0.3))

        model.add(Conv2D(128, kernel_size = (5, 5), strides = (2, 2), padding = "same"))
        model.add(BatchNormalization())
        model.add(LeakyReLU(0.2))
        model.add(Dropout(0.3))

        model.add(Conv2D(256, kernel_size = (5, 5), strides = (2, 2), padding = "same"))
        model.add(BatchNormalization())
        model.add(LeakyReLU(0.2))
        model.add(Dropout(0.3))

        model.add(Conv2D(512, kernel_size = (5, 5), strides = (2, 2), padding = "same"))
        model.add(BatchNormalization())
        model.add(LeakyReLU(0.2))
        model.add(Dropout(0.3))

        model.add(Flatten())
        model.add(Dense(1))

        return model

我尝试了一些以前的配置,我认为这是最好的,它似乎学习比模型更少的过滤器。

关于训练集,它只有391幅图像,它似乎是一个很差的数据集来训练一个GAN,所以我尝试了一些数据增强来收集更多的图像。特别是我使用了RandomTranslation、RandomRotation和RandomZoom tensorflow的层。在1564幅图像(标准化的介于1和1之间)之后,训练速度似乎又快了一点:在100个年代之后,G_loss的值在1到2之间,D_loss在0.5到1之间。然而,生成的图像似乎并不真实。

有人能帮忙如何使我的GAN收敛吗?提前谢谢。

EN

回答 2

Data Science用户

发布于 2022-08-16 10:33:37

首先,您的鉴别器输出应该使用sigmoid激活(假设您使用二进制交叉熵或wasserstein损失)。我不确定这是否能解决你的问题。我认为,您的模型没有收敛的原因是与您的模型相对较大的复杂性相比,用于培训的样本数量很少。您可以使用MNIST或CelebA数据集(70.000和~200.000图像)尝试相同的体系结构,并查看是否仍然存在问题。

票数 0
EN

Data Science用户

发布于 2022-09-20 11:56:24

如果其他人有类似的问题,我会把我的解决方案发出去。

在这种情况下,GAN没有收敛,因为鉴别器太好了。这是一个常见的问题:如果鉴别器能够区分真实的例子和假的例子,它将永远不会给生成器任何改进数据生成的建议。所以模型会有分歧。

在这种情况下,我从网络中删除了一个隐藏层。

代码语言:javascript
复制
def build_discriminator(self):

        model = Sequential(name = "Discriminator")

        model.add(Conv2D(64, kernel_size = (5, 5), strides = (2, 2), input_shape = self.image_shape, padding = "same"))
        model.add(BatchNormalization())
        model.add(LeakyReLU(0.2))
        model.add(Dropout(0.3))

        model.add(Conv2D(128, kernel_size = (5, 5), strides = (2, 2), padding = "same"))
        model.add(BatchNormalization())
        model.add(LeakyReLU(0.2))
        model.add(Dropout(0.3))

        model.add(Conv2D(256, kernel_size = (5, 5), strides = (2, 2), padding = "same"))
        model.add(BatchNormalization())
        model.add(LeakyReLU(0.2))
        model.add(Dropout(0.3))

        model.add(Flatten())
        model.add(Dense(1))

        return model
票数 0
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/113566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档