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

CVAE——生成0-9数字图像(Pytorch+mnist)

1、简介

  • CVAE(Conditional Variational Autoencoder,条件变分自编码器)是一种变分自编码器(VAE)的变体,用于生成有条件的数据。在传统的变分自编码器中,生成的数据是完全由潜在变量决定的,而CVAE允许在生成过程中引入外部条件信息。
  • 具体来说,CVAE在生成数据时,除了使用随机采样的潜在变量外,还会接收一个额外的条件信息。这个条件信息可以是类别标签、属性信息、或者其他形式的上下文信息,取决于具体的任务。通过将条件信息作为输入提供给编码器和解码器,CVAE能够生成与条件信息相关的数据。
  • CVAE在许多任务中都很有用,例如图像生成中的类别条件生成、属性编辑、生成特定风格的图像等。通过引入条件信息,CVAE使得生成的数据更具有控制性和可解释性。
  • 本文利用CVAE,输入数字图像和对应的标签。训练后,生成0-9数字图像。
    • (epoch=10)
    • (epoch=20)
    • (epoch=30)

2、代码

  • import torch
    import torch.nn as nn
    import torch.optim as optim
    import torchvision
    import torch.nn.functional as F
    from torchvision.utils import save_image# 变分自编码器
    class CVAE(nn.Module):def __init__(self):super(CVAE, self).__init__()self.labels = 10  # 标签数量# 编码器层self.fc1 = nn.Linear(input_size + self.labels, 512)  # 编码器输入层self.fc2 = nn.Linear(512, latent_size)self.fc3 = nn.Linear(512, latent_size)# 解码器层self.fc4 = nn.Linear(latent_size + self.labels, 512)  # 解码器输入层self.fc5 = nn.Linear(512, input_size)  # 解码器输出层# 编码器部分def encode(self, x):x = F.relu(self.fc1(x))  # 编码器的隐藏表示mu = self.fc2(x)  # 潜在空间均值log_var = self.fc3(x)  # 潜在空间对数方差return mu, log_var# 重参数化技巧def reparameterize(self, mu, log_var):  # 从编码器输出的均值和对数方差中采样得到潜在变量zstd = torch.exp(0.5 * log_var)  # 计算标准差eps = torch.randn_like(std)  # 从标准正态分布中采样得到随机噪声return mu + eps * std  # 根据重参数化公式计算潜在变量z# 解码器部分def decode(self, z):z = F.relu(self.fc4(z))  # 将潜在变量 z 解码为重构图像return torch.sigmoid(self.fc5(z))  # 将隐藏表示映射回输入图像大小,并应用 sigmoid 激活函数,以产生重构图像# 前向传播def forward(self, x, y):  # 输入图像 x,标签 y 通过编码器和解码器,得到重构图像和潜在变量的均值和对数方差x = torch.cat([x, y], dim=1)mu, log_var = self.encode(x)z = self.reparameterize(mu, log_var)z = torch.cat([z, y], dim=1)return self.decode(z), mu, log_var# 使用重构损失和 KL 散度作为损失函数
    def loss_function(recon_x, x, mu, log_var):  # 参数:重构的图像、原始图像、潜在变量的均值、潜在变量的对数方差MSE = F.mse_loss(recon_x, x.view(-1, input_size), reduction='sum')  # 计算重构图像 recon_x 和原始图像 x 之间的均方误差KLD = -0.5 * torch.sum(1 + log_var - mu.pow(2) - log_var.exp())  # 计算潜在变量的KL散度return MSE + KLD  # 返回二进制交叉熵损失和 KLD 损失的总和作为最终的损失值def sample_images(epoch):with torch.no_grad():  # 上下文管理器,确保在该上下文中不会进行梯度计算。因为在这里只是生成样本而不需要梯度number = 10# 生成标签sample_labels = torch.arange(10).long().to(device)  # 0-9的标签sample_labels_onehot = F.one_hot(sample_labels, num_classes=10).float()# 生成随机噪声sample = torch.randn(number, latent_size).to(device)  # 生成一个形状为 (64, latent_size) 的张量,其中包含从标准正态分布中采样的随机数sample = torch.cat([sample, sample_labels_onehot], dim=1)  # 连接图片和标签sample = model.decode(sample).cpu()  # 将随机样本输入到解码器中,解码器将其映射为图像save_image(sample.view(number, 1, 28, 28), f'sample{epoch}.png', nrow=int(number / 2))  # 将生成的图像保存为文件if __name__ == '__main__':batch_size = 512  # 批次大小epochs = 30  # 学习周期sample_interval = 10  # 保存结果的周期learning_rate = 0.001  # 学习率input_size = 784  # 输入大小latent_size = 64  # 潜在变量大小# 载入 MNIST 数据集中的图片进行训练transform = torchvision.transforms.Compose([torchvision.transforms.ToTensor()])  # 将图像转换为张量train_dataset = torchvision.datasets.MNIST(root="~/torch_datasets", train=True, transform=transform, download=True)  # 加载 MNIST 数据集的训练集,设置路径、转换和下载为 Truetrain_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True)  # 创建一个数据加载器,用于加载训练数据,设置批处理大小和是否随机打乱数据# 在使用定义的 AE 类之前,有以下事情要做:# 配置要在哪个设备上运行device = torch.device("cuda" if torch.cuda.is_available() else "cpu")# 建立 CVAE 模型并载入到 CPU 设备model = CVAE().to(device)# Adam 优化器,学习率optimizer = optim.Adam(model.parameters(), lr=learning_rate)# 训练for epoch in range(epochs):train_loss = 0for batch_idx, (data, labels) in enumerate(train_loader):data = data.to(device)  # 将输入数据移动到设备(GPU 或 CPU)上data = data.view(-1, input_size)  # 重塑维度labels = F.one_hot(labels, num_classes=10).float().to(device)  # 转换为独热编码# print(labels[1])optimizer.zero_grad()  # 进行反向传播之前,需要将优化器中的梯度清零,以避免梯度的累积# 重构图像 recon_batch、潜在变量的均值 mu 和对数方差 log_varrecon_batch, mu, log_var = model(data, labels)loss = loss_function(recon_batch, data, mu, log_var)  # 计算损失loss.backward()  # 计算损失相对于模型参数的梯度train_loss += loss.item()optimizer.step()  # 更新模型参数train_loss = train_loss / len(train_loader)  # # 计算每个周期的训练损失print('Epoch [{}/{}], Loss: {:.3f}'.format(epoch + 1, epochs, train_loss))# 每10次保存图像if (epoch + 1) % sample_interval == 0:sample_images(epoch + 1)# 每训练10次保存模型if (epoch + 1) % sample_interval == 0:torch.save(model.state_dict(), f'vae{epoch + 1}.pth')

相关文章:

CVAE——生成0-9数字图像(Pytorch+mnist)

1、简介 CVAE(Conditional Variational Autoencoder,条件变分自编码器)是一种变分自编码器(VAE)的变体,用于生成有条件的数据。在传统的变分自编码器中,生成的数据是完全由潜在变量决定的&…...

【Linux】TCP网络套接字编程+守护进程

文章目录 日志类(完成TCP/UDP套接字常见连接过程中的日志打印)单进程版本的服务器客户端通信多进程版本和多线程版本守护进程化的多线程服务器 日志类(完成TCP/UDP套接字常见连接过程中的日志打印) 为了让我们的代码更规范化&…...

【Qt 学习笔记】Day2 | 认识QtSDK中的重要工具

博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Day2 | 认识QtSDK中的重要工具 文章编号:Qt 学习笔记 / 03…...

adc123456

DMA主要用于协助CPU完成数据转运的工作 DMA,英文全称Direct Memory Access,DMA这个外设是可以直接访问STM32内部存储器的,包括运行内存SRAM,程序存储器flash和寄存器等等,DMA都有权限访问,所以DMA能完成数据…...

YOLOV5训练自己的数据集教程(万字整理,实现0-1)

文章目录 一、YOLOV5下载地址 二、版本及配置说明 三、初步测试 四、制作自己的数据集及转txt格式 1、数据集要求 2、下载labelme 3、安装依赖库 4、labelme操作 五、.json转txt、.xml转txt 六、修改配置文件 1、coco128.yaml->ddjc_parameter.yaml 2、yolov5x.…...

精通Go语言文件上传:深入探讨r.FormFile函数的应用与优化

1. 介绍 1.1 概述 在 Web 开发中,文件上传是一项常见的功能需求,用于允许用户向服务器提交文件,如图像、文档、视频等。Go 语言作为一门强大的服务器端编程语言,提供了方便且高效的方式来处理文件上传操作。其中,r.F…...

【C语言】字符串

C语言用字符数组存放字符串,字符数组中的各元素依次存放字符串的各字符 一维字符数组:存放一个字符串(每个数组元素存放一个字符)二维字符数组:存放多个一维数组(字符串);二维数组的…...

云计算探索-DAS、NAS与SAN存储技术演进及其应用比较

1,介绍 随着信息技术的飞速发展,数据存储的需求日益增长,各种存储技术也应运而生。在众多的存储解决方案中,直接附加存储(Direct Attached Storage,简称DAS)、网络附加存储(Network …...

手机有线投屏到直播姬pc端教程

1 打开哔哩哔哩直播姬客户端并登录(按下图进行操作) 2 手机用usb数据线连接电脑(若跳出安装驱动的弹窗点击确定或允许),usb的连接方式为仅充电(手机差异要求为仅充电),不同品牌手机要求可能不一样,根据实际的来 3 在投屏过程中不要更改usb的连接方式(不然电脑会死机需要重启) …...

SOA、分布式、微服务之间的关系?

分布式它本身就是一种系统部署的架构理念,意思就是将一个系统拆分为各个部分,然后分别部署到不同的机器上去,SOA和微服务项目的部署方式都可以是分布式架构。 而SOA和微服务它们都是面向服务的架构,但是微服务相比于SOA在服务粒度…...

Java多线程学习(概念笔记)

面试题:并行和并发有什么区别? 现在都是多核CPU,在多核CPU下 并发是同一时间应对多件事情的能力,多个线程轮流使用一个或多个CPU 并行是同一时间动手做多件事情的能力,4核CPU同时执行4个线程 面试题:创建线…...

【C++】set和map

set和map就是我们上篇博客说的key模型和keyvalue模型。它们属于是关联式容器,我们之前说过普通容器和容器适配器,这里的关联式容器就是元素之间是有关联的,通过上篇博客的讲解我们也对它们直接的关系有了一定的了解,那么下面我们先…...

yolov5 v7.0打包exe文件,使用C++调用

cd到yolo5文件夹下 pyinstaller -p 当前路径 -i logo图标 detect.py问题汇总 运行detect.exe找不到default.yaml 这个是yolov8里的文件 1 复制权重文件到exe所在目录。 2 根据报错提示的配置文件路径,把default.yaml复制放到相应的路径下。(缺少相应…...

保研线性代数机器学习基础复习2

1.什么是群(Group)? 对于一个集合 G 以及集合上的操作 ,如果G G-> G,那么称(G,)为一个群,并且满足如下性质: 封闭性:结合性:中性…...

vultr ubuntu 服务器远程桌面安装及连接

一. 概述 vultr 上开启一个linux服务器,都是以终端形式给出的,默认不带 ui 桌面的,那其实对于想使用服务器上浏览器时的情形不是很好。那有没有方法在远程服务器安装桌面,然后原程使用呢?至少ubuntu的服务器是有的&am…...

前端学习<二>CSS基础——12-CSS3属性详解:动画详解

前言 本文主要内容: 过渡:transition 2D 转换 transform 3D 转换 transform 动画:animation 过渡:transition transition的中文含义是过渡。过渡是CSS3中具有颠覆性的一个特征,可以实现元素不同状态间的平滑过渡…...

Sqoop 的安装与配置

目录 1 下载并解压2 修改配置文件3 添加环境变量4 拷贝 JDBC 驱动5 测试Sqoop是否能够成功连接数据库 下载地址 1 下载并解压 (1)上传安装包 sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz 到 hadoop101 的 /opt/software 路径中 (2&#xf…...

Mysql设置访问权限(docker配置)

1.运行命令:docker exec -it 数据库名 bash,我这里是bot_test, docker exec -it bot_test bash 2.运行命令mysql -uroot -p --default-character-setutf8,输入密码连接数据库 3.运行命令show databases,查看当前的表 4.进入my…...

【Linux】详解软硬链接

一、软硬链接的建立方法 1.1软链接的建立 假设在当前目录下有一个test.txt文件,要对其建立软链接,做法如下: ln就是link的意思,-s表示软链接,test.txt要建立软链接的文件名,后面跟上要建立的软链接文件名…...

维修贝加莱4PP420.1043-B5触摸屏Power Panel 400工业电脑液晶

深圳捷达工控维修为贝加莱、HMI 显示电源面板 400 4PP420.1043-B5 提供专业电子维修。在 深圳捷达工控维修,我们拥有及时且经济高效地维修 B&R 、HMI Display Power Panel 400 4PP420.1043-B5 的经验。我们为发送给我们工厂维修的贝加莱 HMI 显示面板 400 4PP42…...

Java_21 完成一半题目

完成一半题目 有 N 位扣友参加了微软与力扣举办了「以扣会友」线下活动。主办方提供了 2*N 道题目,整型数组 questions 中每个数字对应了每道题目所涉及的知识点类型。 若每位扣友选择不同的一题,请返回被选的 N 道题目至少包含多少种知识点类型。 示例…...

【WPF应用21】WPF 中的 TextBox 控件详解与示例

在 Windows Presentation Foundation (WPF) 中,TextBox 控件是一个强大的输入控件,允许用户输入、编辑和选择文本。TextBox 控件在各种应用程序中都非常常见,例如表单、对话框和编辑器。本文将详细介绍 TextBox 控件的功能、使用方法、属性、…...

小程序页面传参?

小程序页面之间传递参数通常可以通过以下几种方式实现: 通过 URL 参数传递:可以在跳转目标页面时,在 URL 中添加参数,目标页面可以通过 options 参数获取传递过来的数据。 // 页面 A wx.navigateTo({url: targetPage?param1value…...

C++list的模拟实现

为了实现list&#xff0c;我们需要实现三个类 一、List的节点类 template<class T> struct ListNode {ListNode(const T& val T()):_pPre(nullptr),_pNext(nullptr),_val(val){}ListNode<T>* _pPre;ListNode<T>* _pNext;T _val; }; 二、List的迭代器…...

Leetcode 187. 重复的DNA序列

DNA序列 由一系列核苷酸组成&#xff0c;缩写为 ‘A’, ‘C’, ‘G’ 和 ‘T’.。 例如&#xff0c;“ACGAATTCCG” 是一个 DNA序列 。 在研究 DNA 时&#xff0c;识别 DNA 中的重复序列非常有用。 给定一个表示 DNA序列 的字符串 s &#xff0c;返回所有在 DNA 分子中出现不…...

都江堰泛计算操作系统(多机)应用方向

1、异构多核芯片 DJYOS是全球唯一支持异构多核的操作系统。当前的系统级芯片&#xff0c;为了适应多样化的用户需求&#xff0c;基本上都采用了异构多核架构。传统操作系统就需要在一个芯片内&#xff0c;运行多种操作系统&#xff0c;开发工作更加复杂&#xff0c;运行协同性低…...

【第十二届“泰迪杯”数据挖掘挑战赛】【2024泰迪杯】B题基于多模态特征融合的图像文本检索—解题全流程(论文更新)

【第十二届“泰迪杯”数据挖掘挑战赛】【2024泰迪杯】B题基于多模态特征融合的图像文本检索更新&#xff08;论文更新&#xff09; ​ 本节主要更新了论文、训练日志的log数据提取&#xff08;Loss、ACC、RK&#xff09;等数据可视化作图的代码 B题交流QQ群&#xff1a; 4583…...

蓝桥杯22年第十三届省赛-统计子矩阵|一维前缀和加双指针

题目链接&#xff1a; 1.统计子矩阵 - 蓝桥云课 (lanqiao.cn) 蓝桥杯2022年第十三届省赛真题-统计子矩阵 - C语言网 (dotcpp.com) 说明&#xff1a; 涉及到子矩阵的时候&#xff0c;一般就跟前缀和相关&#xff0c;可以降维。 先回顾一下最大子矩阵&#xff0c;回忆一下一…...

SaaS 电商设计 (十) 记一次 5000kw 商品数据ES迁移 (详细的集群搭建以及线上灰度过程设计)

目录 一.背景二.技术目标三.技术方案3.1 整体流程3.2 ES 切换前:完成整体新集群的搭建.i:拓扑结构设计ii: 如何选择整体的 **ES** 集群配置. 3.3 **ES** 版本切换中3.3.1 多client版本兼容3.3.2 Router的设计 3.4 ES 切换后3.5 开箱即用 四.总结 专栏系列 -SaaS 电商设计 (一) …...

linux安装Tomcat

linux安装Tomcat 下载地址&#xff1a;https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.87/bin/apache-tomcat-8.5.87.tar.gz 将下载的安装包传到该文件夹 解压安装包 tar -zxvf apache-tomcat-8.5.87.tar.gz 配置环境变量 vim /etc/profile 添加指定文件最下方 expo…...

苹果网站用flash做/上海seo顾问

第二章&#xff1a;SVM&#xff08;支持向量机&#xff09; - 理论文档中的代码错误值2。欢迎来到监督式机器学习的第二块踏脚石。本章再次分为两部分。第1部分&#xff08;这一部分&#xff09;讨论了理论&#xff0c;工作和调整参数。第2部分&#xff08;这里&#xff09;我们…...

学网站开发/营销型网站建设总结

大带宽服务器的优势肯定是普通服务器所比不上的。从以下几点说明一下。 一、体验更好 大带宽服务器租用&#xff0c;意味着你的网站可以承受更高的流量&#xff0c;在带宽越大的情况下&#xff0c;能够同时支持的在线用户越多&#xff0c;也不会带来卡顿。此时用户的缓存页面&a…...

网站开发语言html/网站营销与推广

最近在研究行列转换。在2000版本中&#xff0c;一律用case 语句来完成&#xff0c;但是在2005中新增了pivot运算符&#xff0c;它让你能够将行级数据旋转成为列表数据&#xff0c;实现类似Excel数据透视表的功能&#xff0c;而不需要像先前版本的SQLServer一样使用CASE语句。 以…...

wordpress批量上传文章/北京谷歌seo

【黑客联盟2016年12月02日讯】北京时间11月30日晚间消息&#xff0c;互联网安全公司今日发布报告称&#xff0c;一款名为“Gooligan”的特洛伊木马程序将自己伪装成合法应用(App)入侵Android智能手机和平板电脑&#xff0c;自8月份以来已控制了100多万个谷歌账号。 StopWatch、…...

设计好的制作网站/大学生网页设计作业

转载于:https://blog.51cto.com/qinyezhai/132550...

php+ajax网站开发典型实例pdf/网络营销是什么专业

http://blog.csdn.net/fakine/article/details/7517417/ 1. 使用库函数 string.h strstr函数 函数名: strstr 功 能: 在串中查找指定字符串的第一次出现 用 法: char *strstr(char *str1, char *str2); 说明&#xff1a;返回指向第一次出现str2位置的指针&#xff0c;如果…...