【深度学习基础模型】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,一经查实,立即删除!

相关文章

3D Gaussian Splatting 学习笔记

目录 突破3DGS泛化和实用壁垒!GS-Net:首个具有跨场景泛化能力的即插即用3DGS模块 升级版 SGD 一问读懂3D Gaussian Splatting 3DGS高斯泼溅技术 系统首先对 SfM 点云进行初始化 代码概要 突破3DGS泛化和实用壁垒!GS-Net:首个…

通过 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、上传刚才从本站生成的…

C++(学习)2024.9.26

目录 多态 1.概念 2.函数覆盖 3.虚函数的定义 4.多态实现 5.多态原理 6.虚析构函数 7.类型转换 (1)static_cast(静态转换) (2)dynamic_cast(动态转换) (3)const_cast(常量转换) (4)reinterpret_cast()(重解释转换) 抽象类 纯虚析构函数 私有析构函数 多态 1.概…

常用的MySQL日期、时间函数

1、日期/时间获取函数 函数名 描述 实例 CURDATE() 返回当前日期 SELECT CURDATE(); -> 2018-09-19 CURRENT_DATE() 返回当前日期 SELECT CURRENT_DATE(); -> 2018-09-19 CURRENT_TIME 返回当前时间 SELECT CURRENT_TIME(); -> 19:59:02 CURTIME() 返回当…

【设计模式-策略】

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

Java读取YAML文件

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

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

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

计算机网络回顾

计算机网络回顾 说明一般的小型无线局域网如何搭建(以寝室为例) 1.硬件准备 选择一个适合的支持802.11ac或802.11ax标准的无线路由器网线 2.连接路由器并配置 1.无线路由器的接线 power口连接电源WAN口用网线连接外网LAN口连接设备网口 2.配置无线路由器 电脑连接路由器后…

Scrapy框架介绍

一、什么是Scrapy 是一款快速而强大的web爬虫框架,基于Twusted的异步处理框架 Twisted是事件驱动的 Scrapy是由Python实现的爬虫框架 ① 架构清晰 ②可扩展性强 ③可以灵活完成需求 二、核心组件 Scrapy Engine(引擎):Scrapy框架…

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

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

计算机视觉综述

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

【Kubernetes】常见面试题汇总(三十六)

目录 88. Pod 启动失败如何解决以及常见的原因有哪些? 89.简述 K8s 中 label 的几种应用场景。 特别说明: 题目 1-68 属于【Kubernetes】的常规概念题,即 “ 汇总(一)~(二十二)” 。 题…

在 Ubuntu 上构建 Electron 项目时的问题记录和解决方法

文章目录 0. 引言1. 问题一:依赖安装缓慢原因分析解决方案使用国内镜像源使用 nrm 管理 npm 镜像源 2. 问题二:Electron 二进制文件下载缓慢原因分析解决方案设置 Electron 下载的国内镜像源通过 npm 配置 Electron 镜像 3. 问题三:Cannot fi…

【 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条件里的字段没有加索引&…

Debain docker容器离线安装ping命令

已经成功下载了 iputils-ping_20180629-2deb10u2_amd64.deb 文件。接下来需要将这个 .deb 文件复制到 Docker 容器中并安装。以下是详细步骤:下载链接:https://debian.pkgs.org/10/debian-main-amd64/iputils-ping_20180629-2deb10u2_amd64.deb.html 中的…