news 2025/12/27 0:45:36

简单的GAN生成学习案例

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
简单的GAN生成学习案例
importtorchimporttorch.nnasnnimporttorch.optimasoptimfromtorchvisionimportdatasets,transformsfromtorch.utils.dataimportDataLoaderimportmatplotlib.pyplotaspltimportnumpyasnp# 定义生成器网络classGenerator(nn.Module):""" 生成器网络:将随机噪声转换为伪造的图像 输入:随机噪声向量(维度为latent_dim) 输出:生成的图像(1 x 28 x 28) """def__init__(self,latent_dim):super(Generator,self).__init__()self.model=nn.Sequential(nn.Linear(latent_dim,256),nn.LeakyReLU(0.2),nn.BatchNorm1d(256),nn.Linear(256,512),nn.LeakyReLU(0.2),nn.BatchNorm1d(512),nn.Linear(512,1024),nn.LeakyReLU(0.2),nn.BatchNorm1d(1024),nn.Linear(1024,28*28),nn.Tanh())defforward(self,z):""" 前向传播 参数: z: 随机噪声向量 返回: 生成的图像,形状为 [batch_size, 1, 28, 28] """img=self.model(z)img=img.view(img.size(0),1,28,28)returnimg# 定义判别器网络classDiscriminator(nn.Module):""" 判别器网络:判断输入的图像是真实的还是生成的 输入:图像(1 x 28 x 28) 输出:图像为真实的概率(0-1之间的标量) """def__init__(self):super(Discriminator,self).__init__()self.model=nn.Sequential(nn.Linear(28*28,1024),nn.LeakyReLU(0.2),nn.Dropout(0.3),nn.Linear(1024,512),nn.LeakyReLU(0.2),nn.Dropout(0.3),nn.Linear(512,256),nn.LeakyReLU(0.2),nn.Dropout(0.3),nn.Linear(256,1),nn.Sigmoid())defforward(self,img):""" 前向传播 参数: img: 输入图像,形状为 [batch_size, 1, 28, 28] 返回: 图像为真实的概率,形状为 [batch_size, 1] """img_flat=img.view(img.size(0),-1)validity=self.model(img_flat)returnvaliditydeftrain_gan(epochs=100,batch_size=64,latent_dim=100,sample_interval=200):""" 训练GAN模型 参数: epochs: 训练轮数 batch_size: 批次大小 latent_dim: 随机噪声向量的维度 sample_interval: 生成并保存样本的间隔 """# 设置设备(GPU或CPU)device=torch.device("cuda"iftorch.cuda.is_available()else"cpu")print(f"使用设备:{device}")# 加载MNIST数据集transform=transforms.Compose([transforms.ToTensor(),transforms.Normalize([0.5],[0.5])])dataset=datasets.MNIST(root="./data",train=True,download=True,transform=transform)dataloader=DataLoader(dataset,batch_size=batch_size,shuffle=True)# 初始化生成器和判别器generator=Generator(latent_dim).to(device)discriminator=Discriminator().to(device)# 定义损失函数和优化器adversarial_loss=nn.BCELoss()optimizer_G=optim.Adam(generator.parameters(),lr=0.0002,betas=(0.5,0.999))optimizer_D=optim.Adam(discriminator.parameters(),lr=0.0002,betas=(0.5,0.999))# 训练循环forepochinrange(epochs):fori,(imgs,_)inenumerate(dataloader):# 配置输入real_imgs=imgs.to(device)batch_size=real_imgs.size(0)# 创建标签real=torch.ones(batch_size,1).to(device)fake=torch.zeros(batch_size,1).to(device)# ---------------------# 训练判别器# ---------------------optimizer_D.zero_grad()# 计算真实图像的损失real_loss=adversarial_loss(discriminator(real_imgs),real)# 生成假图像z=torch.randn(batch_size,latent_dim).to(device)gen_imgs=generator(z)# 计算假图像的损失fake_loss=adversarial_loss(discriminator(gen_imgs.detach()),fake)# 总判别器损失d_loss=(real_loss+fake_loss)/2d_loss.backward()optimizer_D.step()# ---------------------# 训练生成器# ---------------------optimizer_G.zero_grad()# 生成假图像z=torch.randn(batch_size,latent_dim).to(device)gen_imgs=generator(z)# 生成器希望判别器认为生成的图像是真实的g_loss=adversarial_loss(discriminator(gen_imgs),real)g_loss.backward()optimizer_G.step()# 打印训练进度ifi%50==0:print(f"[Epoch{epoch}/{epochs}] [Batch{i}/{len(dataloader)}] "f"[D loss:{d_loss.item():.4f}] [G loss:{g_loss.item():.4f}]")# 定期保存生成的图像ifi%sample_interval==0:save_images(gen_imgs,epoch,i)# 训练完成后,生成最终样本print("\n训练完成!生成最终样本...")z=torch.randn(25,latent_dim).to(device)gen_imgs=generator(z)save_images(gen_imgs,epochs,0,final=True)defsave_images(images,epoch,batch_idx,final=False):""" 保存生成的图像 参数: images: 生成的图像张量 epoch: 当前轮数 batch_idx: 当前批次索引 final: 是否为最终样本 """images=images.detach().cpu().numpy()images=0.5*images+0.5# 反归一化到[0, 1]范围fig,axes=plt.subplots(5,5,figsize=(10,10))fori,axinenumerate(axes.flat):ifi<images.shape[0]:ax.imshow(images[i,0],cmap='gray')ax.axis('off')iffinal:plt.savefig(f'gan_final_samples.png')print(f"最终样本已保存为: gan_final_samples.png")else:plt.savefig(f'gan_epoch{epoch}_batch{batch_idx}.png')plt.close()if__name__=="__main__":# 训练GAN模型train_gan(epochs=20,batch_size=64,latent_dim=100,sample_interval=200)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/27 0:45:19

纪念币预约自动化工具终极指南:快速上手智能抢购

纪念币预约自动化工具终极指南&#xff1a;快速上手智能抢购 【免费下载链接】auto_commemorative_coin_booking 项目地址: https://gitcode.com/gh_mirrors/au/auto_commemorative_coin_booking 还在为纪念币预约手忙脚乱而烦恼吗&#xff1f;&#x1f914; 纪念币预约…

作者头像 李华
网站建设 2025/12/27 0:43:02

如何快速使用LeagueAkari:面向新手的英雄联盟终极辅助指南

在英雄联盟的激烈对局中&#xff0c;每一秒的决策都可能影响最终的胜负。LeagueAkari作为一款功能全面的智能辅助工具&#xff0c;专门为LOL玩家设计&#xff0c;通过智能化和自动化技术&#xff0c;让您能够更专注于游戏本身的乐趣&#xff0c;而非繁琐的操作细节。 【免费下载…

作者头像 李华
网站建设 2025/12/27 0:42:33

如何使用遗传算法优化推荐结果

原文&#xff1a;towardsdatascience.com/how-to-optimize-recommendation-results-with-genetic-algorithm-46f29b5e3d9c 1. 基于 ALS 的简单电影推荐系统 推荐系统现在已应用于各种行业&#xff0c;包括电子商务、营销、视频流媒体、金融行业等。存在不同类型的算法&#xf…

作者头像 李华
网站建设 2025/12/27 0:42:29

新疆机场职工健康新保障:精准高效的驿站健康一体机

在广袤的新疆大地&#xff0c;机场是连接内外的重要枢纽&#xff0c;而机场职工则是守护这份畅通与安全的“蓝天守护者”。高强度的工作节奏、特殊的工作环境&#xff0c;让职工的身心健康保障成为新疆机场运营保障工作的重中之重。如今&#xff0c;健康一体机正式入驻新疆机场…

作者头像 李华
网站建设 2025/12/27 0:38:45

远程协作时代,你的团队需要这份IM工具终极选型清单(附10款推荐)

我整理了这份包含10款即时通讯&#xff08;IM&#xff09;工具的推荐。它们涵盖了企业协作、社交娱乐和开发集成等不同领域&#xff0c;你可以根据表格快速了解它们的核心定位。分类工具名称核心定位/特点主要适用场景企业级与协作易秒办 (e-mobile)业务协同与深度集成的移动办…

作者头像 李华
网站建设 2025/12/27 0:38:30

PaddlePaddle镜像中的Tokenizer如何处理中文分词?

PaddlePaddle镜像中的Tokenizer如何处理中文分词&#xff1f; 在构建中文自然语言处理系统时&#xff0c;一个常见的挑战是&#xff1a;如何让模型“理解”没有空格分隔的汉字序列&#xff1f; 比如&#xff0c;“我在百度做深度学习研究”这句话&#xff0c;对人类来说能自然切…

作者头像 李华