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

【深度学习基础模型】去噪自编码器 (Denoising Autoencoders, DAE)详细理解并附实现代码。

【深度学习基础模型】Extracting and Composing Robust Features with Denoising Autoencoders

【深度学习基础模型】Extracting and Composing Robust Features with Denoising Autoencoders


文章目录

  • 【深度学习基础模型】Extracting and Composing Robust Features with Denoising Autoencoders
  • 1. 去噪自编码器 (Denoising Autoencoders, DAE) 的原理与应用
    • 1.1 DAE 原理
    • 1.2 DAE 的主要特征:
    • 1.3 DAE 的应用领域:
  • 2. Python 代码实现 DAE 在遥感领域的应用
    • 2.1 DAE 模型的实现
    • 2.2 代码解释
  • 3. 总结


参考地址:https://www.asimovinstitute.org/neural-network-zoo/
论文地址:https://dl.acm.org/doi/pdf/10.1145/1390156.1390294

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

1. 去噪自编码器 (Denoising Autoencoders, DAE) 的原理与应用

1.1 DAE 原理

去噪自编码器(Denoising Autoencoder, DAE)是一种自编码器(Autoencoder)的变体,旨在从被污染的输入中学习如何恢复原始输入。这种网络的主要目标是学习输入数据的更高层次特征,而不是依赖于细节

1.2 DAE 的主要特征:

  • 输入带噪声:DAE 在训练过程中接收的输入数据通常包含噪声,例如对图像的随机扰动或降噪处理。这种噪声可以是随机的(如高斯噪声)或特定模式的(如图像模糊)。
  • 输出与原始输入对比:DAE 的输出与无噪声的原始输入进行对比,以计算损失。这使得网络在训练时专注于恢复整体结构和模式,而不是细节
  • 特征学习:通过这种方式,DAE 鼓励网络学习更具代表性的特征,增强了模型对噪声的鲁棒性

1.3 DAE 的应用领域:

  • 图像去噪:可以用于去除图像噪声,提高图像质量。
  • 异常检测:在数据噪声较大的情况下,可以帮助识别异常点。
  • 数据增强:通过生成去噪后的样本,帮助提升模型的泛化能力。

在遥感领域,DAE 可用于处理受到环境噪声影响的遥感图像,提取更准确的地物特征。

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

下面是一个简单的 DAE 实现示例,展示如何使用去噪自编码器处理遥感图像。

2.1 DAE 模型的实现

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

# 定义 DAE 模型
class DenoisingAutoencoder(nn.Module):
    def __init__(self, input_size, hidden_size):
        super(DenoisingAutoencoder, self).__init__()
        
        # 编码器
        self.encoder = nn.Linear(input_size, hidden_size)
        
        # 解码器
        self.decoder = nn.Linear(hidden_size, input_size)

    def forward(self, x):
        # 编码过程
        encoded = torch.relu(self.encoder(x))
        # 解码过程
        decoded = torch.sigmoid(self.decoder(encoded))
        return decoded

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

# 添加噪声
noise_factor = 0.2
X_noisy = X + noise_factor * torch.randn_like(X)  # 在输入数据上添加噪声
X_noisy = torch.clamp(X_noisy, 0., 1.)  # 保证数据在 [0, 1] 范围内

# 创建数据加载器
dataset = TensorDataset(X_noisy, X)  # 输入为带噪声的数据,目标为原始数据
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)

# 定义模型、优化器
input_size = 64
hidden_size = 32  # 隐藏层大小
dae = DenoisingAutoencoder(input_size=input_size, hidden_size=hidden_size)
optimizer = optim.Adam(dae.parameters(), lr=0.001)

# 训练 DAE 模型
num_epochs = 50
for epoch in range(num_epochs):
    for data in dataloader:
        optimizer.zero_grad()
        noisy_data, original_data = data  # 获取带噪声的输入和原始输出
        reconstructed_data = dae(noisy_data)  # 前向传播
        loss = nn.functional.binary_cross_entropy(reconstructed_data, original_data)  # 计算损失
        loss.backward()
        optimizer.step()
    
    if epoch % 10 == 0:
        print(f'Epoch {epoch}, Loss: {loss.item()}')

# 使用训练好的模型进行数据去噪
with torch.no_grad():
    reconstructed_data = dae(X_noisy).numpy()  # 使用去噪自编码器生成去噪后的数据

# 可视化原始数据、带噪声数据和去噪后数据
plt.figure(figsize=(12, 6))

plt.subplot(1, 3, 1)
plt.title('Noisy Data')
plt.imshow(X_noisy.numpy()[:10], aspect='auto', cmap='hot')
plt.subplot(1, 3, 2)
plt.title('Original Data')
plt.imshow(X.numpy()[:10], aspect='auto', cmap='hot')
plt.subplot(1, 3, 3)
plt.title('Reconstructed Data')
plt.imshow(reconstructed_data[:10], aspect='auto', cmap='hot')

plt.show()

2.2 代码解释

1. 模型定义:

class DenoisingAutoencoder(nn.Module):
    def __init__(self, input_size, hidden_size):
        super(DenoisingAutoencoder, self).__init__()
        
        # 编码器
        self.encoder = nn.Linear(input_size, hidden_size)
        
        # 解码器
        self.decoder = nn.Linear(hidden_size, input_size)
  • DenoisingAutoencoder 类定义了编码器和解码器的结构,编码器将输入压缩到潜在空间,而解码器将其恢复到输入空间。

2. 前向传播:

def forward(self, x):
    encoded = torch.relu(self.encoder(x))  # 编码过程
    decoded = torch.sigmoid(self.decoder(encoded))  # 解码过程
    return decoded
  • 输入数据经过编码器和解码器处理,输出恢复的图像。

3. 数据生成:

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

4. 添加噪声:

noise_factor = 0.2
X_noisy = X + noise_factor * torch.randn_like(X)  # 在输入数据上添加噪声
X_noisy = torch.clamp(X_noisy, 0., 1.)  # 保证数据在 [0, 1] 范围内
  • 通过高斯噪声添加扰动,创建带噪声的数据。

5. 数据加载器:

dataset = TensorDataset(X_noisy, X)  # 输入为带噪声的数据,目标为原始数据
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)
  • 使用 DataLoader 创建批处理数据集。

6. 模型训练:

for epoch in range(num_epochs):
    for data in dataloader:
        optimizer.zero_grad()
        noisy_data, original_data = data
        reconstructed_data = dae(noisy_data)  # 前向传播
        loss = nn.functional.binary_cross_entropy(reconstructed_data, original_data)  # 计算损失
        loss.backward()
        optimizer.step()
  • 在 50 个 epoch 内进行训练,计算重构损失并更新模型权重。

7. 去噪处理:

with torch.no_grad():
    reconstructed_data = dae(X_noisy).numpy()  # 使用去噪自编码器生成去噪后的数据
  • 在测试阶段,使用训练好的模型对带噪声数据进行去噪。

8. 可视化:

plt.subplot(1, 3, 1)
plt.title('Noisy Data')
plt.imshow(X_noisy.numpy()[:10], aspect='auto', cmap='hot')
  • 可视化带噪声的数据、原始数据和去噪后的数据进行比较。

3. 总结

去噪自编码器(DAE)是一种有效的特征学习模型,能够从噪声中提取更有代表性的特征

在遥感领域,DAE 可用于处理受噪声影响的遥感图像,帮助提取更准确的地物特征。通过简单的 Python 实现,我们展示了如何使用 DAE 处理遥感数据,并可视化其效果。


http://www.kler.cn/a/323408.html

相关文章:

  • 对称加密算法DES的实现
  • 数据仓库在大数据处理中的作用
  • 初识ElasticSearch
  • 六、volatile
  • 【ict基础软件赛道】真题-50%openGauss
  • ThriveX 博客管理系统前后端项目部署教程
  • 如何正确连接和使用滑动变阻器?
  • 信息技术网络安全政策制定
  • GO Serial 学习与使用
  • 决策树与随机森林在机器学习中的应用
  • [数据集][目标检测]猪数据集VOC-2856张
  • 一文上手Kafka【下】
  • 快速订餐:Spring Boot 点餐系统
  • 搭建本地AI聊天界面:Open WebUI与Ollama实战指南
  • 63.【C语言】再议结构体(上)
  • 算法打卡:第十一章 图论part08
  • 什么是算力?cpu+显卡吗?
  • 【JAVA-数据结构】时间和空间复杂度
  • ubuntu中通过源码安装pointnet2_ops_lib
  • 360周鸿祎为什么说大模型已成茶叶蛋?
  • html+css+js实现Progress 进度条
  • 差速轮纯跟踪算法
  • 设备管理平台-支持快速开发
  • Woocommerce怎么分类显示产品?如何将Shopify的产品导入到Woocommerce?
  • 如何恢复被删除的 GitLab 项目?
  • git rebase 调整提交顺序