0

0

训练GANs的陷阱与提示

星夢妙者

星夢妙者

发布时间:2025-09-23 09:16:13

|

398人浏览过

|

来源于php中文网

原创

生成性对抗网络(gans)是深度学习领域近年来最引人注目的主题之一。最近几个月,关于gans的论文数量显著增加。gans已被应用于多种问题,如果您错过了这波潮流,这里有一份关于gans的有趣应用列表。

我已经阅读了许多关于GANs的文章,但自己从未尝试过。因此,在阅读了一些鼓舞人心的论文和GitHub项目后,我决定亲自训练一个简单的GAN,却很快遇到了问题。本文针对刚开始使用GANs的深度学习爱好者。除非您运气很好,否则首次尝试训练GAN可能会是一个令人沮丧的过程,可能需要花费数小时才能成功。当然,随着时间和经验的积累,您将会熟练掌握GANs的训练,但对于初学者来说,可能会遇到一些错误,甚至不知道从何处开始调试。我想分享我在首次从头开始训练GAN时的观察和经验,希望能帮助一些人节省几个小时的调试时间。

生成性对抗网络除非您在过去一年左右的时间里一直封闭在一个房间里,否则所有参与深度学习的人——甚至一些没有参与深度学习的人——都听说过并讨论过GANs。GANs或生成对抗网络是一种深度神经网络,是一种生成模型。这意味着,给定一组训练数据,GANs可以学习估计数据的基本概率分布。这非常有用,因为除了其他用途之外,我们现在可以根据原始训练集中可能不存在的学习概率分布生成样本。如上文链接中所列,这产生了一些非常有用的应用。

该领域的专家已经提供了几个惊人的资源来解释GANs及其工作原理,因此我不会尝试重复他们的工作。但为了完整性,这里有一个快速概述。

训练GANs的陷阱与提示GAN概述

生成性对抗网络实际上是两个相互竞争的深层网络。给定训练集X(例如几千张猫的图像),生成器网络G(X)将随机向量作为输入,并尝试生成类似于训练集中的图像。鉴别器网络D(X)是一种二元分类器,其试图根据训练集X和由生成器生成的假猫图像来区分真实猫图像。因此,生成器网络的工作是学习X中数据的分布,以便它可以生成真实的猫图像,并确保鉴别器无法区分训练集中的猫图像和生成器的猫图像。鉴别器需要学习跟上生成器的步伐,不断尝试新的技巧来生成假猫图像并欺骗鉴别器。

最终,如果一切顺利,生成器(或多或少)会学习训练数据的真实分布,并且真正擅长生成逼真的猫图像。鉴别器无法再区分训练集猫图像和生成的猫图像。

从这个意义上说,这两个网络不断地试图干扰另一个不能很好地完成他们的任务。那么,这到底是怎么回事呢?

另一种看待GAN设置的方法是,鉴别器试图通过告诉它真正的猫图像是什么样子来引导生成器。最终,生成器将其计算出来并开始生成逼真的猫图像。训练GANs的方法类似于博弈论中的Minimax算法,并且两个网络试图相对于彼此实现所谓的纳什均衡。如果您想更详细地了解这一点,请参阅底部的参考资料。

GAN训练面临的挑战回到GANs训练。首先,我使用Keras和TensorFlow后端,在MNIST数据集上训练了一个GAN(准确地说,是DC-GAN),这并不难。经过对生成器和鉴别器网络的一些小的调整,GAN能够生成清晰的MNIST数字图像。

训练GANs的陷阱与提示生成的MNIST数字

黑白数字只是非常有趣。物体和人物的彩色图像是所有酷家伙都喜欢玩的东西。这就是事情开始变得棘手的地方。在MNIST之后,明显的下一步是生成CIFAR-10图像。在日复一日地调整超参数、更改网络架构、添加和删除层之后,我终于能够生成类似CIFAR-10的外观不错的图像。

训练GANs的陷阱与提示使用DC-GAN生成的青蛙

训练GANs的陷阱与提示使用DC-GAN生成的汽车

我从一个相当深的(但大部分是不良的)网络开始,最终得到了一个实际有效的、简单得多的网络。当我开始调整网络和训练过程时,15个时期后生成的图像看起来像这样,

训练GANs的陷阱与提示接下来:

训练GANs的陷阱与提示最终:

训练GANs的陷阱与提示下面是我意识到自己犯过的错误以及我在此过程中学到的东西。因此,如果您是GANs的新手,并且在训练方面没有取得很大成功,那么查看以下方面可能会有所帮助:

免责声明:这只是我尝试过的事情和我得到的结果。我并没有声称已经解决了所有GAN训练问题。1.更大内核和更多过滤器

较大的内核覆盖了前一层图像中的更多像素,因此可以查看更多信息。5×5内核与CIFAR-10配合良好,在鉴别器中使用3×3内核导致鉴别器损耗迅速逼近0。对于生成器,您希望顶部卷积层中的较大内核保持某种平滑性。在较低层,我没有看到改变内核大小的任何重大影响。

过滤器的数量可以大量增加参数的数量,但通常需要更多的过滤器。我在几乎所有的卷积层中都使用了128个过滤器。使用较少的过滤器,尤其是在发生器中,使得最终生成的图像太模糊。因此,看起来更多的过滤器有助于捕获额外的信息,最终可以为生成的图像增加清晰度。

2.翻转标签(Generated = True,Real = False)虽然起初看起来很傻,但对我有用的一个主要技巧是改变标签分配。

如果您使用的是Real Images = 1和Generated Images = 0,那么反过来也会有所帮助。正如我们稍后将看到的,这有助于早期迭代中的梯度流,并有助于令事情发生变化。

3.软标签和噪音标签在训练鉴别器时这非常重要。有硬标签(1或0)几乎扼杀了所有早期学习,导致鉴别器非常迅速地接近0损失。我最终使用0到0.1之间的随机数来表示0个标签(真实图像)和0.9到1.0之间的随机数来表示1个标签(生成的图像)。训练生成器时不需要这样做。

此外,它还有助于为训练标签添加一些噪音。对于输入识别器的5%的图像,标签被随机翻转。即真实被标记为生成并且生成被标记为真实。

4.批量规范有帮助,但前提是你有其他的东西批处理规范化无疑有助于最终的结果。添加批处理规范后,生成的图像明显更清晰。但是,如果您错误地设置了内核或过滤器,或者识别器的损失很快达到0,添加批处理规范可能并不能真正帮助恢复。

训练GANs的陷阱与提示在网络中生成具有批处理规范层的车辆5.一次一堂课

Nanonets
Nanonets

基于AI的自学习OCR文档处理,自动捕获文档数据

下载

为了更容易地训练甘斯,确保输入数据具有相似的特性是很有用的。例如,与其在CIFAR-10的所有10个类中都训练GAN,不如选择一个类(例如,汽车或青蛙)并训练GAN从该类生成图像。DC-GAN的其他变体在学习生成多个类的图像方面做得更好。例如,以类标签为输入,生成基于类标签的图像。但是,如果你从一个普通的DC-GAN开始,最好保持过程简单。

6.看看梯度如果可能的话,试着监控梯度以及网络中的损耗。这些可以帮助你更好地了解训练的进展,甚至可以帮助你在工作不顺利的情况下进行调试。

理想情况下,生成器应该在训练早期接收大的梯度,因为它需要学习如何生成真实的数据。另一方面,鉴别器并不总是在早期获得大的梯度,因为它可以容易地区分真实和伪造的图像。一旦对生成器进行了足够的训练,鉴别器就会变得更难以区分假图像。它会不断出错并获得强大的梯度。

我在CIFAR-10汽车上的最初几个GAN版本,有许多卷积和批量规范层,没有标签翻转。除了趋势之外,监测梯度的规模也很重要。如果生成器层上的梯度太小,学习可能会很慢,或者根本不会发生。这在GAN的这个版本中是可见的。

训练GANs的陷阱与提示顶部生成器层的梯度(X轴:小批量迭代)

训练GANs的陷阱与提示底部生成器层的梯度(X轴:小批量迭代)

训练GANs的陷阱与提示顶部鉴别器层的梯度(X轴:小批量迭代)

训练GANs的陷阱与提示底部鉴别器层的梯度(X轴:小批量迭代)

在生成器的最下层梯度的规模太小,任何学习都无法进行。鉴别器的梯度始终是一致的,这表明鉴别器并没有真正学到任何东西。现在,让我们将其与GAN的梯度进行比较,GAN具有上面描述的所有变化,并生成良好的真实图像:

训练GANs的陷阱与提示顶部生成器层的梯度(X轴:小批量迭代)

训练GANs的陷阱与提示底部生成器层的梯度(X轴:小批量迭代)

训练GANs的陷阱与提示顶部鉴别器层的梯度(X轴:小批量迭代)

训练GANs的陷阱与提示底部鉴别器层的梯度(X轴:小批量迭代)

梯度到达生成器底层的比例明显高于前一个版本。此外,随着训练的进展,梯度流与预期一样,随着发生器在早期获得较大的梯度,一旦训练足够,鉴别器在顶层获得一致的高梯度。

7.没有提前停止我犯了一个愚蠢的错误——可能是由于我的不耐烦——当我看到损失没有任何明显的进展,或者生成的样本仍然有噪声时,在进行了几百次小批量培训之后,我就终止了培训。重新开始工作并节省时间比等待训练完成并最终意识到网络从未学过任何东西更有诱惑力。GANs需要花费很长时间来训练和初始几个损失值,并且生成的样本几乎从未显示任何趋势或进展迹象。在结束训练过程并调整设置之前,等待一段时间是很重要的。

此规则的一个例外是,如果您发现Discriminator损失迅速接近0。如果发生这种情况,则几乎没有恢复的可能性,最好重新开始训练,可能是在网络或培训过程中进行了更改之后。

最后的GAN是这样工作的:

训练GANs的陷阱与提示就是这样了。我希望这篇文章可以帮助任何人从头开始训练他们的第一个DC-GAN。以下是我关注的一些资源以及包含有关GAN的大量信息的其他资源:

GAN论文:生成性对抗网络

基于深度卷积生成对抗性网络的无监督表示学习

改进的GANs训练技术

其他链接:Training GANs: Better understanding and other improved techniques

NIPS 2016 GAN教程

有条件的GAN

Keras中用于最终工作版本的GAN代码可以在我的Github上找到。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
github中文官网入口 github中文版官网网页进入
github中文官网入口 github中文版官网网页进入

github中文官网入口https://docs.github.com/zh/get-started,GitHub 是一种基于云的平台,可在其中存储、共享并与他人一起编写代码。 通过将代码存储在GitHub 上的“存储库”中,你可以: “展示或共享”你的工作。 持续“跟踪和管理”对代码的更改。

4234

2026.01.21

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

497

2023.08.14

Python AI机器学习PyTorch教程_Python怎么用PyTorch和TensorFlow做机器学习
Python AI机器学习PyTorch教程_Python怎么用PyTorch和TensorFlow做机器学习

PyTorch 是一种用于构建深度学习模型的功能完备框架,是一种通常用于图像识别和语言处理等应用程序的机器学习。 使用Python 编写,因此对于大多数机器学习开发者而言,学习和使用起来相对简单。 PyTorch 的独特之处在于,它完全支持GPU,并且使用反向模式自动微分技术,因此可以动态修改计算图形。

27

2025.12.22

Python 深度学习框架与TensorFlow入门
Python 深度学习框架与TensorFlow入门

本专题深入讲解 Python 在深度学习与人工智能领域的应用,包括使用 TensorFlow 搭建神经网络模型、卷积神经网络(CNN)、循环神经网络(RNN)、数据预处理、模型优化与训练技巧。通过实战项目(如图像识别与文本生成),帮助学习者掌握 如何使用 TensorFlow 开发高效的深度学习模型,并将其应用于实际的 AI 问题中。

188

2026.01.07

TensorFlow2深度学习模型实战与优化
TensorFlow2深度学习模型实战与优化

本专题面向 AI 与数据科学开发者,系统讲解 TensorFlow 2 框架下深度学习模型的构建、训练、调优与部署。内容包括神经网络基础、卷积神经网络、循环神经网络、优化算法及模型性能提升技巧。通过实战项目演示,帮助开发者掌握从模型设计到上线的完整流程。

29

2026.02.10

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

1

2026.03.13

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

39

2026.03.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

140

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

47

2026.03.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 4.2万人学习

Git版本控制工具
Git版本控制工具

共8课时 | 1.6万人学习

Git中文开发手册
Git中文开发手册

共0课时 | 94人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号