资讯详情

小样本高光谱图像分类Python源码实战:从数据划分到模型训练全流程解析

📅 2026/10/11 22:26:34 | 华诺云谱 👁 阅读
小样本高光谱图像分类Python源码实战:从数据划分到模型训练全流程解析
简介本资源面向遥感图像处理与深度学习方向的研究者、研究生及工程师提供一套在小样本条件下实现高光谱图像分类的完整Python源码与项目说明。高光谱图像光谱信息丰富但标注样本稀缺传统方法难以取得理想效果项目借助卷积神经网络、迁移学习与数据增强等策略在有限样本下提升模型泛化能力。压缩包共36个文件约62.16MB包含6个py源码文件、10个npy数据文件、6个png结果图、5个xml配置、2个md说明文档以及mat、pt、xlsx等格式文件覆盖数据预处理、网络模型构建、训练验证与结果评估等关键模块。源码中已提供Indian Pines、PaviaU、Salinas等常用数据集的预处理结果与训练检查点便于快速复现实验。项目说明文档详细介绍了代码使用方法、模型选择依据、数据集构建过程与实验结果分析并附有评估指标与排错思路。目前已有395人学习下载适合希望系统掌握小样本高光谱分类方案、对照源码复现并扩展研究的读者。1. 小样本高光谱分类一份能跑通的 Python 源码到底解决了什么高光谱图像分类这个方向最劝退新手的从来不是模型结构而是数据本身。一张高光谱影像动辄几百个波段标注成本极高公开数据集里能用的训练样本往往每类只有几个到几十个像素。你拿常规 CNN 直接怼上去过拟合几乎是必然的验证集准确率能给你表演一个过山车。这份「基于深度学习方法实现小样本条件下的高光谱图像分类」Python 源码包针对的就是这个痛点它把少样本场景下的训练流程、数据划分、模型定义和评估脚本整理成了一套可复现的工程而不是丢给你一个孤零零的.py文件让你自己猜怎么接数据。适合谁正在做遥感、地物分类、高光谱相关课题手里有数据但苦于样本太少跑不出结果的人也适合想拿一个完整小样本分类 pipeline 练手深度学习的同学。它解决的核心问题是在标注样本极度受限时如何用一套结构清晰的代码把分类任务跑起来并拿到可解释的结果。2. 拆开源码包目录结构、依赖与数据组织方式2.1 先看清工程骨架再动手拿到一个源码包我习惯先不跑先把目录树和入口文件摸清楚。高光谱分类项目通常包含数据加载、模型定义、训练循环、评估指标、配置文件这几块。你解压后大概率会看到类似这样的结构不同作者命名略有差异以实际为准project/ ├── data/ # 原始高光谱数据与标注 ├── datasets/ # 数据读取与预处理 ├── models/ # 网络结构定义 ├── utils/ # 指标、可视化、日志 ├── configs/ # 超参与路径配置 ├── train.py # 训练入口 ├── test.py # 评估入口 └── requirements.txt # 依赖清单先确认三件事入口脚本是哪个、数据放哪、配置文件在哪。很多新手翻车就翻在「直接python train.py然后报路径错误」因为作者的数据路径是写死的绝对路径。常见做法是打开configs或train.py顶部的参数区把data_root、save_dir改成你自己的路径。2.2 依赖安装与版本对齐高光谱项目对 PyTorch、NumPy、SciPy 版本比较敏感尤其是涉及scipy.io.loadmat读取.mat标注文件时。建议先建虚拟环境再装依赖# 创建独立环境避免污染全局 conda create -n hsi_fsl python3.8 -y conda activate hsi_fsl # 按依赖清单安装优先用官方源 pip install -r requirements.txt # 若 torch 未在清单中按 CUDA 版本单独装 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118逻辑说明python3.8是多数高光谱开源代码验证过的稳定版本太新的 Python 有时会让老版本 SciPy 编译失败。requirements.txt里通常锁定了numpy、scipy、scikit-learn、matplotlib等。参数上cu118要换成你机器实际的 CUDA 版本用nvidia-smi查。如果没 GPU把 torch 换成 CPU 版即可但训练会慢很多。提示装完先python -c import torch; print(torch.cuda.is_available())确认 GPU 是否可用别等训练跑起来才发现在用 CPU。2.3 数据集的摆放与标注读取小样本高光谱分类常用的公开数据集有 Indian Pines、Pavia University、Salinas 等格式多为.mat。源码一般会约定数据目录结构比如文件作用常见格式影像数据原始高光谱立方体.mat中的(H, W, B)数组标注图每像素类别标签.mat中的(H, W)整型矩阵划分索引训练/验证/测试样本位置.npy或脚本内随机生成你需要确认标注里0是背景还是未标注类很多代码默认0为背景并剔除。如果搞反了训练集里会混进大量无效像素准确率直接崩。常见做法是在数据加载脚本里加一句统计print(np.unique(labels))先看清类别分布再往下走。3. 小样本分类的核心数据划分、模型与训练循环怎么落地3.1 少样本划分策略决定成败小样本的核心矛盾是「每类样本极少」。源码里通常采用按类别分层抽样的方式每类取固定数量如 5、10、15 个作为训练样本其余作为测试。这一步的随机种子极其关键不同种子下结果可能差好几个百分点这也是这个方向被吐槽「玄学」的原因之一。import numpy as np from sklearn.model_selection import train_test_split def sample_per_class(labels, num_per_class10, seed42): 按类别分层抽样每类取 num_per_class 个训练样本 rng np.random.RandomState(seed) train_idx, test_idx [], [] for c in np.unique(labels): if c 0: # 跳过背景类 continue idx np.where(labels c)[0] rng.shuffle(idx) train_idx.extend(idx[:num_per_class]) test_idx.extend(idx[num_per_class:]) return np.array(train_idx), np.array(test_idx)逻辑说明num_per_class就是「小样本」的量化指标常见取值 5/10/15越小任务越难。seed固定后结果可复现写论文时务必固定并说明。c 0的判断要按你数据集实际情况调整有的数据集背景是0有的是-1。参数上训练样本越少越要配合数据增强和正则化否则模型记不住任何东西。3.2 模型结构与少样本适配高光谱分类常见网络有 3D-CNN、光谱-空间联合网络、以及近两年流行的注意力/Transformer 变体。小样本场景下模型不宜过深参数量要压住否则几个样本根本喂不饱。源码里一般会定义一个可配置的 backbone输入是像素邻域立方块如11×11×B输出是类别数。import torch import torch.nn as nn class SmallSampleCNN(nn.Module): def __init__(self, in_bands, num_classes, patch11): super().__init__() # 光谱-空间特征提取卷积核不宜过大 self.features nn.Sequential( nn.Conv3d(1, 8, kernel_size(3, 3, 3), padding1), nn.BatchNorm3d(8), nn.ReLU(inplaceTrue), nn.Conv3d(8, 16, kernel_size(3, 3, 3), padding1), nn.BatchNorm3d(16), nn.ReLU(inplaceTrue), nn.AdaptiveAvgPool3d((1, 1, 1)), # 全局池化压掉空间维度 ) self.classifier nn.Linear(16, num_classes) def forward(self, x): x self.features(x) x x.view(x.size(0), -1) return self.classifier(x)逻辑说明in_bands是波段数patch是邻域窗口大小决定输入立方体边长。Conv3d同时卷光谱和空间维度这是高光谱的典型做法。AdaptiveAvgPool3d((1,1,1))把特征压成向量再接全连接能显著减少参数量适合小样本。参数上通道数8/16是保守配置样本多时可以加到32/64kernel_size用3是平衡感受野和参数量的常见选择。3.3 训练循环与关键超参训练脚本里要盯住几个超参学习率、批大小、迭代轮数、优化器。小样本下批大小通常很小如 16 甚至 8学习率也要相应调低否则 loss 震荡。import torch.optim as optim device torch.device(cuda if torch.cuda.is_available() else cpu) model SmallSampleCNN(in_bands200, num_classes16).to(device) criterion nn.CrossEntropyLoss() optimizer optim.Adam(model.parameters(), lr1e-3, weight_decay1e-4) for epoch in range(200): model.train() for x, y in train_loader: x, y x.to(device), y.to(device) optimizer.zero_grad() loss criterion(model(x), y) loss.backward() optimizer.step() # 每若干轮打印一次验证指标便于观察过拟合 if epoch % 20 0: print(fepoch {epoch}, loss {loss.item():.4f})逻辑说明weight_decay1e-4是 L2 正则小样本下抑制过拟合的重要手段这也是热词里「深度学习 L2 正则化」的实际落点。lr1e-3是 Adam 的常用起点若 loss 不降可试1e-4。epoch200只是示例实际要看验证曲线早停early stopping能省不少时间。批大小、轮数这些参数最好写进配置文件方便做对比实验。4. 避坑与排查小样本高光谱分类最容易翻车的五件事4.1 准确率虚高其实是数据泄漏现象测试准确率 99% 以上好得不真实。原因训练和测试样本来自同一像素邻域邻域窗口重叠导致信息泄漏。解决划分时以像素为单位严格隔离或采用不相交的空间块划分别让训练块和测试块挨着。4.2 每类样本数不一致导致类别失衡现象某些类几乎全错整体准确率被大类拉高。原因抽样时没做均衡或背景类混入。解决用分层抽样保证每类训练样本数一致评估时同时看 OA、AA、Kappa 三个指标别只看总体准确率。4.3 随机种子不固定结果无法复现现象同一份代码跑两次结果差很多。原因抽样、权重初始化、数据打乱都没固定种子。解决在脚本开头统一设置np.random.seed、torch.manual_seed、torch.cuda.manual_seed_all并把种子写进实验记录。4.4 显存爆掉或训练极慢现象CUDA out of memory或一个 epoch 跑十几分钟。原因邻域窗口开太大、批大小过高、数据没做归一化。解决把patch从15降到11甚至9批大小减半输入前做逐波段标准化。4.5 路径写死导致换机器就报错现象FileNotFoundError或KeyError读不到.mat里的键。原因作者用了绝对路径或.mat变量名和你以为的不一样。解决改成相对路径用scipy.io.loadmat后先print(data.keys())看清变量名再取。5. 进阶技巧把小样本结果做扎实的几个习惯想让这份源码跑出的结果经得起推敲光跑通还不够。第一件事是固定多种子重复实验取均值和标准差而不是报一次最好结果。小样本任务方差大单次结果没有说服力。我一般会跑 5 个种子把 OA 的均值±标准差列成表这样对比不同方法时才公平。第二件事是消融。源码里如果有数据增强、正则化、注意力模块这些开关逐个关掉看指标变化你才知道哪个模块真正在起作用。很多论文里的「创新点」在小样本下其实贡献有限消融一做就露馅。第三件事是可视化分类图。把预测结果映射回原图尺寸和 ground truth 并排看能直观发现哪些区域错得离谱。代码里通常有utils下的绘图函数没有就自己用matplotlib补一个import matplotlib.pyplot as plt def show_classification(pred_map, gt_map): fig, ax plt.subplots(1, 2, figsize(10, 5)) ax[0].imshow(gt_map, cmapjet) ax[0].set_title(Ground Truth) ax[1].imshow(pred_map, cmapjet) ax[1].set_title(Prediction) plt.tight_layout() plt.savefig(result_compare.png, dpi200)逻辑说明pred_map是把测试像素预测值填回原图坐标的矩阵gt_map是标注图。cmapjet便于区分类别dpi200保证出图清晰。这一步能帮你快速判断模型是整体偏了还是只在边界出错。最后是记录习惯。每次改超参、换种子、调窗口大小都在一个experiment_log.md里记一行日期、改动、OA/AA/Kappa。血泪经验是不记录的话三天后你根本想不起来哪个配置对应哪个结果只能重跑。从那以后我每次动超参前都强制先写一行日志再改代码省下的返工时间远超这点记录成本。希望这份源码和上面的拆解能帮你把高光谱小样本分类这条路走得顺一点。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑