美文网首页
Conditional GAN

Conditional GAN

作者: zelda2333 | 来源:发表于2020-09-27 10:27 被阅读0次

    对抗网络具有以下优点:永远不需要马尔可夫链,仅使用反向传播来获得梯度,在学习期间 不需要推理,并且可以容易地将各种因素和相互作用结合到模型中。

    在无条件的生成模型中,模型无法控制正在生成的数据的模式。但是,通过将附加信息作为条件条件化(conditioning)模型,可以指导数据生成过程。这种条件化可以基于类标签,也可以基于图像修复数据的一部分。

    有条件的对抗网络

    如果生成器G和判别器D都以某些额外信息y为条件,则GAN可以被扩展到一个条件模型。y可以是任何类型的辅助信息,例如类标签或来自其他模态的数据。我们可以通过,将y作为附加输入层喂入判别器D和生成器G,来完成GAN的条件化。

    在生成器G中,将先前的输入噪声pz(Z)和条件y合并为联合隐式表示。并且在如何组成该 隐藏表示方面,对抗训练框架有相当大的灵活性。

    在判别器D中,x和y被表示为输入和判别函数(在这种情况下通过MLP再次体现)。

    双人min-max游戏的目标函数是:

    GAN的结构.png CGAN 结构

    网络结构图片来自:https://github.com/hwalsuklee/tensorflow-generative-model-collections

    代码:

    class Generator(nn.Module):
        def __init__(self):
            super(Generator, self).__init__()
    
            self.label_emb = nn.Embedding(opt.n_classes, opt.n_classes)
    
            def block(in_feat, out_feat, normalize=True):
                layers = [nn.Linear(in_feat, out_feat)]
                if normalize:
                    layers.append(nn.BatchNorm1d(out_feat, 0.8))
                layers.append(nn.LeakyReLU(0.2, inplace=True))
                return layers
    
            self.model = nn.Sequential(
                *block(opt.latent_dim + opt.n_classes, 128, normalize=False),
                *block(128, 256),
                *block(256, 512),
                *block(512, 1024),
                nn.Linear(1024, int(np.prod(img_shape))),
                nn.Tanh()
            )
    
        def forward(self, noise, labels):
            # Concatenate label embedding and image to produce input
            gen_input = torch.cat((self.label_emb(labels), noise), -1)
            img = self.model(gen_input)
            img = img.view(img.size(0), *img_shape)
            return img
    
    class Discriminator(nn.Module):
        def __init__(self):
            super(Discriminator, self).__init__()
    
            self.label_embedding = nn.Embedding(opt.n_classes, opt.n_classes)
    
            self.model = nn.Sequential(
                nn.Linear(opt.n_classes + int(np.prod(img_shape)), 512),
                nn.LeakyReLU(0.2, inplace=True),
                nn.Linear(512, 512),
                nn.Dropout(0.4),
                nn.LeakyReLU(0.2, inplace=True),
                nn.Linear(512, 512),
                nn.Dropout(0.4),
                nn.LeakyReLU(0.2, inplace=True),
                nn.Linear(512, 1),
            )
    
        def forward(self, img, labels):
            # Concatenate label embedding and image to produce input
            d_in = torch.cat((img.view(img.size(0), -1), self.label_embedding(labels)), -1)
            validity = self.model(d_in)
            return validity
    

    没有用Conv,latentdim代表噪声的维度,n_classes代表10。G的激活函数为tanh()。
    G的前向函数返回image,size为(img.size(0), *img_shape)。

    参考链接:
    Conditional GAN 全文翻译
    Conditional Generative Adversarial Nets论文笔记
    Conditional GAN原理分析与代码解读 - 科技猛兽的文章 - 知乎

    相关文章

      网友评论

          本文标题:Conditional GAN

          本文链接:https://www.haomeiwen.com/subject/wlonyktx.html