Press "Enter" to skip to content

GAN(生成对抗网络):

我们已经看到了生成式人工智能,现在让我们看看它是如何生成的!

图片来源:作者提供

引言:

GANs,即生成对抗网络,让我们首先了解一下GANs是什么。所以我已经写过一篇关于生成式人工智能的博客,在那篇博客中我们讨论了许多类型的人工智能,人工智能的炒作以及为什么人工智能在如今的各个领域(如医疗保健、金融、交易、营销等)越来越流行。但是这个人工智能究竟是如何生成那些看起来相似的图像、迷人的景色以及引人入胜的颜色和旋律的呢?GANs是深度学习领域的一部分,由Ian Goodfellow和他的合作者在2014年首次提出,之后GANs迅速吸引了许多研究人员的注意,这导致了很多研究,并且有助于重新定义创造力和人工智能在人工智能界的边界。

1.1 GANs是什么以及它们是如何工作的?

那么,你们听说过合成数据吗?是的,那太棒了。如果答案是否定的,也没关系。合成数据是通过算法制造的非真实数据,当实际数据不可用时使用。你可以把合成数据想象成一个虚假的数据集。但是,它是如何产生的?过程是什么?你说是算法吗?那么这个算法到底是什么?答案是GANs,是的,GANs是用于生成任务的深度学习模型的组成部分,可以创建几乎任何虚假的东西,从深伪造电影到看起来像真实照片的图像,再到任何东西的虚假数据集。

图片来源:https://developers.google.com/machine-learning/gan/gan_structure

GANs由两个主要的神经网络组成:

  1. 生成器

2. 判别器:

生成器:

生成器网络以随机噪声作为输入,将随机噪声视为完全随机的虚假数据,然后尝试将其转化为类似于原始数据或目标分布的数据。以图像为例。在处理图像数据集时,该网络试图生成与我们输入的原始数据集完全相似的图像,但它们完全是生成的,即虚假的。因此,该网络通过使用反向传播和梯度下降来调整其参数,从而学习将噪声向量映射到数据样本。

判别器:

判别器网络则充当分类器,试图区分由生成器生成的虚假数据和原始数据集中的真实数据。它学习以高概率给出真实数据和低概率给出虚假数据。

图片来源:https://i0.wp.com/neptune.ai/wp-content/uploads/2022/10/fig2-Generator-and-Discriminator.png?ssl=1

GAN的训练过程就是这两个网络之间的来回对抗。具体工作方式如下:

训练阶段:

  • 生成器从随机噪声生成虚假数据。
  • 判别器评估并为真实数据和虚假数据分配概率。
  • 判别器的目标是通过学习区分真实数据和虚假数据来提高分类准确性。
  • 生成器的目标是生成足够引人注目的数据以“欺骗”判别器。它通过调整自己的设置,生成判别器更容易识别为真实数据的数据。

竞赛阶段:

  • 生成器产生新鲜的虚构数据。
  • 鉴别器将新鲜的伪数据与实际数据进行比较。
  • 鉴别器增强的分类能力现在可能使其更好地区分新的伪数据。
  • 生成器修改其参数以创建更引人入胜的结果。

这个迭代过程会一直重复,直到生成器生成的数据与实际数据无法区分,或满足停止要求为止。

生成对抗网络(GANs)的成功取决于在生成器和鉴别器之间取得平衡,其中生成器擅长生成逼真的数据,鉴别器擅长区分真实数据和虚假数据。通过从训练数据中捕捉微妙的模式和分布,GANs在图片生成、风格转移、数据增强等多个领域中展现出了出色的成果。

这是一个关于GAN架构背后所有数学的最酷的视频,简单而高效地解释了,请有兴趣的人观看:https://youtu.be/Gib_kiXgnvA

通过PROJECT PRO,进入生成对抗网络(GANs)和深度神经网络的动态领域。除了理论解释外,这个平台还提供了沉浸式的学习体验,包括理解和实际应用。

PROJECT PRO中,你不仅仅是一个被动的学生;你将成为GANs和深度神经网络创建和优化的积极参与者。你将被引导完成从构思模型架构到编码和使用实际数据集的每个开发阶段。无论你对图片生成、数据增强或其他GAN应用感兴趣,PROJECT PRO都提供了工具和资源,帮助你将想法变成现实项目。通过这个交互式学习平台,你可以提高自己的能力,按自己的速度探索,并将创意思维变成现实。

现在就访问它们:https://bit.ly/3OlIGoF

2. GAN的优势:

SOURCE: https://giphy.com/

现在我们已经了解了生成对抗网络(GANs)的内部工作原理,让我们看看它们相对于其他深度神经网络方法的特殊优势。这些优势不仅限于图片生成、数据增强和图像修改,还展示了GANs在推动人工智能和创造性应用的前沿方面的独特能力。

2.1 高质量图片生成:

GANs能够创建与真实照片非常相似的高质量图片,这是它惊人能力之一。生成器网络通过学习数据集的复杂模式和结构,创造出具有惊人逼真度的视觉效果。这在艺术、设计和娱乐等领域具有巨大潜力,可以产生超越想象力的逼真图片。

2.2 数据增强和合成:

通过创建合成数据,GANs在提高机器学习模型效率方面发挥着关键作用。这种方法被称为数据增强,它包括创建额外的实例,增加训练数据集的多样性。GANs通过提供准确代表原始分布的数据在这个领域表现出色。当数据稀缺时,这特别有用,因为它有助于模型的泛化和性能。

2.3 风格转移和图像到图像翻译

GANs具有将图片的风格或内容进行转换的独特能力,从而衍生出风格转移和图像到图像翻译等应用。在风格转移中,GANs可以将一张图片的创意风格转移到另一张图片上,同时保持其内容。在图像到图像翻译中,GANs可以将图片从一个领域翻译到另一个领域,例如将卫星图片翻译为地图或将黑白照片翻译为彩色图片。这种灵活性为创意表达和各种领域中的实际解决方案提供了机会。

GANs的优势在于它们以创造力和优雅的方式解决这些问题,使它们成为推动人工智能和创造性技术未来的动力。

GAN的真实世界应用案例:

来源:https://giphy.com/

在我们掌握了GAN的基本原理之后,让我们来看看它们在许多真实世界应用中的能力。GAN在艺术和设计领域创造了引人入胜的作品,例如被拍卖为AI生成艺术品的《爱德蒙·德·贝拉米的肖像》。知名时尚品牌如耐克使用GAN来创建独特的设计,而在医疗保健领域,GAN生成合成医学图像,实时增强诊断AI的训练。

NVIDIA在自动驾驶汽车领域复制了多种驾驶场景,加快了自动驾驶汽车的改进。建筑师使用GAN来可视化室内设计,而GAN生成的沉浸式环境用于增强视频游戏体验。GAN支持的个性化时尚建议增强了零售体验,而图像修复、药物发现和其他领域也正在被重新定义。GAN是将视觉转化为现实的催化剂,应用于艺术、技术和其他领域。

让我们稍微玩一下GAN:(生成图像的代码)

这个GAN模型代码演示了如何使用TensorFlow和Keras构建、训练和可视化生成对抗网络(GAN)的结果。让我们逐步了解代码的关键组成部分:

来源:https://giphy.com/

步骤1:准备和下载数据集:

首先,代码下载并提取CelebA数据集。这个集合由名人的面部照片组成。照片已经被导入和预处理。它们已经被归一化到范围[-1, 1]。

import tensorflow as tffrom tensorflow import kerasfrom tensorflow.keras import layersimport matplotlib.pyplot as pltimport osimport gdownfrom zipfile import ZipFile

os.makedirs("celeba_gan")url = "https://drive.google.com/uc?id=1O7m1010EJjLE5QxLZiM9Fpjs7Oj6e684"output = "celeba_gan/data.zip"gdown.download(url, output, quiet=True)with ZipFile("celeba_gan/data.zip", "r") as zipobj:    zipobj.extractall("celeba_gan")

dataset = keras.utils.image_dataset_from_directory(    "celeba_gan", label_mode=None, image_size=(64, 64), batch_size=32)dataset = dataset.map(lambda x: x / 255.0)

for x in dataset:    plt.axis("off")    plt.imshow((x.numpy() * 255).astype("int32")[0])    break
来源:作者(这将是运行上述代码后得到的输出图像)

步骤2:判别器模型定义:

使用具有LeakyReLU激活的卷积层序列创建判别器模型。判别器试图确定输入图片是否是真实的还是制造的(伪造的)。

discriminator = keras.Sequential(    [        keras.Input(shape=(64, 64, 3)),        layers.Conv2D(64, kernel_size=4, strides=2, padding="same"),        layers.LeakyReLU(alpha=0.2),        layers.Conv2D(128, kernel_size=4, strides=2, padding="same"),        layers.LeakyReLU(alpha=0.2),        layers.Conv2D(128, kernel_size=4, strides=2, padding="same"),        layers.LeakyReLU(alpha=0.2),        layers.Flatten(),        layers.Dropout(0.2),        layers.Dense(1, activation="sigmoid"),    ],    name="discriminator",)discriminator.summary()

步骤3:创建生成器模型:

为了生成图片,生成器模型接受随机潜在向量作为输入,并逐渐上采样它们。它首先使用一个全连接层,然后将输出转换成一个4D张量

使用卷积转置层上采样数据并生成一个模拟数据集真实图片的图片

latent_dim = 128generator = keras.Sequential(    [        keras.Input(shape=(latent_dim,)),        layers.Dense(8 * 8 * 128),        layers.Reshape((8, 8, 128)),        layers.Conv2DTranspose(128, kernel_size=4, strides=2, padding="same"),        layers.LeakyReLU(alpha=0.2),        layers.Conv2DTranspose(256, kernel_size=4, strides=2, padding="same"),        layers.LeakyReLU(alpha=0.2),        layers.Conv2DTranspose(512, kernel_size=4, strides=2, padding="same"),        layers.LeakyReLU(alpha=0.2),        layers.Conv2D(3, kernel_size=5, padding="same", activation="sigmoid"),    ],    name="generator",)generator.summary()

步骤4:定义GAN模型如下:

判别器和生成器GAN类中被结合起来。

它包括一个train_step方法,用于在判别器和生成器上执行单个训练步骤。

判别器被训练来区分真实和伪造的图片,而生成器被训练来创建欺骗判别器的图片。

在训练过程中,将随机噪声注入标签以提高稳定性。

class GAN(keras.Model):    def __init__(self, discriminator, generator, latent_dim):        super().__init__()        self.discriminator = discriminator        self.generator = generator        self.latent_dim = latent_dim    def compile(self, d_optimizer, g_optimizer, loss_fn):        super().compile()        self.d_optimizer = d_optimizer        self.g_optimizer = g_optimizer        self.loss_fn = loss_fn        self.d_loss_metric = keras.metrics.Mean(name="d_loss")        self.g_loss_metric = keras.metrics.Mean(name="g_loss")    @property    def metrics(self):        return [self.d_loss_metric, self.g_loss_metric]    def train_step(self, real_images):        # 在潜在空间中随机采样点        batch_size = tf.shape(real_images)[0]        random_latent_vectors = tf.random.normal(shape=(batch_size, self.latent_dim))        # 将它们解码为伪造图片        generated_images = self.generator(random_latent_vectors)        # 将它们与真实图片组合起来        combined_images = tf.concat([generated_images, real_images], axis=0)        # 组装区分真实和伪造图片的标签        labels = tf.concat(            [tf.ones((batch_size, 1)), tf.zeros((batch_size, 1))], axis=0        )        # 向标签添加随机噪声-重要技巧!        labels += 0.05 * tf.random.uniform(tf.shape(labels))        # 训练判别器        with tf.GradientTape() as tape:            predictions = self.discriminator(combined_images)            d_loss = self.loss_fn(labels, predictions)        grads = tape.gradient(d_loss, self.discriminator.trainable_weights)        self.d_optimizer.apply_gradients(            zip(grads, self.discriminator.trainable_weights)        )        # 在潜在空间中随机采样点        random_latent_vectors = tf.random.normal(shape=(batch_size, self.latent_dim))        # 组装标签,表示“所有真实图片”        misleading_labels = tf.zeros((batch_size, 1))        # 训练生成器(注意我们不应该更新判别器的权重)!        with tf.GradientTape() as tape:            predictions = self.discriminator(self.generator(random_latent_vectors))            g_loss = self.loss_fn(misleading_labels, predictions)        grads = tape.gradient(g_loss, self.generator.trainable_weights)        self.g_optimizer.apply_gradients(zip(grads, self.generator.trainable_weights))        # 更新度量指标        self.d_loss_metric.update_state(d_loss)        self.g_loss_metric.update_state(g_loss)        return {            "d_loss": self.d_loss_metric.result(),            "g_loss": self.g_loss_metric.result(),        }

第五步:可视化自定义回调:

在每个时期结束时,GANMonitor类会创建并记录少量生成的图片。这些图片展示了生成器在训练过程中的发展。

class GANMonitor(keras.callbacks.Callback):    def __init__(self, num_img=3, latent_dim=128):        self.num_img = num_img        self.latent_dim = latent_dim    def on_epoch_end(self, epoch, logs=None):        random_latent_vectors = tf.random.normal(shape=(self.num_img, self.latent_dim))        generated_images = self.model.generator(random_latent_vectors)        generated_images *= 255        generated_images.numpy()        for i in range(self.num_img):            img = keras.utils.array_to_img(generated_images[i])            img.save("generated_img_%03d_%d.png" % (epoch, i))

第六步:编译和训练:

GAN模型使用二元交叉熵损失和Adam优化器进行编译。使用gan.fit方法对模型进行训练。使用名人脸图像数据集进行训练。

在每个时期结束后,使用GANMonitor回调保存生成的图片。

第七步:训练循环和可视化:

在训练过程中,GAN会交替更新鉴别器和生成器。

鉴别器的目标是正确分类真实和生成的图像,而生成器的目标是创建能够欺骗鉴别器的图像。使用GANMonitor回调保存每个时期后生成的图片。

代码参考:https://keras.io/examples/generative/dcgan_overriding_train_step/

源自:https://keras.io/examples/generative/dcgan_overriding_train_step/(这是30个时期的输出图像,质量会随着更多的时期提高)

别忘了在社交媒体平台上关注我们并分享你的观点。加入我们的AI爱好者社区,让我们一起推动生成式AI的边界。我们一起可以取得伟大的成就!🔐❤️

加入我们的LinkedIn群组,了解数据科学和网络安全!你将找到最新的博客、独家内容和其他爱好者。🔥

群组链接:https://www.linkedin.com/groups/9378874/

源自:https://giphy.com/

关注我们,获取相同有趣的数据科学博客和文章:💙

邮件:vidhiwaghela60@gmail.com

LinkedIn:https://www.linkedin.com/company/dsmcs/

Instagram:https://www.instagram.com/datasciencemeetscybersecurity/?hl=en

GitHub:https://github.com/Vidhi1290

Twitter:https://twitter.com/VidhiWaghela

VoAGI:https://medium.com/@datasciencemeetscybersecurity-

网站:https://www.datasciencemeetscybersecurity.com/

——数据科学与网络安全团队💙❤️

Leave a Reply

Your email address will not be published. Required fields are marked *