【深度学习基础模型】Variational Autoencoders (VAE) 详细理解并附实现代码。

【深度学习基础模型】Variational Autoencoders (VAE) 详细理解并附实现代码

【深度学习基础模型】Variational Autoencoders (VAE) 详细理解并附实现代码


文章目录

  • 【深度学习基础模型】Variational Autoencoders (VAE) 详细理解并附实现代码
  • 1.Variational Autoencoders (VAE) 的原理和应用
    • 1.1 VAE 原理
    • 1.2 VAE 的主要特征:
    • 1.3 VAE 的应用领域:
  • 2.Python 代码实现 VAE 在遥感领域的应用
    • 2.1VAE 模型的实现
    • 2.2代码解释
  • 3.总结


参考地址:https://www.asimovinstitute.org/neural-network-zoo/
论文地址:https://arxiv.org/pdf/1312.6114v10

欢迎宝子们点赞、关注、收藏!欢迎宝子们批评指正!

1.Variational Autoencoders (VAE) 的原理和应用

1.1 VAE 原理

变分自编码器(Variational Autoencoder, VAE)是生成模型的一种,旨在学习输入数据的潜在概率分布VAE 与传统的自编码器(AE)相比,其核心区别在于它采用了贝叶斯方法进行推理

1.2 VAE 的主要特征:

  • 架构:与 AE 相同,VAE 也由编码器和解码器组成,但编码器的输出是潜在变量的概率分布(通常为高斯分布)
  • 重参数化技巧:为了解决标准反向传播无法有效训练模型的问题,VAE 引入了重参数化技巧。通过将潜在变量表示为固定分布(如标准正态分布)与参数化分布(均值和方差)的组合,模型能够有效学习
  • 损失函数:VAE 的损失函数由两部分组成:重构损失和 KL 散度(Kullback-Leibler Divergence)。重构损失衡量生成样本与真实样本之间的差异,而 KL 散度则确保潜在分布接近先验分布(通常是标准正态分布)。

1.3 VAE 的应用领域:

  • 图像生成:VAE 可以生成新图像,广泛应用于计算机视觉。
  • 数据插值:通过在潜在空间中进行插值,VAE 可以生成两种输入之间的过渡图像。
  • 异常检测:在学习正常数据的分布后,VAE 可以检测到异常样本。

在遥感领域,VAE 可以用于处理高维遥感数据,生成新图像,或从复杂的多光谱图像中提取潜在特征。

2.Python 代码实现 VAE 在遥感领域的应用

下面通过一个简单的 VAE 实现,演示如何在遥感图像处理中应用 VAE。

2.1VAE 模型的实现

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset
import numpy as np
import matplotlib.pyplot as plt# 定义 VAE 模型
class VAE(nn.Module):def __init__(self, input_size, hidden_size):super(VAE, self).__init__()# 编码器self.fc1 = nn.Linear(input_size, hidden_size)  # 输入到隐藏层self.fc21 = nn.Linear(hidden_size, hidden_size)  # 均值self.fc22 = nn.Linear(hidden_size, hidden_size)  # 对数方差# 解码器self.fc3 = nn.Linear(hidden_size, hidden_size)self.fc4 = nn.Linear(hidden_size, input_size)def encode(self, x):h1 = torch.relu(self.fc1(x))return self.fc21(h1), self.fc22(h1)  # 返回均值和对数方差def reparameterize(self, mu, logvar):std = torch.exp(0.5 * logvar)  # 标准差eps = torch.randn_like(std)  # 随机噪声return mu + eps * std  # 重新参数化def decode(self, z):h3 = torch.relu(self.fc3(z))return torch.sigmoid(self.fc4(h3))  # 输出为概率值 [0, 1]def forward(self, x):mu, logvar = self.encode(x)  # 编码z = self.reparameterize(mu, logvar)  # 重新参数化return self.decode(z), mu, logvar  # 解码及返回均值和对数方差def loss_function(self, recon_x, x, mu, logvar):BCE = nn.functional.binary_cross_entropy(recon_x, x, reduction='sum')  # 重构损失KLD = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp())  # KL 散度return BCE + KLD  # 总损失# 生成模拟遥感图像数据 (64 维特征)
X = np.random.rand(1000, 64)  # 1000 个样本,每个样本有 64 维光谱特征
X = torch.tensor(X, dtype=torch.float32)# 创建数据加载器
dataset = TensorDataset(X)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)# 定义模型、优化器
input_size = 64
hidden_size = 32  # 隐藏层大小
vae = VAE(input_size=input_size, hidden_size=hidden_size)
optimizer = optim.Adam(vae.parameters(), lr=0.001)# 训练 VAE 模型
num_epochs = 50
for epoch in range(num_epochs):for data in dataloader:optimizer.zero_grad()recon_batch, mu, logvar = vae(data[0])  # 前向传播loss = vae.loss_function(recon_batch, data[0], mu, logvar)  # 计算损失loss.backward()optimizer.step()if epoch % 10 == 0:print(f'Epoch {epoch}, Loss: {loss.item()}')# 使用训练好的模型进行数据生成
with torch.no_grad():sample = torch.randn(64)  # 从标准正态分布生成潜在变量generated_data = vae.decode(sample).numpy()  # 解码生成新样本# 可视化原始数据与生成数据
plt.figure(figsize=(6, 3))
plt.subplot(1, 2, 1)
plt.title('Generated Data')
plt.imshow(generated_data[:10], aspect='auto', cmap='hot')
plt.subplot(1, 2, 2)
plt.title('Original Data Sample')
plt.imshow(X.numpy()[:10], aspect='auto', cmap='hot')
plt.show()

2.2代码解释

1.模型定义:

class VAE(nn.Module):def __init__(self, input_size, hidden_size):super(VAE, self).__init__()# 编码器self.fc1 = nn.Linear(input_size, hidden_size)  # 输入到隐藏层self.fc21 = nn.Linear(hidden_size, hidden_size)  # 均值self.fc22 = nn.Linear(hidden_size, hidden_size)  # 对数方差# 解码器self.fc3 = nn.Linear(hidden_size, hidden_size)self.fc4 = nn.Linear(hidden_size, input_size)
  • VAE 类定义了编码器和解码器结构,包括均值和对数方差的输出。

2.重参数化技巧:

def reparameterize(self, mu, logvar):std = torch.exp(0.5 * logvar)  # 标准差eps = torch.randn_like(std)  # 随机噪声return mu + eps * std  # 重新参数化
  • 使用随机噪声与潜在变量均值和标准差结合,生成潜在表示。

3.数据生成:

X = np.random.rand(1000, 64)  # 生成 1000 个样本,每个样本有 64 维光谱特征
X = torch.tensor(X, dtype=torch.float32)
  • 模拟生成随机的遥感光谱数据。

4.数据加载器:

dataset = TensorDataset(X)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)
  • 使用 DataLoader 创建批处理数据集。

5.模型训练

for epoch in range(num_epochs):for data in dataloader:optimizer.zero_grad()recon_batch, mu, logvar = vae(data[0])loss = vae.loss_function(recon_batch, data[0], mu, logvar)loss.backward()optimizer.step()
  • 使用 50 个 epoch 进行训练,计算重构损失和 KL 散度,更新权重。

6.生成新数据:

with torch.no_grad():sample = torch.randn(64)  # 从标准正态分布生成潜在变量generated_data = vae.decode(sample).numpy()  # 解码生成新样本
  • 通过从潜在空间生成样本,使用解码器生成新数据。

7.可视化:

plt.subplot(1, 2, 1)
plt.title('Generated Data')
plt.imshow(generated_data[:10], aspect='auto', cmap='hot')
  • 可视化生成的数据与原始数据的对比。

3.总结

变分自编码器(VAE)是一种强大的生成模型,能够有效学习输入数据的潜在概率分布。在遥感领域,VAE 可以用于数据生成、特征提取和异常检测等任务。通过简单的 Python 实现,我们展示了如何使用 VAE 处理遥感数据,生成新样本,并可视化结果。

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

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

相关文章

通过 OBD Demo 体验 OceanBase 4.3 社区版

本文作者:马顺华 引言 OceanBase 4.3 是一个专为实时分析 AP 业务设计的重大更新版本。它基于LSM-Tree架构,引入了列存引擎,实现了行存与列存数据存储的无缝整合。这一版本不仅显著提升了AP场景的查询性能,同时也确保了TP业务场景…

uniapp云打包

ios打包 没有mac电脑,使用香蕉云编 先登录香蕉云编这个工具,新建csr文件——把csr文件下载到你电脑本地: 然后,登录苹果开发者中心 生成p12证书 1、点击+号创建证书 创建证书的时候一定要选择ios distribution app store and ad hoc类型的证书 2、上传刚才从本站生成的…

【设计模式-策略】

定义 策略模式(Strategy Pattern)是一种行为型设计模式,定义了一系列算法,将每个算法封装起来,并使它们可以互相替换。策略模式让算法独立于使用它的客户端而变化,使得算法的变化不会影响到使用它的客户端…

Java读取YAML文件

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storm…

Metasploit渗透测试之服务端漏洞利用

简介 在之前的文章中,我们学习了目标的IP地址,端口,服务,操作系统等信息的收集。信息收集过程中最大的收获是服务器或系统的操作系统信息。这些信息对后续的渗透目标机器非常有用,因为我们可以快速查找系统上运行的服…

乐鑫ESP32-S2高性能选择,家电中控屏联网通信应用,启明云端乐鑫代理商

在21世纪的今天,家电已经不再是简单的功能性产品,它们正在变得智能化,能够与我们的生活方式更加紧密地融合。 家电智能化正在改变我们与家庭环境的互动方式,它们不仅能够提高我们的生活效率,还能为我们带来更加舒适和…

计算机视觉综述

大家好,今天,我们将一起探讨计算机视觉的基本概念、发展历程、关键技术以及未来趋势。计算机视觉是人工智能的一个重要分支,旨在使计算机能够“看”懂图像和视频,从而完成各种复杂的任务。无论你是对这个领域感兴趣的新手&#xf…

【 EXCEL 数据处理 】000003 案列 标记涨跌,保姆级教程。使用的软件是微软的Excel操作的。处理数据的目的是让数据更直观的显示出来,方便查看。

【 EXCEL 数据处理 】000003 案列 使用条件格式之大于和小于,标记涨跌,保姆级教程。使用的软件是微软的Excel操作的。处理数据的目的是让数据更直观的显示出来,方便查看。 📚一、直接上案例 📖1.使用条件格式之大于和小…

ElasticSearch安装分词器与整合SpringBoot

ElasticSearch安装分词器与整合SpringBoot 如果还没安装的点击安装ElasticSearch查看怎么安装 分词器 1.分词器 在Elasticsearch中,分词器(Tokenizer)是分析器(Analyzer)的一部分,它的主要职责是将文本输入…

宝塔面板部署雷池社区版教程

宝塔面板部署雷池社区版教程 简单介绍一下宝塔面板,安全高效的服务器运维面板,使用宝塔面板的人非常多 在网站管理上,许多用户都是通过宝塔面板进行管理,宝塔面板的Nginx默认监听端口为80和443,这就导致共存部署时雷池…

K8s Calico替换为Cilium,以及安装Cilium过程(鲁莽版)

迁移CNI插件的3种办法: 1、创建一个新的集群,通过Gitops的方式迁移负载,然而,这可能涉及大量的准备工作和潜在的中断。 2、另一种方法是重新配置/etc/cni/net.d/指向Cilium。但是,现有的pod仍将由旧的…

【锁住精华】MySQL锁机制全攻略:从行锁到表锁,共享锁到排他锁,悲观锁到乐观锁

MySQL有哪些锁 1、按照锁的粒度划分 行锁 是最低粒度的的锁,锁住指定行的数据,加锁的开销较大,加锁较慢,可能会出现死锁的情况,锁的竞争度会较低,并发度相对较高。但是如果where条件里的字段没有加索引&…

Python | Leetcode Python题解之第432题全O(1)的数据结构

题目: 题解: class Node:def __init__(self, key"", count0):self.prev Noneself.next Noneself.keys {key}self.count countdef insert(self, node: Node) -> Node: # 在 self 后插入 nodenode.prev selfnode.next self.nextnode.…

解决Android中使用jdk 9以上中的某个类(AbstractProcessor)但是无法导入的问题

前景提要 今天在使用jdk中的AbstractProcessor类的时候,怎么都找不到,网上各种搜索,加什么依赖都没用,看了下依赖确实有这个类但是就是无法正常导入 然后翻了下android.jar,发现没有这个类 疑问 但是你尝试一下发…

Linux学习之路 -- 线程 -- 条件变量与生产消费模型

前面我们已经提过线程互斥的相关概念&#xff0c;但是我们在前文的抢票逻辑中&#xff0c;我们其实很容易发现一个问题。那就是票可能被一直被一个人抢&#xff0c;这里我们就需要引入条件变量的概念。 目录 1、条件变量 <1>线程同步 <2>相关概念 <3>相…

YOLO格式数据集转为COCO数据集(简单粗暴)

最近需要用的coco格式的数据集&#xff0c;但是在网上找的很多 毕竟麻烦&#xff0c;简单记录一下&#xff01; 1、调整目录结构&#xff08;以GC10-DET数据集为例&#xff09; YOLO格式数据集目录结构如下&#xff1a; 简单来说就是images文件夹里面有train、val、test三个文…

rk3588s android12 自启动 C程序

首先是 拷贝 TEST程序 到android跟文件系统看看能否成功。 首先将需要 在android 系统中 启动的 TEST 程序,拷贝到虚拟机。 这个程序 然后需要拷贝到 android 的文件系统中。 我是这样做的。 改的是这个文件。 然后, 编译+烧写测试。 发现, 在android 系…

国内车市销量激增,理想成功超越BBA

文/王俣祺 导语&#xff1a;随着“金九银十”的到来&#xff0c;国内汽车市场迎来了一个充满活力的开局。乘用车市场的销量已经迎来新的突破&#xff0c;彰显出中国汽车市场的韧性和潜力。尤为引人注目的是&#xff0c;新能源汽车销量同样激增&#xff0c;成为推动市场增长的重…

字节豆包C++一面-面经总结

talk is cheap show me the code lc206&#xff1a;链表反转&#xff1a;给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 class Solution { public:ListNode* reverseList(ListNode* head) {if(headnullptr||!head->next)return head…

RHCSA认证-Linux(RHel9)-Linux入门

文章目录 概要一、创建、查看和编辑⽂本1.1 输出重定向1.2 vim编辑器1.3 shell 变量1.5 获取帮助 二、管理本地用户和组2.1 描述用户2.2 切换用户和赋权2.3 用户管理2.4 用户组管理2.5 密码策略 三、控制文件访问3.1 列出文件和文件权限3.2 更改文件权限和拥有者3.3 控制默认权…