【GAN】基础原理讲解及代码实践

GAN模型代码——相关包安装及函数功能说明 from collections import OrderedDict # OrderedDict是有序字典,“有序”是指它可以记住向字典里添加元素的顺序。 self.layers = OrderedDict() 使用误差反向传播 import numpy as np from common.layers import * from common.gradient import numeri... 阅读详情

首先什么是GAN:

 

 

 

 

 

 

 

 

GAN的模型结构

 

设计GAN模型的关键:

 

 

 GAN的算法原理:

 

 

 

这里输入噪声的随机性就可以带来生成图像的多样性

 

 

 

 

 GAN公式讲解:

 

 

 

 D(x)表示判别器对真实图片的判别,取对数函数后我们希望其值趋于0,也就是D(x)趋于1,也就是放大损失。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 GAN代码实践(基于jupyter,顺序执行即可):

导包

import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
import numpy as np
import matplotlib.pyplot as plt
import torchvision
from torchvision import transforms

torch.__version__

数据准备

# 对数据做归一化 (-1, 1)对gan的输入数据全部规范化到(-1,1)之间
transform = transforms.Compose([   #transform做变形
    transforms.ToTensor(),         # ToTensor会将图像像素值转换为0-1; channel, high, witch,
    transforms.Normalize(0.5, 0.5) #然后我们通过均值为0.5,方差为0.5将数据规范化到(-1,1)
])


train_ds = torchvision.datasets.MNIST('data',
                                      train=True,
                                      transform=transform,
                                      download=True)#定义MNIST数据集


dataloader = torch.utils.data.DataLoader(train_ds, batch_size=64, shuffle=True)#加载数据集,打乱,batch_size设置为64
#%%
imgs, _ = next(iter(dataloader))#加载一个批次的图片(64张)
#%%
imgs.shape

 

定义生成器

# 输入是长度为 100 的 噪声(符合正态分布的随机数)
# 输出为(1, 28, 28)的图片
#linear 1 :   100----256
#linear 2:    256----512
#linear 2:    512----28*28
#reshape:     28*28----(1, 28, 28)


class Generator(nn.Module):
    def __init__(self):
        super(Generator, self).__init__()
        self.main = nn.Sequential(
                                  nn.Linear(100, 256),
                                  nn.ReLU(),
                                  nn.Linear(256, 512),
                                  nn.ReLU(),
                                  nn.Linear(512, 28*28),
                                  nn.Tanh()                     # 对于-1, 1之间的数据分布,Tanh效果最好。输出的取值范围是-1,1之间
        )
    def forward(self, x):              # 前向传播,x 表示长度为100 的noise输入
        img = self.main(x)#将x输入到main模型中 得到img
        img = img.view(-1, 28, 28)#通过view函数reshape成(-1,28,28,1)
        return img

 

定义判别器

## 输入为(1, 28, 28)的图片  输出为二分类的概率值,输出使用sigmoid激活 0-1
# BCEloss计算交叉熵损失

# nn.LeakyReLU   f(x) : x>0 输出 x, 如果x<0 ,输出 a*x  a表示一个很小的斜率,比如0.1
# 判别器中一般推荐使用 LeakyReLU,RELU激活函数在小于0没有任何梯度,会非常难以训练


class Discriminator(nn.Module):
    def __init__(self):
        super(Discriminator, self).__init__()#继承父类的属性
        self.main = nn.Sequential(
                                  nn.Linear(28*28, 512),#输入一张图片28,8,然后展平成28*28,再卷积到256
                                  nn.LeakyReLU(),
                                  nn.Linear(512, 256),
                                  nn.LeakyReLU(),
                                  nn.Linear(256, 1),
                                  nn.Sigmoid()
        )
    def forward(self, x):#x输入的是28,28的图片
        x = x.view(-1, 28*28)#展平
        x = self.main(x)
        return x

初始化模型、优化器及损失计算函数

device = 'cuda' if torch.cuda.is_available() else 'cpu'#默认使用cuda,否则cpu
#%%
gen = Generator().to(device)#初始化Generator模型
dis = Discriminator().to(device)#初始化Discriminator模型
#%%
d_optim = torch.optim.Adam(dis.parameters(), lr=0.0001)#定义优化器,学习率
g_optim = torch.optim.Adam(gen.parameters(), lr=0.0001)
#%%
loss_fn = torch.nn.BCELoss()#二分类判别模型

绘图函数

def gen_img_plot(model, test_input):#每次都给一个同样的test_input正态分布随机数
    prediction = np.squeeze(model(test_input).detach().cpu().numpy())#detach用来截断梯度,放到cpu上,转换为numpy,squeeze用于去掉维度为一的值,鲁棒性更高===>28*28的数组
    fig = plt.figure(figsize=(4, 4))#绘制16张图片
    for i in range(16):#循环
        plt.subplot(4, 4, i+1)#四行四列的第一张
        plt.imshow((prediction[i] + 1)/2)#转换成0,1之间的数值(预测的结果恢复到0,1之间
        plt.axis('off')#关闭
    plt.show()
#%%
test_input = torch.randn(16, 100, device=device)#生成长度为100的一个批次16张的随机噪声输入

 

GAN的训练

D_loss = []
G_loss = []#定义空列表用来放两个模型生成的loss
#%%
# 训练循环
for epoch in range(20):#训练20轮
    d_epoch_loss = 0
    g_epoch_loss = 0#初始化损失函数为0
    count = len(dataloader)#返回批次数,len(dataset)返回样本数
    for step, (img, _) in enumerate(dataloader):#_表示标签,这里生成模型用不到,enumerate用于对dataloader迭代
        img = img.to(device)#将照片上传到设备上
        size = img.size(0)#获批次大小根据这个大小来输入我们随机噪声的输入大小
        random_noise = torch.randn(size, 100, device=device)#生成噪声随机数,大小个数是size
        
        d_optim.zero_grad()#将梯度归0
        
        real_output = dis(img)      # 判别器输入真实的图片,real_output对真实图片的预测结果 真实图片为1,假图片为0
        d_real_loss = loss_fn(real_output, 
                              torch.ones_like(real_output))      # 得到判别器在真实图像上的损失  ones_like:全1数组
        d_real_loss.backward()#反向传播,计算梯度
        
        gen_img = gen(random_noise)
        # 判别器输入生成的图片,fake_output对生成图片的预测
        fake_output = dis(gen_img.detach()) #这里阶段梯度是因为,这里通过对判别器输入生成图片去计算损失是用来优化判别器的。对生成器的参数暂时不做优化。所以梯度不用再传递到生成器模型当中了,我们希望fake_output被判定为0
        d_fake_loss = loss_fn(fake_output,
                              torch.zeros_like(fake_output))      # 得到判别器在生成图像上的损失,zeros_like:全0数组
        d_fake_loss.backward()#同样计算梯度
        #以上是用来优化判别器
        d_loss = d_real_loss + d_fake_loss#判别器的总损失(两部分)
        d_optim.step()#进行优化
        
        g_optim.zero_grad()#梯度归零
        fake_output = dis(gen_img)#将生成图片放到判别器当中--不要梯度截断
        g_loss = loss_fn(fake_output, #我们这里就希望fake_output被判定为1用来优化生成器
                         torch.ones_like(fake_output))      # 生成器的损失
        g_loss.backward()#计算梯度
        g_optim.step()#权重优化
        
        with torch.no_grad():#两个模型的损失函数做累加(不需要计算梯度)---每个批次累加==一个epoch
            d_epoch_loss += d_loss
            g_epoch_loss += g_loss
            
    with torch.no_grad():#得到平均loss
        d_epoch_loss /= count
        g_epoch_loss /= count
        D_loss.append(d_epoch_loss.item())
        G_loss.append(g_epoch_loss.item())#这样列表当中会保存每个epoch的平均loss
        print('Epoch:', epoch)#打印当前epoch
        gen_img_plot(gen, test_input)#绘图

运行效果

 

基础GAN实例(pytorch代码实现) 输出是长度为100的噪声(正态分布随机数)输出为(1,28,28)的图片linear1100---256linear2256--512linear3reshapenn.Tanh()#对于生成器,最后一个激活函数是tanh,值域-1到1)#定义前向传播#x表示长度为100的noise输入img=img.view(-1,28,28)#转换成图片的形式输入为为(1,28,28)的图片,输出为二分类的概率值,输出使用sigmoid的激活0-1BCEloss计算交叉熵损失。... 阅读详情

相关推荐

GAN 生成模型:生成器 (Generator) 原理与代码实例讲解

GAN 生成模型:生成器 (Generator) 原理与代码实例讲解 1.背景介绍 生成对抗网络(Generative Adversarial Networks,简称GAN)自2014年由Ian Goodfellow等人提出以来,迅速成为机器学习和人工智能领域

AI天才研究院 458

GAN基础知识及代码

输入是长度100的噪声z(正态分布随机数)输出为(1,28,28)的图片,和MNIST数据集保持一致28super(Generator, self).__init__() # 继承父类nn.Tanh() # 最后必须用tanh,把数据分布到(-1,1)之间)def forward(self, x): # x表示长度为100的噪声输入img = img.view(-1,28,28,1) # 方便等会绘图输入为(1,28,28)的mnist图片。

石旭先森的博客 5721

生成对抗网络GAN原理与代码实例讲解

生成对抗网络GAN原理与代码实例讲解 作者:禅与计算机程序设计艺术 / Zen and the Art of Computer Programming 1. 背景介绍 1.1 问题的由来 在人工智能领域,生成模型一直是研究的热

AI架构师小马 905

生成对抗网络——GAN(代码+理解)

一、GAN模型介绍GAN,全称 Generative Adversarial Network,即生成对抗网络,是一种基于 对抗学习的深度生成模型。该模型由Ian Goodfellow在 2014年 首次提出,并迅速成为 学术界研究的热点,推动了生成模型领域的发展。GAN模型主要由两部分组成:生成器(Generator)和判别器(Discriminator)。,其 输入是 随机噪声,输出则是 生成的样本。。2. 判别器:判别器模型同样。

CXDNW的博客 4万+

基于生成对抗网络的室内设计风格迁移工具研发

生成对抗网络 (GAN),室内设计,风格迁移,图像生成,深度学习 1. 背景介绍 室内设计是一个充满创意和艺术性的领域,设计师需要根据客户的需求和喜好,将空间转化为舒适、美观、功能齐全的场所。然而,传统的室内设计流程往往耗时费力,需要设计师花费大量时间和精力进行草图绘制、模型制作和材

AI架构师小马 1247

基于生成对抗网络的三维建模纹理风格化迁移技术

基于生成对抗网络的三维建模纹理风格化迁移技术 作者:禅与计算机程序设计艺术 / Zen and the Art of Computer Programming 1. 背景介绍 1.1 问题的由来 随着计算机图形学技术的

AI天才研究院 1216

【免费下载】 GAN网络讲解PPT资源介绍

GAN网络讲解PPT资源介绍 【下载地址】GAN网络讲解PPT资源介绍 本仓库提供了一个名为“GAN网络讲解ppt”的资源文件,该文件详细介绍了生成对抗网络(GAN)的基本原理、最新发展以及实际应用。通过这个课件,您将能够深入了解GAN的工作机制,并通过一个具体的实验案例来加深理解 ...

gitblog_09723的博客 1314

GAN的训练技巧:稳定性收敛性及其优化

GAN的训练技巧:稳定性、收敛性及其优化 作者:禅与计算机程序设计艺术 1. 背景介绍 生成对抗网络(Generative Adversarial Networks,简称GAN)是近年来机器学习和人工智能领域最重要的突破性进展之一。GAN由Goodfellow等人在20

AI天才研究院 1523

基于生成对抗网络(GAN)的手写数字生成实践

通过本实践可以看到,GAN在图像生成任务中展现出强大的潜力。但同时也面临训练不稳定、模式崩溃等挑战。未来随着扩散模型等新技术的发展,图像生成技术将朝着更高分辨率、更强可控性的方向持续演进。建议开发者尝试调整网络结构、超参数设置,并探索不同的损失函数设计,以深入理解GAN的训练动态。注:文中省略了完整的训练循环代码和超参数设置,实际使用时需要配置批量大小(建议128)、学习率(生成器2e-4,判别器2e-5)、训练轮数(至少100)等参数。

weixin_45788582的博客 1123

49、生成对抗网络(GAN)实现新数据合成

本文详细介绍了如何使用生成对抗网络(GAN)合成新的MNIST风格图像。内容涵盖环境准备、生成器与判别器网络的实现、训练设置、数据预处理、模型训练与结果分析。同时,还讨论了GAN训练过程的优化建议、应用场景拓展以及注意事项。通过代码示例和可视化结果,帮助读者全面理解GAN的工作原理和实现方法。

s4t5u6v7的博客 161

生成对抗网络 (Generative Adversarial Network)

生成对抗网络 (Generative Adversarial Network) 作者:禅与计算机程序设计艺术 / Zen and the Art of Computer Programming 1. 背景介绍

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 450

新手入门GAN:30分钟一文搞懂生成对抗网络,附可运行代码!

作为深度学习领域的“明星架构”,GAN(生成对抗网络)自2014年由Ian Goodfellow提出后,就凭“两个网络博弈”的神奇思路圈粉无数。今天用新手能懂的语言,拆解GAN的核心逻辑,还附完整代码,零基础也能上手!

2501_93508870的博客 1378

基于生成对抗网络的老照片修复及风格迁移

基于生成对抗网络的老照片修复及风格迁移 关键词:生成对抗网络,老照片修复,风格迁移,图像处理,深度学习 1. 背景介绍 在数字化时代,老照片是连接过去与现在的重要媒介。然而,受时间、环境等因素影响,老照片往往存在褪色

欢迎来到我的优快云空间!这里聚焦AI大模型应用实战,分享前沿技术、实战案例与开发经验。 905

生成对抗网络(GAN)终极指南:从MNIST到SVHN的完整实现

生成对抗网络(GAN)是深度学习领域最具革命性的技术之一,它通过生成器和判别器的对抗训练,能够创造出令人惊叹的真实感图像。无论你是初学者还是进阶开发者,这份完整指南都将带你深入理解GAN的核心原理和实现方法。 ## 🤔 什么是生成对抗网络? 生成对抗网络由两个神经网络组成:**生成器**和**判别器**。生成器负责从随机噪声中生成假数据,判别器则负责区分真实数据和生成数据。这种"猫鼠游戏"的

gitblog_00939的博客 978

生成对抗网络(GAN)数据回归预测,GAN回归预测,多输入单输出模型(Matlab完整源码和数据)

生成对抗网络(GAN)数据回归预测,GAN回归预测,多输入单输出模型(Matlab完整源码和数据) 生成对抗网络(GAN)数据回归预测,GAN回归预测,多输入单输出模型(Matlab完整源码和数据) 生成对抗网络(GAN)数据回归预测,GAN回归预测,多输入单输出模型(Matlab完整源码和数据)

【校园网代理连接问题】已解决,“该设备或资源(Web 代理)未设置为接受端口“7890”上的连接“

我遇到这个问题很多次。每次都是vpn的问题,不止通俗意义上的梯子(clash之类的),还包括校园网vpn。点击“ 拨号和虚拟专用网络设置”中的“设置”, 关闭代理服务器。在打开vpn后或者关闭vpn后无法浏览网页,网页诊断显示“关闭“手动设置代理”中的“使用代理服务器”,关闭对应的本地代理即可。

聆雨。 1万+

GAN及DCGAN的tensorflow实践

 原理:        生成式对抗网络(generative adversarial network, GAN)是生成模型中的一种,可以自动学习原始图像的数据分布,而不需要提前假设原始数据属于哪种分布,只是不知道参数。GAN基于博弈论场景,由生成器网络和判别器网络构成,生成器网络用来从随机噪声数据中生成近似真实数据分布的样本,供判别器网络使用;判别器网络对真实数据和由生成器网络得到的假数据进行判...

love_image_xie的博客 561

PaddleOCR在医疗票据识别中的实战:从部署到业务字段提取

本文详细介绍了PaddleOCR在医疗票据识别中的实战应用,重点阐述了其离线部署方案与PP-OCRv3模型选型优势。针对医疗票据敏感数据不出本地的合规要求,文章提供了从环境搭建、模型配置到核心字段提取策略的完整流程,并分享了性能优化与系统集成的实践经验,有效解决了医疗票据自动化录入的难题。

weixin_29271053的博客 238

给高中生深入浅出的讲解GAN

*GAN(Generative Adversarial Network,生成对抗网络)**是一种能“”的AI。:像“伪钞工厂”,输入随机噪声 (z),输出“假图片” (\tilde{x}=G(z))。:像“验钞机”,输入图片 (x),输出一个数 (D(x)\in(0,1)),表示“这像不像真实”。两者训练:D 学会分辨“真图 vs 假图”;G 学会“骗过 D”。当两者都很强时,G 画出的图会非常逼真。

xingyu1621@163.com 858

基于51单片机的智能花盆灌溉系统设计与实现

本文详细介绍了基于51单片机的智能花盆灌溉系统设计与实现,通过DS18B20温度传感器、土壤湿度传感器和LCD1602显示屏等硬件模块,结合精确的算法控制,实现自动监测与灌溉。系统解决了传统灌溉依赖定时器、缺乏可视化界面的问题,适合上班族、园艺爱好者和植物园工作人员使用,有效提升植物养护效率。

honey的博客 1015

仿真系列专栏介绍

大家好!欢迎来到我的仿真学习系列专栏!这是一个我在学习仿真技术过程中整理和分享的系列文章。作为一名正在不断学习和实践的工程师,我希望通过这个专栏,和大家一起探索仿真技术,尤其是在高速信号完整性方面的应用。

案例文章,高速信号 368

直播提醒 | GAN七日打卡今晚开营!

点击左上方蓝字关注我们废话不多说,今天是学习的大好日子,「生成对抗网络7日打卡营」今晚开营啦!GAN作为近年来备受瞩目的新星,在无监督学习领域可以说是稳占一席之地。无论是工业界还是学界都非...

PaddlePaddle 296

深度学习-161-Dify工具之对比使用工作流和聊天流生成图表可视化的html文件

分别使用聊天流和工作流进行数据分析结果的可视化,生成html文件。聊天流可以配置带记忆,这样就可以多次交互优化结果。

qq_20466211的博客 1709
上一篇: 解决:RuntimeError: CUDA out of memory. Tried to allocate 160.00 MiB (GPU 0; 10.76 GiB total capacity..
下一篇: [深度学习] 名词解释--正则化
nocol.
博客等级 码龄7年 587粉丝 67原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值