当前位置: 首页 > news >正文

AI学习指南深度学习篇-生成对抗网络的基本原理

AI学习指南深度学习篇-生成对抗网络的基本原理

引言

生成对抗网络(Generative Adversarial Networks, GANs)是近年来深度学习领域的一个重要研究方向。GANs通过一种创新的对抗训练机制,能够生成高质量的样本,其应用范围广泛,从图像生成到数据增强等均有应用。本文将详细介绍生成对抗网络的基本原理,包括生成器和判别器的结构、博弈过程,以及如何通过对抗训练学习生成逼真的数据样本。

1. 生成对抗网络的基本概念

生成对抗网络的核心思想是通过两个网络——生成器(Generator)和判别器(Discriminator)——之间的对抗博弈,来实现数据的生成任务。生成器的目标是生成尽可能真实的样本,而判别器的目标则是区分真实样本与生成样本。

1.1 生成器(Generator)

生成器是一个从随机噪声中生成数据的模型。它接收一个随机噪声向量 ( z ) 作为输入,经过一系列的变换,输出一个生成样本 ( G(z) )。生成器可以设计为各种深度学习架构,比如全连接层、卷积层等。其基本目标是通过不断调整参数,使得生成的数据在某种程度上能够“欺骗”判别器。

1.2 判别器(Discriminator)

判别器是一个二分类模型,其目标是判断输入样本是真实的还是生成的。它接收样本 ( x ) 作为输入,输出一个在0和1之间的值,表示该样本为真实样本的概率。判别器通常也采用深度学习架构,通过逐层提取特征,来提高样本区分的能力。

2. GAN的博弈过程

生成对抗网络的训练过程可以被看作是一个博弈过程。在这个博弈中,生成器和判别器分别玩家 ( G ) 和 ( D )。

2.1 博弈的目标

对于生成器和判别器的损失函数,可以写作:

  • 生成器损失 L G L_G LG:

L G = − E z ∼ p z [ log ⁡ D ( G ( z ) ) ] L_G = -\mathbb{E}_{z \sim p_z}[\log D(G(z))] LG=Ezpz[logD(G(z))]

生成器希望最大化其生成样本被判别器判断为真实样本的概率。

  • 判别器损失 L D L_D LD:

L D = − E x ∼ p d a t a [ log ⁡ D ( x ) ] − E z ∼ p z [ log ⁡ ( 1 − D ( G ( z ) ) ) ] L_D = -\mathbb{E}_{x \sim p_{data}}[\log D(x)] - \mathbb{E}_{z \sim p_z}[\log (1 - D(G(z)))] LD=Expdata[logD(x)]Ezpz[log(1D(G(z)))]

判别器的目标是最大化真实样本被正确判断的概率,同时最小化生成样本被判断为真实的概率。

2.2 完整的对抗训练流程

在训练过程中,生成器和判别器交替更新:

  1. 固定生成器,更新判别器:使用真实样本和生成样本来训练判别器,使其学习更准确地分类二者。

  2. 固定判别器,更新生成器:通过更新生成器,使其生成的样本更加接近真实样本,从而让判别器更难以区分。

这种交替的训练方式,通过不断调整两者的参数,使得生成器能够不断改进,从而最终生成高质量的样本。

3. 生成对抗网络的实施细节

3.1 网络结构设计

在实施生成对抗网络时,网络的结构设计非常重要。我们以最常用的DCGAN(Deep Convolutional GAN)为例进行说明。

3.1.1 生成器网络

DCGAN中的生成器通常采用卷积转置层(transposed convolutional layers),如下图所示:

import tensorflow as tf
from tensorflow.keras import layersdef build_generator(latent_dim):model = tf.keras.Sequential()model.add(layers.Dense(256, input_dim=latent_dim))model.add(layers.LeakyReLU(alpha=0.2))model.add(layers.BatchNormalization(momentum=0.8))model.add(layers.Dense(512))model.add(layers.LeakyReLU(alpha=0.2))model.add(layers.BatchNormalization(momentum=0.8))model.add(layers.Dense(1024))model.add(layers.LeakyReLU(alpha=0.2))model.add(layers.BatchNormalization(momentum=0.8))model.add(layers.Dense(784, activation="tanh"))  # 28x28 imagesmodel.add(layers.Reshape((28, 28, 1)))return model
3.1.2 判别器网络

判别器网络结构较为简单,使用卷积层来提取特征:

def build_discriminator(img_shape):model = tf.keras.Sequential()model.add(layers.Conv2D(32, kernel_size=3, strides=2, input_shape=img_shape, padding="same"))model.add(layers.LeakyReLU(alpha=0.2))model.add(layers.Conv2D(64, kernel_size=3, strides=2, padding="same"))model.add(layers.LeakyReLU(alpha=0.2))model.add(layers.Flatten())model.add(layers.Dense(1, activation="sigmoid"))return model

3.2 训练过程

在训练生成对抗网络时,我们需要对数据进行预处理,并按照定义好的流程进行训练。

3.2.1 数据预处理

在MNIST手写数字数据集中,每个图像的尺寸为28x28,可以进行如下的数据预处理:

from tensorflow.keras.datasets import mnist(x_train, _), (_, _) = mnist.load_data()
x_train = (x_train.astype(np.float32) - 127.5) / 127.5  # Scale images to [-1, 1]
x_train = np.expand_dims(x_train, axis=-1)
3.2.2 训练循环

在训练循环中,需要实现对判别器和生成器的交替训练过程:

import numpy as np# Hyperparameters
latent_dim = 100
epochs = 10000
batch_size = 64# Build models
generator = build_generator(latent_dim)
discriminator = build_discriminator((28, 28, 1))# Compile discriminator
discriminator.compile(loss="binary_crossentropy", optimizer="adam", metrics=["accuracy"])# GAN model
discriminator.trainable = False
gan_input = layers.Input(shape=(latent_dim,))
fake_image = generator(gan_input)
gan_output = discriminator(fake_image)
gan_model = tf.keras.Model(gan_input, gan_output)
gan_model.compile(loss="binary_crossentropy", optimizer="adam")for epoch in range(epochs):# Train Discriminatoridx = np.random.randint(0, x_train.shape[0], batch_size)real_images = x_train[idx]noise = np.random.normal(0, 1, (batch_size, latent_dim))fake_images = generator.predict(noise)d_loss_real = discriminator.train_on_batch(real_images, np.ones((batch_size, 1)))d_loss_fake = discriminator.train_on_batch(fake_images, np.zeros((batch_size, 1)))d_loss = 0.5 * np.add(d_loss_real, d_loss_fake)# Train Generatornoise = np.random.normal(0, 1, (batch_size, latent_dim))g_loss = gan_model.train_on_batch(noise, np.ones((batch_size, 1)))# Print progressif epoch % 1000 == 0:print(f"{epoch} [D loss: {d_loss[0]:.4f}, accuracy: {100 * d_loss[1]:.2f}] [G loss: {g_loss:.4f}]")

4. 生成对抗网络的应用

生成对抗网络不仅限于生成图像,还可以应用于多个领域,包括文本生成、语音合成和视频生成等。以下是几个典型应用场景的介绍。

4.1 图像生成

GANs最初的应用场景之一是图像生成,通过训练生成器方法生成与真实图像相似的新图像。例如,使用GANs生成新的手写数字、脸部图像等。

4.2 数据增强

在机器学习中,由于数据的缺乏或样本偏差,GANs也被用作数据增强的工具,尤其在医学图像等领域中,通过生成合成图像来丰富训练集数据,从而提高模型的泛化能力。

4.3 风格迁移

GANs可用于图像风格迁移,例如将真实图像转化为绘画风格,或将白天的场景转换为夜晚效果等。

4.4 语音生成

除了图像,GANs还在语音合成中得到了应用,如生成自然流畅的语音,通过对抗训练提升合成语音的质量。

4.5 其他应用

GANs的灵活性使其可以广泛应用于图像修复、超级分辨率、3D形状生成等多个领域。

5. 生成对抗网络的挑战与未来

尽管生成对抗网络在许多任务中表现出色,但仍面临许多挑战:

  1. 模式崩溃(Mode Collapse):生成器可能只生成少量样本而忽略其他样本。这个问题在训练过程中频繁出现,影响了生成数据的多样性。

  2. 训练不稳定:GANs的训练过程复杂且容易不稳定,可能导致模式崩溃或网络发散。需要合理设计超参数、网络结构及优化算法。

  3. 评估标准缺失:目前尚未有全面、公正的评估标准来衡量生成样本的质量。常用的评估方式,例如Frechet Inception Distance (FID)和Inception Score (IS),虽然有效,但仍存在局限。

未来,生成对抗网络的研究方向可能集中在改善模型的稳定性、多样性以及扩展其功能等。

结语

生成对抗网络的出现为数据生成领域带来了革命性的进展。通过引入对抗训练的方式,GANs能够有效地生成高质量的样本。尽管当前仍面临许多挑战,但无可否认的是,GANs在图像、文本和其他领域的应用展现了其强大的潜力。在接下来的发展中,我们期待GANs能带来更多令人惊喜的成果。

以上便是关于生成对抗网络的基本原理及其应用的详细介绍,希望可以帮助读者更好地理解这一前沿技术的魅力与潜力。

相关文章:

AI学习指南深度学习篇-生成对抗网络的基本原理

AI学习指南深度学习篇-生成对抗网络的基本原理 引言 生成对抗网络(Generative Adversarial Networks, GANs)是近年来深度学习领域的一个重要研究方向。GANs通过一种创新的对抗训练机制,能够生成高质量的样本,其应用范围广泛&…...

什么是网络安全

网络安全是指通过采取必要措施,防范对网络的攻击、侵入、干扰、破坏和非法使用以及意外事故,使网络处于稳定可靠运行的状态,以及保障网络数据的完整性、保密性、可用性的能力。 网络安全涉及多个层面,包括硬件、软件及其系统中数…...

Redis list 类型

list类型 类型介绍 列表类型 list 相当于 数组或者顺序表 list内部的编码方式更接近于 双端队列 ,支持头插 头删 尾插 尾删。 需要注意的是,Redis的下标支持负数下标。 比如数组大小为5,那么要访问下标为 -2 的值可以理解为访问 5 - 2 3 …...

Linux更改固定IP地址

1.VMware里更改虚拟网络 一: 二: 三:确定就好了 2.修改Linux系统的固定IP 一:进入此文件 效果如下: 执行以下命令: 此时IP已更改 3.远程连接 这个是前提!!! 更改网络编辑器后网络适配器可能会修改,我就是遇着这个,困住我了一会 一:可以以主机IP对应连接 连接成功 二:主机名连…...

Qt+大恒相机回调图片刷新使用方式

一、前言 上篇文章介绍了如何调用大恒SDK获得回调图片,这篇介绍如何使用这些图片并刷新到界面上。考虑到相机的帧率很高,比如200fps是很高的回调频率。那么我们的刷新频率是做不到这么快,也没必要这么快。一般刷新在60帧左右就够了。 二、思路…...

Docker 环境下 PostgreSQL 监控实战:从 Exporter 到 Prometheus 的部署详解

Docker 环境下 PostgreSQL 监控实战:从 Exporter 到 Prometheus 的部署详解 文章目录 Docker 环境下 PostgreSQL 监控实战:从 Exporter 到 Prometheus 的部署详解一 节点简述二 节点监控部署1)创建 PostgreSQL 的 exporter 账号2)…...

构建带有调试符号的srsRAN 4G

### 构建带有调试符号 首先确保已下载srsRAN 4G,并已创建并导航至构建文件夹: bash git clone https://github.com/srsran/srsran_4g.git cd srsRAN_4G mkdir build cd build 若srsRAN 4G已构建完成,应清除原有构建文件夹后继续。 可以使…...

算法题总结(十)——二叉树上

#二叉树的递归遍历 // 前序遍历递归LC144_二叉树的前序遍历 class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> result new ArrayList<Integer>(); //也可以把result 作为全局变量&#xff0c;只需要一个函数即可。…...

【MySQL】MySQL 数据库主从复制详解

目录 1. 基本概念1.1 主从架构1.2 复制类型 2. 工作原理2.1 复制过程2.2 主要组件 3. 配置步骤3.1 准备工作3.2 在主服务器上配置3.3 在从服务器上配置 4. 监控和维护4.1 监控复制状态4.2 处理复制延迟4.3 故障恢复 5. 备份策略5.1 逻辑备份与物理备份5.2 增量备份 6. 使用场景…...

一种格式化printf hex 数据的方法

格式化输出HEX数据 调试过程中通常需要个格式化输出16进制数据&#xff0c;为了方便美观可以参考如下方法。 #define __is_print(ch) ((unsigned int)((ch) - ) < 127u - )/*** dump_hex* * brief hex打印* * param buf: 需要打印的原始数据* param size: 原始数据类型*…...

在LabVIEW中如何读取EXCEL

在LabVIEW中读取Excel文件通常使用“报告生成工具包”&#xff08;Report Generation Toolkit&#xff09;。以下是详细步骤&#xff1a; ​ 安装工具包&#xff1a;确保已安装“报告生成工具包”。这通常随LabVIEW一起提供&#xff0c;但需要单独安装。 创建VI&#xff1a; 打…...

布匹瑕疵检测数据集 4类 2800张 布料缺陷 带标注 voc yolo

布匹瑕疵检测数据集 4类 2800张 布料缺陷 带标注 voc yolo 对应标注&#xff0c;格式VOC (XML)&#xff0c;选配Y0L0(TXT) label| pic_ num| box_ _num hole: (425&#xff0c; 481) suspension_ wire: (1739&#xff0c; 1782) topbasi: (46&#xff0c; 46) dirty: (613&…...

灵动微高集成度电机MCU单片机

由于锂电技术的持续进步、消费者需求的演变、工具种类的革新以及应用领域的扩展&#xff0c;电动工具行业正呈现出无绳化、锂电化、大功率化、小型化、智能化和一机多能化的发展趋势。无绳化和锂电化的电动工具因其便携性和高效能的特性&#xff0c;已成为市场增长的重要驱动力…...

陪护小程序|护理陪护系统|陪护小程序成品

智能化&#xff0c;作为智慧医疗宏伟蓝图的基石&#xff0c;正引领着一场医疗服务的深刻变革。在这场变革的浪潮中&#xff0c;智慧医院小程序犹如璀璨新星&#xff0c;迅速崛起&#xff0c;而陪护小程序的诞生&#xff0c;更是如春风化雨&#xff0c;细腻地触及了老年病患、家…...

【JVM】基础篇

1 初识JVM 1.1 什么是JVM JVM 全称是 Java Virtual Machine&#xff0c;中文译名 Java虚拟机。JVM 本质上是一个运行在计算机上的程序&#xff0c;他的职责是运行Java字节码文件。 Java源代码执行流程如下&#xff1a; 分为三个步骤&#xff1a; 1、编写Java源代码文件。 …...

软件测试工程师 朝哪里进阶?

软件测试工程师 朝哪里进阶&#xff1f; 这里浅谈一下我的看法。 软件测试工程师 朝哪里进阶呢&#xff1f; 当我们测试工程师工作了2-3年后&#xff0c;就需要往前走往高走&#xff0c;就像一句名言说的&#xff1a;我们需要像ceo一样工作。 将自己的边界扩大一点&#xff0…...

Obsidian Plugin Release Pre-check

- [ ] 修改代码 - [ ] 修改README.md - [ ] 修改manifest.json - [ ] --将上述修改push到GitHub-- - [ ] 修改release版本 git tag git tag -a 1.0.6 -m "1.0.6" git push origin 1.0.6 ------------------------------------------- 备忘https://semver.org/lang/…...

Unity中实现预制体自动巡逻与攻击敌人的完整实现指南

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

OpenJudge | Shortest Prefixes

总时间限制: 1000ms 内存限制: 65536kB 描述 A prefix of a string is a substring starting at the beginning of the given string. The prefixes of “carbon” are: “c”, “ca”, “car”, “carb”, “carbo”, and “carbon”. Note that the empty string is not co…...

速盾:高防服务器是如何防御CC攻击的?

高防服务器是一种专门用于防御DDoS&#xff08;分布式拒绝服务&#xff09;攻击的服务器。其中一种常见的DDoS攻击就是CC&#xff08;连续性攻击&#xff09;&#xff0c;它通过向目标服务器发送大量的请求来耗尽服务器资源&#xff0c;使网站无法正常运行。高防服务器采用多种…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...