解析生成对抗网络(GAN):原理与应用

目录

一、引言

二、生成对抗网络原理

(一)基本架构

(二)训练过程

三、生成对抗网络的应用

(一)图像生成

无条件图像生成:

(二)数据增强

(三)风格迁移

四、生成对抗网络训练中的挑战与解决策略

(一)模式崩溃

(二)梯度消失


一、引言

生成对抗网络(GAN)自 2014 年被 Goodfellow 等人提出以来,在深度学习领域引起了广泛的关注和研究热潮。它创新性地引入了一种对抗训练的思想,通过生成器和判别器的相互博弈,使得生成器能够学习到数据的潜在分布,从而生成逼真的样本数据。这种独特的机制使得 GAN 在图像生成、文本生成、音频生成等多个领域展现出了巨大的潜力,为人工智能技术的发展带来了新的突破和方向。

二、生成对抗网络原理

(一)基本架构

GAN 主要由两个核心组件构成:生成器(Generator)和判别器(Discriminator)。

  1. 生成器
    • 生成器的任务是接收一个随机噪声向量 (通常从一个简单的分布,如标准正态分布 N(0,1)采样得到),并通过一系列的神经网络层将其映射为与真实数据相似的生成数据G(z)
    • 例如,在图像生成任务中,生成器的输出将是一张与训练数据集中图像具有相似特征的合成图像。
    • 生成器通常采用多层的反卷积神经网络(Deconvolutional Neural Network)或转置卷积神经网络(Transposed Convolutional Neural Network)结构。以生成64*64其网络结构如下:
      import torch
      import torch.nn as nnclass Generator(nn.Module):def __init__(self):super(Generator, self).__init__()# 输入为 100 维的噪声向量self.fc = nn.Linear(100, 4 * 4 * 1024)self.deconv1 = nn.ConvTranspose2d(1024, 512, kernel_size=4, stride=2, padding=1)self.bn1 = nn.BatchNorm2d(512)self.deconv2 = nn.ConvTranspose2d(512, 256, kernel_size=4, stride=2, padding=1)self.bn2 = nn.BatchNorm2d(256)self.deconv3 = nn.ConvTranspose2d(256, 128, kernel_size=4, stride=2, padding=1)self.bn3 = nn.BatchNorm2d(128)self.deconv4 = nn.ConvTranspose2d(128, 3, kernel_size=4, stride=2, padding=1)def forward(self, x):x = self.fc(x)x = x.view(-1, 1024, 4, 4)x = torch.relu(self.bn1(self.deconv1(x)))x = torch.relu(self.bn2(self.deconv2(x)))x = torch.relu(self.bn3(self.deconv3(x)))x = torch.tanh(self.deconv4(x))return x

  2. 判别器
  • 判别器的作用是区分输入的数据是来自真实数据分布还是由生成器生成的数据。它接收真实数据 x 或生成数据 G(z),并输出一个表示数据真实性的概率值  D(x)或D(G(z)) ,取值范围在 0 到  1之间,接近  表示数据更可能是真实的,接近  表示数据更可能是生成的。

判别器通常采用卷积神经网络(Convolutional Neural Network)结构。例如,对于判断  彩色图像的判别器网络结构如下:

class Discriminator(nn.Module):def __init__(self):super(Discriminator, self).__init__()self.conv1 = nn.Conv2d(3, 128, kernel_size=4, stride=2, padding=1)self.bn1 = nn.BatchNorm2d(128)self.conv2 = nn.Conv2d(128, 256, kernel_size=4, stride=2, padding=1)self.bn2 = nn.BatchNorm2d(256)self.conv3 = nn.Conv2d(256, 512, kernel_size=4, stride=2, padding=1)self.bn3 = nn.BatchNorm2d(512)self.conv4 = nn.Conv2d(512, 1, kernel_size=4, stride=2, padding=0)def forward(self, x):x = torch.relu(self.bn1(self.conv1(x)))x = torch.relu(self.bn2(self.conv2(x)))x = torch.relu(self.bn3(self.conv3(x)))x = torch.sigmoid(self.conv4(x))return x.view(-1)

(二)训练过程

GAN 的训练过程是一个对抗性的迭代过程。

三、生成对抗网络的应用

(一)图像生成

1.无条件图像生成

GAN 可以用于生成各种类型的图像,如人脸图像、风景图像等。例如,在人脸图像生成任务中,通过在大规模人脸数据集上训练 GAN,生成器能够学习到人脸的各种特征,如五官的形状、肤色、表情等,从而生成全新的、逼真的人脸图像。

代码示例:

# 假设已经定义好生成器 G 和判别器 D,以及相关的优化器和损失函数
# 训练循环
num_epochs = 100
for epoch in range(num_epochs):for i, (real_images, _) in enumerate(dataloader):# 训练判别器# 采样噪声z = torch.randn(real_images.shape[0], 100).to(device)# 生成假图像fake_images = G(z)# 计算判别器损失real_loss = criterion(D(real_images), torch.ones(real_images.shape[0]).to(device))fake_loss = criterion(D(fake_images.detach()), torch.zeros(fake_images.shape[0]).to(device))d_loss = (real_loss + fake_loss) / 2# 更新判别器参数d_optimizer.zero_grad()d_loss.backward()d_optimizer.step()# 训练生成器# 再次采样噪声z = torch.randn(real_images.shape[0], 100).to(device)# 生成假图像fake_images = G(z)# 计算生成器损失g_loss = criterion(D(fake_images), torch.ones(fake_images.shape[0]).to(device))# 更新生成器参数g_optimizer.zero_grad()g_loss.backward()g_optimizer.step()

2.条件图像生成

可以通过在生成器和判别器的输入中加入条件信息,实现条件图像生成。例如,根据给定的文本描述生成相应的图像,或者根据特定的类别标签生成属于该类别的图像。

以根据类别标签生成图像为例,在生成器的输入中除了噪声向量 ,还加入类别标签的编码向量 ,生成器的网络结构需要进行相应修改,如:

class ConditionalGenerator(nn.Module):def __init__(self, num_classes):super(ConditionalGenerator, self).__init__()# 输入为 100 维噪声向量和类别编码向量self.fc = nn.Linear(100 + num_classes, 4 * 4 * 1024)# 后续的反卷积层与无条件生成器类似self.deconv1 = nn.ConvTranspose2d(1024, 512, kernel_size=4, stride=2, padding=1)self.bn1 = nn.BatchNorm2d(512)#...def forward(self, x, y):# 拼接噪声向量和类别编码向量x = torch.cat([x, y], dim=1)x = self.fc(x)x = x.view(-1, 1024, 4, 4)x = torch.relu(self.bn1(self.deconv1(x)))#...return x

(二)数据增强

  • 图像数据增强
    • 在图像分类、目标检测等任务中,数据量不足可能导致模型过拟合。GAN 可以用于生成额外的图像数据来扩充数据集。通过在原始图像数据集上训练 GAN,生成与原始图像相似但又有一定变化的图像,如不同角度、光照条件下的图像,从而增加数据的多样性,提高模型的泛化能力。
  • 其他数据类型的数据增强
    • 除了图像数据,GAN 也可以应用于其他数据类型的数据增强,如文本数据。例如,通过生成与原始文本相似的新文本,扩充文本数据集,有助于训练更强大的文本处理模型,如文本分类、机器翻译等模型。

(三)风格迁移

  • 图像风格迁移原理
    • GAN 可以实现图像风格迁移,即将一幅图像的内容与另一幅图像的风格进行融合。其原理是通过定义内容损失和风格损失,利用生成器生成具有目标风格的图像,同时判别器用于判断生成图像的质量和风格一致性。
    • 例如,使用预训练的 VGG 网络来计算内容损失和风格损失。内容损失衡量生成图像与原始内容图像在特征表示上的差异,风格损失衡量生成图像与目标风格图像在风格特征(如纹理、颜色分布等)上的差异。

代码示例实现风格迁移

import torchvision.models as models
import torch.nn.functional as F# 加载预训练的 VGG 网络
vgg = models.vgg19(pretrained=True).features.eval().to(device)# 定义内容损失函数
def content_loss(content_features, generated_features):return F.mse_loss(content_features, generated_features)# 定义风格损失函数
def style_loss(style_features, generated_features):style_loss = 0for s_feat, g_feat in zip(style_features, generated_features):# 计算 Gram 矩阵s_gram = gram_matrix(s_feat)g_gram = gram_matrix(g_feat)style_loss += F.mse_loss(s_gram, g_gram)return style_loss# Gram 矩阵计算函数
def gram_matrix(x):b, c, h, w = x.size()features = x.view(b * c, h * w)gram = torch.mm(features, features.t())return gram.div(b * c * h * w)

四、生成对抗网络训练中的挑战与解决策略

(一)模式崩溃

问题描述

模式崩溃是 GAN 训练中常见的问题之一,表现为生成器生成的样本多样性不足,往往集中在少数几种模式上。例如,在生成人脸图像时,可能生成的人脸都具有相似的特征,而不能涵盖人脸的多种可能形态。

解决策略

Wasserstein GAN(WGAN):WGAN 对 GAN 的损失函数进行了改进,采用 Wasserstein 距离来衡量真实数据分布和生成数据分布之间的差异,而不是传统的 JS 散度。这使得训练过程更加稳定,减少了模式崩溃的发生。其关键代码修改如下:

# 判别器的最后一层不再使用 Sigmoid 激活函数
self.conv4 = nn.Conv2d(512, 1, kernel_size=4, stride=2, padding=0)
# 定义 WGAN 的损失函数
def wgan_loss(real_pred, fake_pred):return -torch.mean(real_pred) + torch.mean(fake_pred)

模式正则化:通过在生成器的损失函数中加入正则化项,鼓励生成器生成更多样化的样本。例如,在生成器的损失函数中加入对生成样本的熵约束,使得生成样本的分布更加均匀。

(二)梯度消失

  • 问题描述
    • 在 GAN 训练初期,当判别器的性能非常好时,生成器的梯度可能会变得非常小,导致生成器难以更新参数,无法有效地学习到数据的分布。这是因为判别器能够很容易地区分真实数据和生成数据,使得生成器的损失函数接近饱和,梯度趋近于 。
  • 解决策略
    • 梯度惩罚(Gradient Penalty):在判别器的损失函数中加入梯度惩罚项,限制判别器的梯度大小,使得判别器不会过于强大,从而缓解生成器的梯度消失问题。例如,在 WGAN-GP(Wasserstein GAN with Gradient Penalty)中,梯度惩罚项的计算如下:
      def gradient_penalty(critic, real, fake, device):BATCH_SIZE, C, H, W = real.shape# 随机采样插值系数alpha = torch.rand((BATCH_SIZE, 1, 1, 1)).repeat(1, C, H, W).to(device)# 计算插值数据interpolated_images = real * alpha + fake * (1 - alpha)# 计算判别器对插值数据的输出mixed_scores = critic(interpolated_images)# 计算梯度gradient = torch.autograd.grad(inputs=interpolated_images,outputs=mixed_scores,grad_outputs=torch.ones_like(mixed_scores),create_graph=True,retain_graph=True,)[0]# 计算梯度惩罚项gradient = gradient.view(gradient.shape[0], -1)gradient_norm = gradient.norm(2, dim=1)gradient_penalty = torch.mean((gradient_norm - 1) ** 2)return gradient_penalty

    • 使用 Leaky ReLU 激活函数:在判别器和生成器的网络中使用 Leaky ReLU 激活函数替代传统的 ReLU 激活函数。Leaky ReLU 允许在负半轴有一个较小的斜率,从而避免了在某些情况下神经元完全不激活导致的梯度消失问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/62204.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker 安装mysql8.4.0

1、拉取mysql8.4.0镜像 docker pullmysql:8.4.0-oraclelinux8查看镜像 docker images2、新建宿主机本地目录:用来挂载MySQL容器所产生的数据的目录 mkdir -p /home/admin/data/mysql /home/admin/logs/mysql /home/admin/conf/mysql3、在/home/admin/conf/mysql目…

ABAP OOALV模板

自用模板,可能存在问题 一、主程序 *&---------------------------------------------------------------------* *& Report ZVIA_OO_ALV *&---------------------------------------------------------------------* REPORT ZVIA_OO_ALV.INCLUDE ZVI…

DeepSpeed-chat RLHF实战

轩辕-6bRLHF落地实战 模型介绍:轩辕-6B 模型库 (modelscope.cn) 1.1偏好数据集构建 ​ 1.1.1Prompt构建 1.1.2 Response生成 保证RM训练数据和测试数据分布一致 使用模型来生成response,为了评价response的质量,可以提高采样参数中的…

通过抓包,使用frida定位加密位置

首先我们抓取一下我们要测试的app的某一个目标api,通过抓api的包,得到关键字。 例如:关键字:x-sap-ri 我们得到想要的关键字后,通过拦截 类,寻找我们的关键字,及找到发包收包的位置&#xff0c…

无线WiFi网络版毫米波雷达人体传感器,智能家居节能减排照明有人无人识别

在这个科技日新月异的时代,智能家居已经不再是遥不可及的未来概念,而是悄然融入了我们的日常生活,为我们的生活带来了未有的便捷与舒适。今天,让我们一起探索一项创新性的智能家居技术——飞睿智能无线WiFi网络版毫米波雷达人体传…

Linux介绍与安装指南:从入门到精通

1. Linux简介 1.1 什么是Linux? Linux是一种基于Unix的操作系统,由Linus Torvalds于1991年首次发布。Linux的核心(Kernel)是开源的,允许任何人自由使用、修改和分发。Linux操作系统通常包括Linux内核、GNU工具集、图…

26.100ASK_T113-PRO 测试摄像头 输出信息

1.测试代码 读到摄象头参数 输出 video_test.c #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/ioctl.h> #include <unistd.h> #include <stdio.h> #include <string.h> #include <linux/type…

Qt读写Usb设备的数据

Qt读写Usb设备的数据 问题:要读取usb设备进行通讯&#xff0c;qt好像没有对应的库支持。解决&#xff1a;libusbwindow下载 :Linux下载: QtUsb 开源的第三方库库里面的函数说明&#xff1a;window版本&#xff1a;Linux中也提供的直接下载测试代码&#xff1a;库下载&#xff1…

2024最新python使用yt-dlp

2024最新python使用yt-dlp下载YT视频 1.获取yt的cookie1&#xff09;google浏览器下载Get cookies.txt LOCALLY插件2&#xff09;导出cookie 2.yt-dlp下载[yt-dlp的GitHub地址](https://github.com/yt-dlp/yt-dlp?tabreadme-ov-file)1&#xff09;使用Pycharm(2024.3)进行代码…

python学opencv|读取图像

【1】引言 前序学习了使用matplotlib模块进行画图&#xff0c;今天开始我们逐步尝试探索使用opencv来处理图片。 【2】学习资源 官网的学习链接如下&#xff1a; OpenCV: Getting Started with Images 不过读起来是英文版&#xff0c;可能略有难度&#xff0c;所以另推荐一…

27加餐篇:gRPC框架的优势与不足之处

gRPC作为一个现代的、开源的远程过程调用(RPC)框架,在多个方面都展现了其优雅之处,同时也存在一些不足之处。这篇文章我们就相对全面的分析一下gRPC框架那些优雅的地方和不足的地方。 优雅的地方 gRPC作为一个RPC框架,在编码、传输协议已经支持多语言方面都比较高效,下…

linux模拟HID USB设备及wireshark USB抓包配置

文章目录 1. 内核配置2. 设备配置附 wireshark USB抓包配置 linux下模拟USB HID设备的简单记录&#xff0c;其他USB设备类似。 1. 内核配置 内核启用USB Gadget&#xff0c;使用fs配置usb device信息。 Device Drivers ---> [*] USB support ---><*> USB …

Ubuntu20.04运行R-VIO2

目录 1.环境配置2.构建项目3. 运行 VIO 模式4.结果图 1.环境配置 CMakeLists.txt中 C 使用 14、opencv使用4 2.构建项目 克隆代码库&#xff1a; 在终端中执行以下命令克隆项目&#xff1a;git clone https://github.com/rpng/R-VIO2.git编译项目&#xff1a; 使用 catkin_m…

基于YOLOv8深度学习的智慧课堂教师上课行为检测系统研究与实现(PyQt5界面+数据集+训练代码)

随着人工智能技术的迅猛发展&#xff0c;智能课堂行为分析逐渐成为提高教学质量和提升教学效率的关键工具之一。在现代教学环境中&#xff0c;能够实时了解教师的课堂表现和行为&#xff0c;对于促进互动式教学和个性化辅导具有重要意义。传统的课堂行为分析依赖于人工观测&…

wireshark基础

免责声明&#xff1a; 笔记的只是方便各位师傅学习知识&#xff0c;以下代码、网站只涉及学习内容&#xff0c;其他的都与本人无关&#xff0c;切莫逾越法律红线&#xff0c;否则后果自负。 泷羽sec官网&#xff1a;https://longyusec.com/ 泷羽sec B站地址&#xff1a;https:/…

单例模式入门

单例模式是一种创建型设计模式&#xff0c; 让你能够保证一个类只有一个实例&#xff0c; 并提供一个访问该实例的全局节点。 它的运作方式是这样的&#xff1a; 如果你创建了一个对象&#xff0c; 同时过一会儿后你决定再创建一个新对象&#xff0c; 此时你会获得之前已创建的…

圆域函数的傅里叶变换和傅里叶逆变换

空域圆域函数的傅里叶变换 空域圆域函数&#xff08;也称为空间中的圆形区域函数&#xff09;通常指的是在二维空间中&#xff0c;以原点为中心、半径为 a a a的圆内取值为1&#xff0c;圆外取值为0的函数。这种函数可以表示为&#xff1a; f ( x , y ) { 1 if x 2 y 2 ≤ …

【大模型】深度解析 NLP 模型5大评估指标及 应用案例:从 BLEU、ROUGE、PPL 到METEOR、BERTScore

在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;无论是机器翻译、文本生成&#xff0c;还是问答系统开发&#xff0c;模型性能评估指标始终是开发者绕不开的工具。BLEU、ROUGE、PPL&#xff08;困惑度&#xff09;、METEOR 和 BERTScore 是五个最具代表性的指标&am…

黑马程序员Java项目实战《苍穹外卖》Day01

苍穹外卖-day01 课程内容 软件开发整体介绍苍穹外卖项目介绍开发环境搭建导入接口文档Swagger 项目整体效果展示&#xff1a; ​ 管理端-外卖商家使用 ​ 用户端-点餐用户使用 当我们完成该项目的学习&#xff0c;可以培养以下能力&#xff1a; 1. 软件开发整体介绍 作为一…

Java高级特性 - IO流

第1关 什么是IO流 BC,C 第2关 字节流-输入输出 第3关 字符流 - 输入输出 第4关 复制文件