怎样在Python中通过PyTorch构建GAN生成对抗网络

千辰小哥_3277

千辰小哥_3277

2026-10-15

945人浏览

原创

pytorch中gan最小可运行结构包含生成器(输入噪声→图像,末层tanh)、判别器(输入图像→真假概率,末层不加sigmoid)、两个adam优化器、bcewithlogitsloss损失函数,数据需归一化至[-1,1]并统一送入gpu,噪声每轮重采样,训练时交替更新且判别器先于生成器。

怎样在python中通过pytorch构建gan生成对抗网络

PyTorch里GAN的最小可运行结构长什么样

GAN在PyTorch中没有现成的torch.nn.GAN模块,必须手动组合Generator和Discriminator两个子网络,并分别定义各自的损失与优化逻辑。最简结构就是:一个生成器(输入噪声→输出图像),一个判别器(输入图像→输出真假概率),外加两套optim.Adam优化器和nn.BCELoss或nn.BCEWithLogitsLoss——后者更稳定,推荐直接用。

常见错误是把生成器和判别器共用同一个优化器,或者误用nn.CrossEntropyLoss(它要求整数标签,而GAN输出的是标量概率)。

  • Generator最后一层通常用nn.Tanh()(输出范围[-1,1]),配合transforms.Normalize((0.5,), (0.5,))归一化输入
  • Discriminator最后一层**不要**加sigmoid——用nn.BCEWithLogitsLoss自动处理logits更数值稳定
  • 训练时先固定Discriminator更新一次Generator,再固定Generator更新一次Discriminator,顺序不能反

为什么生成器loss突然变成nan或爆炸

这几乎总是梯度问题:判别器太强导致生成器收到的梯度方向剧烈震荡,尤其当判别器已接近“完美分类”(loss≈0)时,log(1 - D(G(z)))项会趋向log(0)引发数值溢出。

解决方式不是调小学习率,而是换损失形式:

python-parallelization
python-parallelization

将顺序 Python 代码转换为并行/并发实现,用于在需要并行化 Python 代码、提升性能时使用。

下载
  • 用nn.BCEWithLogitsLoss替代手写log(1 - D_fake),它内部做了log-sum-exp稳定化
  • 判别器loss用真实样本标签ones_like、假样本标签zeros_like;生成器loss则统一用ones_like(即“骗过判别器”)
  • 加梯度裁剪:torch.nn.utils.clip_grad_norm_(netG.parameters(), max_norm=1.0)

如何让MNIST上GAN快速出图(不跑CIFAR-10)

MNIST维度低、结构简单,适合验证GAN流程是否走通。关键不是堆深度,而是对齐数据流和设备:

  • 加载数据必须用transforms.Normalize((0.5,), (0.5,)),否则生成器输出全黑或全白
  • 所有tensor要统一进GPU:real_imgs = real_imgs.to(device),漏掉任何一处都会报Expected all tensors to be on the same device
  • 噪声z每次迭代必须重新采样:z = torch.randn(batch_size, nz, 1, 1).to(device),复用旧z会导致生成结果卡死
  • 生成器建议用转置卷积nn.ConvTranspose2d,通道数从100→256→128→1,kernel_size=4,stride=2,padding=1

保存和复现生成结果时容易忽略什么

训练中途保存模型只存state_dict()不够,必须同时保存随机种子和噪声固定值。否则即使load了相同权重,每次torch.randn出来的图也完全不同。

调试阶段务必做两件事:

  • 训练前固定:torch.manual_seed(42); np.random.seed(42)
  • 生成样本时用固定噪声:fixed_noise = torch.randn(64, nz, 1, 1).to(device),后续每轮都用它,才能观察生成质量是否提升
  • 保存图片别用plt.imshow直接显示——它默认插值,改用torchvision.utils.save_image保证像素级准确

GAN收敛慢、模式崩塌常见,但第一步能用MNIST跑通并稳定生成数字,就说明骨架没搭错。后面换数据集,只是调整网络宽度和归一化参数的事。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1751

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4524

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1729

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

26697

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3227

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3247

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1183

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2523

5

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习