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

【深度学习基础模型】Auto-association by multilayer perceptrons and singular value decomposition

【深度学习基础模型】Auto-association by multilayer perceptrons and singular value decomposition



参考地址:https://www.asimovinstitute.org/neural-network-zoo/
论文地址:https://link.springer.com/article/10.1007/BF00332918#preview

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

1.Autoencoders (AE) 的原理和应用

1.1 AE 原理

Autoencoders (AE) 是一种特殊的神经网络架构,主要用于学习输入数据的压缩表示。其目标是通过对输入数据进行编码(压缩)和解码(重构)来学习一种有效的低维表示

AE 的基本结构可以概括为:

  • 编码器(Encoder):将高维输入数据转换为低维的隐含表示(latent representation),通常称为“瓶颈”或“代码”。
  • 解码器(Decoder):将低维表示重新解码成原始的高维数据。
  • 对称性:编码器和解码器一般是对称的,即网络的层数和神经元个数从输入到瓶颈再回到输出是对称的。
  • 损失函数:通常使用均方误差(MSE)作为损失函数,来衡量输入数据与重构数据之间的差异。

AE 的主要应用领域包括:

  • 数据降维:AE 可以有效地将高维数据压缩成低维表示,同时保留关键特征。
  • 去噪:DAE 的一种应用是在存在噪声的情况下,AE 通过学习数据的固有特征来还原原始数据。
  • 特征提取:AE 通过学习紧凑的表示,能从高维数据中提取有用的特征,常用于分类、聚类等任务。
  • 生成模型:变体如变分自编码器(VAE)被用于生成新数据。

在遥感领域,AE 可以应用于图像的降维、去噪、变化检测等任务。

1.2 AE 在遥感中的应用

在遥感图像处理中,AE 可以用来处理大量的高维遥感影像数据,通过降维、去噪等方式减少噪声影响,并提取出有效的特征。例如,可以将多光谱图像中的各波段进行压缩表示,同时保持信息的完整性,或在图像中进行变化检测

2.Python 代码实现 Autoencoder 在遥感图像处理中的应用

下面我们通过一个简化的 Python 实现,展示如何使用 AE 来对遥感图像进行降维和重构。

2.1AE 模型的实现

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

# 定义 Autoencoder 模型
class Autoencoder(nn.Module):
    def __init__(self, input_size, hidden_size):
        super(Autoencoder, self).__init__()
        
        # 编码器
        self.encoder = nn.Sequential(
            nn.Linear(input_size, hidden_size),
            nn.ReLU()  # 激活函数
        )
        
        # 解码器
        self.decoder = nn.Sequential(
            nn.Linear(hidden_size, input_size),
            nn.Sigmoid()  # 将输出范围限定在 [0, 1]
        )
    
    def forward(self, x):
        encoded = self.encoder(x)
        decoded = self.decoder(encoded)
        return decoded

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

# 创建数据加载器
dataset = TensorDataset(X, X)  # 输入数据与输出数据相同
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)

# 定义模型、优化器和损失函数
input_size = 64
hidden_size = 32  # 压缩到 32 维
autoencoder = Autoencoder(input_size=input_size, hidden_size=hidden_size)
optimizer = optim.Adam(autoencoder.parameters(), lr=0.001)
criterion = nn.MSELoss()  # 损失函数为均方误差

# 训练 Autoencoder 模型
num_epochs = 50
for epoch in range(num_epochs):
    for data, target in dataloader:
        optimizer.zero_grad()
        output = autoencoder(data)
        loss = criterion(output, target)
        loss.backward()
        optimizer.step()
    
    if epoch % 10 == 0:
        print(f'Epoch {epoch}, Loss: {loss.item()}')

# 使用训练好的模型进行降维和重构
encoded_data = autoencoder.encoder(X).detach().numpy()
decoded_data = autoencoder.decoder(torch.tensor(encoded_data)).detach().numpy()

# 可视化原始数据和重构后的数据
plt.figure(figsize=(6, 3))
plt.subplot(1, 2, 1)
plt.title('Original')
plt.imshow(X.numpy()[:10], aspect='auto', cmap='hot')
plt.subplot(1, 2, 2)
plt.title('Reconstructed')
plt.imshow(decoded_data[:10], aspect='auto', cmap='hot')
plt.show()

2.2代码解释

1.模型定义:

class Autoencoder(nn.Module):
    def __init__(self, input_size, hidden_size):
        super(Autoencoder, self).__init__()
        
        # 编码器
        self.encoder = nn.Sequential(
            nn.Linear(input_size, hidden_size),
            nn.ReLU()  # 激活函数
        )
        
        # 解码器
        self.decoder = nn.Sequential(
            nn.Linear(hidden_size, input_size),
            nn.Sigmoid()  # 输出范围限定在 [0, 1]
        )
  • Autoencoder 包含编码器和解码器。编码器将输入数据压缩到较小的隐藏层表示(即 32 维),解码器则将其重新还原到原始维度(64 维)。

2.数据生成:

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

3.数据加载器:

dataset = TensorDataset(X, X)  # 输入和输出都是 X
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)
  • 使用 DataLoader 创建批处理数据集,训练时会同时输入和输出相同的数据。

4.模型训练:

num_epochs = 50
for epoch in range(num_epochs):
    for data, target in dataloader:
        optimizer.zero_grad()
        output = autoencoder(data)
        loss = criterion(output, target)
        loss.backward()
        optimizer.step()
  • 使用 50 个 epoch 进行训练,输入带有噪声或误差的光谱数据,模型学习如何重构这些数据以接近原始输入。
  • 每个 epoch 都会计算输出和目标的损失,并进行反向传播更新权重。

5.编码和解码

encoded_data = autoencoder.encoder(X).detach().numpy()
decoded_data = autoencoder.decoder(torch.tensor(encoded_data)).detach().numpy()
  • 在训练完成后,利用编码器提取压缩后的低维表示,并使用解码器重构数据。

6.可视化

plt.subplot(1, 2, 1)
plt.title('Original')
plt.imshow(X.numpy()[:10], aspect='auto', cmap='hot')
plt.subplot(1, 2, 2)
plt.title('Reconstructed')
plt.imshow(decoded_data[:10], aspect='auto', cmap='hot')
  • 将原始数据与模型重构的数据进行对比,观察 AE 的降维和重构效果。

3.总结

Autoencoder 在遥感图像处理中的应用可以用于压缩高维数据、降噪以及提取特征。在遥感混合像元分解任务中,AE 可以帮助提取每个像元的光谱特征,进而提高解混分析的准确性。通过简单的 Python 实现,我们展示了如何用 AE 来重构和降维遥感数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值