遥感&深度学习入门实战教程|案例②:多层感知机(MLP)

🧩 为什么需要多层感知机?

上一节我们介绍了感知机,它的本质是 线性分类器。 局限性:

  • 只能解决 线性可分问题

  • 无法处理复杂的非线性边界(例如 XOR)。

解决办法就是引入:

  • 隐藏层 (Hidden Layers):增加网络深度;

  • 非线性激活函数(ReLU, Sigmoid, Tanh),打破线性限制;

  • 反向传播 (Backpropagation):通过梯度下降更新参数。

于是,多层感知机(MLP)诞生了。

📂 MLP 的结构

一个三层 MLP 的结构:

输入层(特征) → 全连接层 + 激活函数 → 隐藏层 → 全连接层 + 激活函数 → 输出层(分类概率)

公式为:

其中:

  • :隐藏层激活函数(ReLU 常用)

  • :输出层激活函数(分类任务一般用 Softmax)

💻 案例一:二维点的 MLP 分类(PyTorch实现)

# -*- coding: utf-8 -*-
"""
深度学习案例②:多层感知机(二维点)
"""
import torch, torch.nn as nn, torch.optim as optim
import matplotlib.pyplot as plt, numpy as np, matplotlib
matplotlib.rcParams['font.family'] = 'SimHei'
matplotlib.rcParams['axes.unicode_minus'] = False

# ===== 1. 生成数据(异或 XOR,不可线性分割)=====
np.random.seed(42)
X = np.random.randn(200,2)
y = (X[:,0]*X[:,1] > 0).astype(int)  # 异号为0,同号为1

X_tensor = torch.tensor(X, dtype=torch.float32)
y_tensor = torch.tensor(y, dtype=torch.long)

# ===== 2. 定义 MLP =====
class MLP(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc1 = nn.Linear(2, 8)    # 输入2维 -> 隐藏层8维
        self.fc2 = nn.Linear(8, 2)    # 输出2类
    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = self.fc2(x)
        return x

model = MLP()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.01)

# ===== 3. 训练 =====
for epoch in range(200):
    optimizer.zero_grad()
    out = model(X_tensor)
    loss = criterion(out, y_tensor)
    loss.backward()
    optimizer.step()

print("训练结束,最终loss=", loss.item())

# ===== 4. 可视化分类边界 =====
xx, yy = np.meshgrid(np.linspace(-3,3,200), np.linspace(-3,3,200))
grid = torch.tensor(np.c_[xx.ravel(), yy.ravel()], dtype=torch.float32)
Z = torch.argmax(model(grid), dim=1).reshape(xx.shape)

plt.contourf(xx, yy, Z, cmap=plt.cm.coolwarm, alpha=0.6)
plt.scatter(X[:,0], X[:,1], c=y, cmap=plt.cm.Set1, edgecolors='k')
plt.title("二维异或数据的MLP分类结果")
plt.show()

👉 结果:MLP 成功学会了非线性边界,把感知机解决不了的 XOR 问题分类正确。

图片

💻 案例二:KSC 高光谱数据上的 MLP 分类

在真实遥感数据中,我们同样可以用 MLP 做分类。 这里用 sklearn 自带的 MLPClassifier,更轻量。

# -*- coding: utf-8 -*-
"""
深度学习案例②:MLP在KSC数据集上的应用
"""
import os, numpy as np, scipy.io as sio, matplotlib.pyplot as plt, matplotlib
from matplotlib.colors import ListedColormap, BoundaryNorm
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.neural_network import MLPClassifier
from sklearn.metrics import accuracy_score, cohen_kappa_score, confusion_matrix

matplotlib.rcParams['font.family'] = 'SimHei'
matplotlib.rcParams['axes.unicode_minus'] = False

# ===== 1. 加载KSC数据 =====
DATA_DIR = r"your_path"   # ←修改为你的数据路径
X_cube = sio.loadmat(os.path.join(DATA_DIR,"KSC.mat"))["KSC"].astype(np.float32)
Y_map  = sio.loadmat(os.path.join(DATA_DIR,"KSC_gt.mat"))["KSC_gt"].astype(int)
h,w,b = X_cube.shape
coords = np.argwhere(Y_map!=0)
X_all  = X_cube[coords[:,0], coords[:,1]]
y_all  = Y_map[coords[:,0], coords[:,1]] - 1
num_classes = int(y_all.max()+1)

# ===== 2. 分层划分 & 无泄露预处理 =====
X_tr,X_te,y_tr,y_te = train_test_split(X_all,y_all,train_size=0.3,
                                       stratify=y_all,random_state=42)
scaler = StandardScaler().fit(X_tr)
X_train = scaler.transform(X_tr)
X_test  = scaler.transform(X_te)

# ===== 3. 定义并训练 MLP =====
clf = MLPClassifier(hidden_layer_sizes=(100,), activation='relu',
                    solver='adam', max_iter=200, random_state=42)
clf.fit(X_train,y_tr)
y_pred = clf.predict(X_test)

oa = accuracy_score(y_te,y_pred)
kappa = cohen_kappa_score(y_te,y_pred)
print(f"[MLP-KSC] OA={oa*100:.2f}%  Kappa={kappa:.4f}")

# ===== 4. 整图预测 =====
X_flat = X_cube.reshape(-1,b)
X_flat_std = scaler.transform(X_flat)
pred_map = clf.predict(X_flat_std).reshape(h,w)+1

base_cmap = plt.get_cmap('tab20')
colors = [base_cmap(i % 20) for i in range(num_classes)]
cmap = ListedColormap(colors)
boundaries = np.arange(0.5,num_classes+1.5,1)
norm = BoundaryNorm(boundaries,cmap.N)

plt.figure(figsize=(8.6,6.4))
im = plt.imshow(pred_map, cmap=cmap, norm=norm)
plt.title("KSC数据的MLP整图预测结果")
plt.axis("off")
cbar = plt.colorbar(im, boundaries=boundaries,
                    ticks=np.arange(1,num_classes+1,max(1,num_classes//12)),
                    fraction=0.046, pad=0.04)
cbar.set_label("类别ID", rotation=90)
plt.show()

👉 结果:

  • MLP 在高光谱分类上通常比感知机更准确;

  • 但相比 SVM、CNN,它可能仍然偏弱,因为没有利用空间上下文信息。

图片

图片

✅ 总结

  • 感知机只能解决线性问题,而 MLP 通过隐藏层 + 激活函数具备非线性表达能力

  • 在二维点案例中,MLP 能正确处理 XOR 问题;

  • 在 KSC 遥感数据中,MLP 可作为一个轻量级神经网络基线;

  • 后续将逐步引入 CNN、RNN 等更适合遥感数据的深度网络。

欢迎大家关注下方公众号获取更多内容!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

遥感AI实战

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值