【深度学习基础模型】去噪自编码器 (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 处理遥感数据,并可视化其效果。