深度学习(CVAE)

news/2025/9/30 11:21:01/文章来源:https://www.cnblogs.com/tiandsp/p/19080706

自编码器这类模型有下面几个:

自编码器(AE):目标是压缩与重建。它是一个判别模型,目标是学习数据的高效表示,主要用于降维、去噪和数据压缩,而不是生成新数据。

变分自编码器(VAE): 学习数据的概率分布并生成。它是一个生成模型。它的关键突破是让隐变量 z 服从一个标准的概率分布(通常是高斯分布),从而使得隐空间是规则且连续的,可以用于生成新数据。

条件变分自编码器(CVAE): 在特定条件下生成数据。它是 VAE 的扩展,让整个生成过程条件于某个额外的信息 c(如图像的标签、一段文本、另一张图片等)。

它们的关系是:
AE(学习表示)-> VAE(学会生成)-> CVAE(学会按指令生成)

CVAE模型结构如下:

屏幕截图_30-9-2025_11945_www.cnblogs.com

x是原始输入数据,x'是生成数据,c是标签数据,z是隐变量,E是编码器模型,G是解码器模型。

下面以生成MNIST数据为例,可以和之前的VAE做个对比,代码如下:

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
from torchvision import datasets
from sklearn.preprocessing import LabelBinarizerlatent_size = 64
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")# 条件变分自编码器
class CVAE(nn.Module):def __init__(self):super(CVAE, self).__init__()# 编码器层self.fc1 = nn.Linear(794, 512)   self.fc2 = nn.Linear(512, latent_size)self.fc3 = nn.Linear(512, latent_size)# 解码器层self.fc4 = nn.Linear(latent_size+10, 512)  self.fc5 = nn.Linear(512, 794)  self.lb = LabelBinarizer()def to_categrical(self, y: torch.FloatTensor):y_n = y.numpy()self.lb.fit(list(range(0,10)))y_one_hot = self.lb.transform(y_n)floatTensor = torch.FloatTensor(y_one_hot).to(device)return floatTensor# 编码器部分def encode(self, x,y):y_c = self.to_categrical(y)x = torch.cat((x, y_c), 1)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, y):y_c = self.to_categrical(y)#解码器的输入:将z和y的one-hot向量连接z = torch.cat((z, y_c), 1)z = F.relu(self.fc4(z))             # 将潜在变量 z 解码为重构图像return torch.sigmoid(self.fc5(z))   # 将隐藏表示映射回输入图像大小,并应用 sigmoid 激活函数,以产生重构图像# 前向传播def forward(self, x, y):                # 输入图像 x 通过编码器和解码器,得到重构图像和潜在变量的均值和对数方差mu, log_var = self.encode(x.view(-1, 784),y)z = self.reparameterize(mu, log_var)return self.decode(z, y), mu, log_var# 使用重构损失和 KL 散度作为损失函数
def loss_function(recon_x, x, mu, log_var):                         # 参数:重构的图像、原始图像、潜在变量的均值、潜在变量的对数方差MSE = F.mse_loss(recon_x, x.view(-1, 794), 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 = 80sample = torch.randn(number, latent_size).to(device)  # 生成一个形状为 (80, latent_size) 的张量,其中包含从标准正态分布中采样的随机数values = torch.arange(10) # tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])c = values.repeat_interleave(8)sample = model.decode(sample,c).cpu()  # 将随机样本输入到解码器中,解码器将其映射为图像sample = sample[:,0:784]save_image(sample.view(number, 1, 28, 28), f'sample{epoch}.png')  # 将生成的图像保存为文件if __name__ == '__main__':batch_size = 512    epochs = 100    sample_interval = 5     learning_rate = 0.001   # 载入 MNIST 数据集中的图片进行训练transform = torchvision.transforms.Compose([torchvision.transforms.ToTensor()])  mnist_train = datasets.MNIST('mnist', train=True, transform=transform, download=True)train_loader = torch.utils.data.DataLoader(mnist_train, batch_size=batch_size, shuffle=True)model = CVAE().to(device)optimizer = optim.Adam(model.parameters(), lr=learning_rate)for epoch in range(epochs):train_loss = 0for batch_idx, (data, label) in enumerate(train_loader):data = data.to(device)  optimizer.zero_grad()  # 重构图像 recon_batch、潜在变量的均值 mu 和对数方差 log_varrecon_batch, mu, log_var = model(data,label)flat_data = data.view(-1, data.shape[2]*data.shape[3])y_condition = model.to_categrical(label)con = torch.cat((flat_data, y_condition), 1)loss = loss_function(recon_batch, con, 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')

结果如下:

sample100

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/922762.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c# aot orm 框架测试 mysql

SqlSugar 的文档比较齐全,一次通过:https://www.donet5.com/Home/Doc?typeId=2574,但是 SqlSugar Aot 发布在 40M 左右,感觉太大了点。 FreeSql 的 AOT 文档就不太友好了,试了一下各种报错,最后发现要使用 Free…

深入解析:论文阅读:硕士学位论文 2025 面向大语言模型的黑盒对抗性攻击与防御关键技术研究

深入解析:论文阅读:硕士学位论文 2025 面向大语言模型的黑盒对抗性攻击与防御关键技术研究2025-09-30 11:09 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !import…

网站常用的js效果做的网站被挂马

Java 汉字转拼音 1.TinyPinyin 功能: 适用于Java和Android的快速、低内存占用的汉字转拼音库。 特性: 生成的拼音不包含声调,均为大写;支持自定义词典,支持简体中文、繁体中文;执行效率很高(Pinyin4J的…

怎么给汽车网站做推广郑州建设局官网

1、使用父子关系调整下使其更加整洁 2、比如说我修改了下url,那所有的页面都要更改 优化:把这个url抽出来,新建一个Api文件夹用于存放所有接口的url,在业务里只需要关注业务就可以 使用时 导包 发请求 如果想要更改路径,在这里…

PK-2877电流互感器在高频脉冲电源模块测试中的应用方案

一、项目背景与需求 一家专注于高频脉冲电源模块研发与生产的电子设备企业,其产品广泛应用于工业自动化控制、通信基站电源等领域。这些电源模块在工作时会产生高频脉冲电流,电流峰值可达100A,脉冲频率在数百kHz至数…

VC++ 使用OpenSSL创建RSA密钥PEM档案

VC++ 使用OpenSSL创建RSA密钥PEM档案pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monac…

CF1699D Almost Triple Deletions

被神秘贪心标签误导了。 你考虑答案的最终形式长什么样,就是保留若干个相同的数,再将其中间的区间整段整段删干净。 你先枚举保留什么数,然后发现我们可以设 \(f_{i}\) 表示到了第 \(i\) 个位置最多能保留多少个数,…

QMT回测模式为什么要在副图进行

在QMT系统中,回测必须以副图模式进行,主要有以下原因: (1)数据处理与性能优化 副图模式允许策略专注于历史数据的分析和计算,避免与主图的实时行情显示产生冲突。回测过程中,系统需要遍历大量历史K线数据,副图…

DAY20 Channel(通道)NIO(同步,非阻塞)、Selector(选择器)、NIO2-AIO(异步、非阻塞) - 指南

DAY20 Channel(通道)NIO(同步,非阻塞)、Selector(选择器)、NIO2-AIO(异步、非阻塞) - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !impor…

详细介绍:Servlet完全上手:核心语法与生命周期详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

详细介绍:支持17种方言10种外语!阿里最新AI语音合成模型Qwen3-TTS-Flash震撼发布

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

判断权限通过遍历二叉树路由删除权限不展示的前端组件

判断权限通过遍历二叉树路由删除权限不展示的前端组件点击查看代码 def clean_node(nodes, full_name):names = full_name.split(.)current_name = names[0]for i, node in enumerate(nodes):assert isinstance(node, …

外国人做的网站wordpress主题大全

文章目录 rollup watch 实现流程watchWatchEmitter 实现 watchInternalWatcher 管理整个 watch 阶段Task 运行任务FileWatcher 实现文件监听 rollup watch 实现流程 每一个配置了 watch 的配置项都会变成一个 Task 任务,每个任务通过 FileWatcher 即 chokidar 进行…

DSA:DeepSeek Sparse Attention

DeepSeek-V3.2-Exp 是一个基于稀疏注意力机制(DSA,DeepSeek Sparse Attention)优化的长上下文处理模型,其核心创新在于高效地处理长序列输入,同时保持模型性能。🧠 什么是 DSA(DeepSeek Sparse Attention)? …

网站资讯如何做成都网站开发哪家好

PHPExcel是一个PHP类库,用来帮助我们简单、高效实现从Excel读取Excel的数据和导出数据到Excel。下面是PHPExcel读取的使用教程:1.首先下载PHPExcel2.下载好文件,解压可以得到如下文件:为了使用方便,我们可以在根目录创…

荒野猎手出击!启明智显ZX7981PO:专治各种恶劣环境的5G插卡路由器

在工地、在巴士、在露营地、在户外直播现场……你是否曾因网络不稳定而错失重要时刻?是否曾因设备无法承受严苛环境而影响工作进度?现在,启明智显ZX7981PO荒野猎手来了! 这款专为户外严苛场景设计的5G插卡路由器,…

AWS CDK重构功能发布:安全重构基础设施即代码

AWS宣布推出CDK重构功能,帮助开发者在重命名构造、跨堆栈迁移资源和重组CDK应用时保留现有AWS资源,避免因逻辑ID变更导致的资源替换风险,显著提升基础设施代码重构的安全性。我们很高兴宣布一项新的AWS Cloud Devel…

开发即时通社交软件APP首选系统,可定制开发,可提供源码

开发即时通社交软件APP首选系统,可定制开发,可提供源码一、产品定位​信贸通即时通(SEMOT Instant messaging system),是一款跨平台可定制的 P2P 即时通信系统。它专为电子商务网站、各行业门户网站及企事业单位打…

死锁的处理策略-死锁的检测和解除

这两个是允许死锁发生的方法 死锁的检测 为了能对系统是否已经发生了死锁进行检测,必须: 1.用某种数据结构来保存资源的请求和分配信息; 2.提供一种算法。利用上述的信息来检测系统是否已经进入了死锁状态 数据结构…

实用指南:上下文工程驱动智能体向 “连续性认知”跃迁

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …