【深度学习基础模型】Extracting and Composing Robust Features with Denoising Autoencoders
参考地址:https://www.asimovinstitute.org/neural-network-zoo/
论文地址:https://dl.acm.org/doi/pdf/10.1145/1390156.1390294
欢迎宝子们点赞、关注、收藏!欢迎宝子们批评指正!
去噪自编码器(Denoising Autoencoder, DAE)是一种自编码器(Autoencoder)的变体,旨在从被污染的输入中学习如何恢复原始输入。这种网络的主要目标是学习输入数据的更高层次特征,而不是依赖于细节。
在遥感领域,DAE 可用于处理受到环境噪声影响的遥感图像,提取更准确的地物特征。
下面是一个简单的 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()
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()
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')
去噪自编码器(DAE)是一种有效的特征学习模型,能够从噪声中提取更有代表性的特征。
在遥感领域,DAE 可用于处理受噪声影响的遥感图像,帮助提取更准确的地物特征。通过简单的 Python 实现,我们展示了如何使用 DAE 处理遥感数据,并可视化其效果。