Conditional adversarial networks

GAN网络在训练生成模型受到了广泛的青睐,文章介绍一个具有条件限制的GAN网络,通过简单的添加额外输入数据,来构建我们所需要的条件化的生成器和判别器。文章表明,该模型可以用于学习多模态模型,通过提供了图像标记应用程序的初步示例,演示了该方法如何生成不属于训练标签的描述性标签。
生成式对抗网络近期作为训练生成模型的替代框架,以回避近似许多棘手概率计算问题的困难。
对抗网络的优点是不需要马可夫链,只需要反向传播用于获得梯度,并且在学习过程中不需要推理,也可以容易地将多种因素及其相互作用纳入模型中,还可以产生优的对数似然估计和现实样本。
非条件的GAN模型,对正在生成的数据没有控制,通过加入附加信息来调节模型,可以指导数据生成过程。这些额外的信息可以来自类别标签,也可以来自用于修复的部分数据,甚至可以来自不同的模态。
图像标签中的多模态学习:
一、尽管监督神经网络(特别是卷积网络)最近取得了许多成功,但是将这些模型缩放以适应极大数量的预测输出类别仍然具有挑战性。
二、迄今为止的大部分工作都集中在学习从输入到输出的一对一映射。 然而,许多有趣的问题大都是一对多的映射(例如,对于一张图片,可以有多套标注标准,每个人采取的标准不一)。
针对第一个问题,可以从其他模态中权衡额外的信息。如通过使用自然语言语料库来学习向量表示,其几何表示具有一定的语义意义。当我们在空间中进行预测时可以自然地对在训练期间没有看到的标签进行预测性概括。即使从图像特征空间到单词表示空间的简单线性映射也能够提高分类性能。
解决第二个问题的一种方法是使用条件概率生成模型,将输入视为条件变量,并将一对多映射实例化为条件预测分布。
生成对抗网络:
GAN包含两个对抗的模型:用于捕获数据分布的生成模型G和估计样本来自训练数据而不是G的概率的判别模型D。模型D和G都可以是非线性的映射函数(如多层感知机)。为了学习在真实数据集x上的生成分布Pg,生成模型G构建一个从先验噪声分布 Pz (z)到数据空间的映射函数 G(z; θg );判别模型DD(x; θd )的输入是真实图像或者生成图像,输出一个标量,表示输入样本来自训练样本(而非生成样本)的概率。
模型G和D的训练是同时进行的:固定判别模型D,通过使得log(1 − D(G(z))期望最小化来调整G的参数;固定生成模型G,通过使得logD(X) + log(1 − D(G(z)))的期望最大化来调整D的参数。这个过程遵循“二元极小极大博弈(two-player minimax game)”
这里写图片描述
条件对抗网络:
通过对生成器和判别器增加额外信息y左为条件,GAN可以扩展条件生成式对抗网络(cGAN)。y可以是任何类型的信息,比如类别标签或者来自其他模态的数据信息。通过将额外信息y作为输入层的一部分输送给判别模型和生成模型,来实现条件GAN。
在生成模型中,将先验输入噪声p(z)和条件信息y组成联合隐层表征。对抗训练框架在隐层表征的组成方式方面相当灵活;
在判别模型中,x和y一起作为输入,并输送到判别函数中(主题由MLP组成)。
条件对抗网络的目标函数也可归结为如下的“二元极小极大博弈(two-player minimax game)”问题:
这里写图片描述
条件对抗网络的框架如下:
这里写图片描述

image-to-Image Translation with Conditional Adversarial Networks(条件对抗网络的图像到图像转换)是一种用于图像转换的深度学习方法。它通过训练一个生成器网络和一个判别器网络来实现图像的转换。生成器网络将输入图像转换为目标图像,而判别器网络则试图区分生成的图像和真实的目标图像。 这种方法的关键是使用对抗性训练。生成器网络和判别器网络相互竞争,以提高生成器网络生成逼真图像的能力。生成器网络通过最小化判别器网络对生成的图像的判别误差来学习生成逼真的图像。判别器网络则通过最大化对生成的图像和真实图像的判别能力来学习区分真实图像和生成图像。 在条件对抗网络中,生成器网络和判别器网络都接收额外的条件输入,以指导图像转换的过程。这个条件输入可以是任何与图像转换任务相关的信息,例如标签、语义分割图或其他图像。 通过训练生成器网络和判别器网络,条件对抗网络可以实现各种图像转换任务,例如将黑白图像转换为彩色图像、将马的图像转换为斑马的图像等。 这是一个使用条件对抗网络进行图像到图像转换的示例代码: ```python import tensorflow as tf from tensorflow.keras import layers # 定义生成器网络 def build_generator(): # 定义生成器网络结构 generator = tf.keras.Sequential() generator.add(layers.Conv2DTranspose(64, (4, 4), strides=(2, 2), padding='same', input_shape=(256, 256, 3))) generator.add(layers.BatchNormalization()) generator.add(layers.ReLU()) generator.add(layers.Conv2DTranspose(32, (4, 4), strides=(2, 2), padding='same')) generator.add(layers.BatchNormalization()) generator.add(layers.ReLU()) generator.add(layers.Conv2DTranspose(3, (4, 4), strides=(2, 2), padding='same', activation='tanh')) return generator # 定义判别器网络 def build_discriminator(): # 定义判别器网络结构 discriminator = tf.keras.Sequential() discriminator.add(layers.Conv2D(64, (4, 4), strides=(2, 2), padding='same', input_shape=(256, 256, 3))) discriminator.add(layers.LeakyReLU()) discriminator.add(layers.Conv2D(128, (4, 4), strides=(2, 2), padding='same')) discriminator.add(layers.BatchNormalization()) discriminator.add(layers.LeakyReLU()) discriminator.add(layers.Conv2D(256, (4, 4), strides=(2, 2), padding='same')) discriminator.add(layers.BatchNormalization()) discriminator.add(layers.LeakyReLU()) discriminator.add(layers.Conv2D(1, (4, 4), strides=(1, 1), padding='same')) return discriminator # 定义条件对抗网络 class cGAN(tf.keras.Model): def __init__(self, generator, discriminator): super(cGAN, self).__init__() self.generator = generator self.discriminator = discriminator def compile(self, g_optimizer, d_optimizer, loss_fn): super(cGAN, self).compile() self.g_optimizer = g_optimizer self.d_optimizer = d_optimizer self.loss_fn = loss_fn def train_step(self, real_images, labels): # 生成器网络生成假图像 with tf.GradientTape() as tape: fake_images = self.generator([real_images, labels], training=True) # 判别器网络判别真实图像和假图像 real_output = self.discriminator([real_images, labels], training=True) fake_output = self.discriminator([fake_images, labels], training=True) # 计算生成器和判别器的损失 g_loss = self.loss_fn(fake_output, tf.ones_like(fake_output)) d_loss_real = self.loss_fn(real_output, tf.ones_like(real_output)) d_loss_fake = self.loss_fn(fake_output, tf.zeros_like(fake_output)) d_loss = d_loss_real + d_loss_fake # 更新生成器和判别器的参数 g_gradients = tape.gradient(g_loss, self.generator.trainable_variables) d_gradients = tape.gradient(d_loss, self.discriminator.trainable_variables) self.g_optimizer.apply_gradients(zip(g_gradients, self.generator.trainable_variables)) self.d_optimizer.apply_gradients(zip(d_gradients, self.discriminator.trainable_variables)) return {"g_loss": g_loss, "d_loss": d_loss} # 创建生成器和判别器 generator = build_generator() discriminator = build_discriminator() # 创建条件对抗网络 cgan = cGAN(generator, discriminator) # 编译条件对抗网络 cgan.compile( g_optimizer=tf.keras.optimizers.Adam(learning_rate=0.0002, beta_1=0.5), d_optimizer=tf.keras.optimizers.Adam(learning_rate=0.0002, beta_1=0.5), loss_fn=tf.keras.losses.BinaryCrossentropy(from_logits=True) ) # 训练条件对抗网络 cgan.fit(dataset, epochs=100) # 使用生成器网络进行图像转换 input_image = ... label = ... output_image = generator([input_image, label]) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值