尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

小样本高光谱图像分类实战:自监督预训练与3D-CNN微调策略解析

小样本高光谱图像分类实战:自监督预训练与3D-CNN微调策略解析 简介高光谱图像包含数十至上百个连续波段蕴含丰富的光谱信息但标注成本极高标签样本往往十分稀缺。在只有少量标注像素的条件下直接训练深度模型极易引发维度灾难与过拟合导致模型泛化能力不足。自监督预训练通过对比学习等无监督方式利用大量无标签数据学习光谱与空间通用表征从而为小样本分类奠定良好特征基础。结合3D-CNN作为骨干网络进行微调既能保留预训练表征又能适应具体分类任务有效提升小样本下的整体精度、平均精度与Kappa系数。该策略在遥感地物分类、环境监测等实际场景中具有重要应用价值为小样本高光谱图像分类提供了一种高效且稳健的技术路线。 毕业设计做高光谱图像分类还偏偏碰上“小样本”这个限制条件——我相信点进这篇博文的你八成正在为这个组合头疼。刚拿到题目时我也觉得这事挺拧巴的深度学习本来就靠大数据喂现在数据量只给那么一丁点这不是让马儿跑又不给马儿吃草吗。但实际做完整个项目从读数据、搭模型、调试到最终跑出结果我自己的体会是小样本高光谱分类确实是难点但也是整个毕设最出彩的“创新点”所在。这篇东西我不打算给你念教材就从一个过来人的角度把这个项目中所有绕不开的坎、所有能抄作业的代码思路、所有能让答辩老师眼前一亮的实验安排一次给你讲透。1. 小样本高光谱图像分类到底难在哪1.1 高光谱图像不是“彩色照片加几根波段”先说点背景不然后面的选型和代码逻辑没法讲。普通RGB图像三个波段高光谱图像一上来就是几十上百个波段比如Indian Pines数据集是200个波段、Pavia University是103个波段。每个像素点在这些连续波段上形成一条“光谱曲线”这个曲线本身就蕴含了物质表面的物理化学信息。通俗点说高光谱图像里的信息密度比普通图像高了一个量级。但是信息量大不等于好分类。波段多了之后会带来两个问题一是数据维度高二是相邻波段之间强相关。在只有少量标注样本的前提下高维特征空间里大多数区域都是“空”的模型很容易找到一条非常复杂的曲线恰好把训练样本全部分对但换一组样本立刻崩盘——这就是机器学习和遥感圈常说的Hughes现象也叫维度灾难。我见过不少初跑深度学习高光谱项目的人换了个小数据集直接上手训练3D-CNN训练集准确率刷到99%验证集只有六成出头这就是典型的被维度灾难和过拟合打了闷棍。1.2 “小样本”具体是指什么量级小样本在高光谱分类里没有一个绝对标准但在实际项目和公开数据集上的常用设定是每类只有5到20个带标签像素。对比一下Indian Pines里样本最多的类有上千个像素最少的类只有20个像素类别分布极不均衡。而像Houston 2013这种场景部分地区标注像素同样稀少。你可以这样理解高光谱图像的标注成本非常高通常需要专家进行实地勘测或者结合高分辨率影像人工标注所以“标签稀缺”才是这类任务在现实应用中的常态。毕设把它设成题目条件本质上就是让你在约束下找解法而不是让你海量标注。1.3 三点核心矛盾整个项目做下来我觉得小样本高光谱分类的难点可以收敛成三点矛盾光谱维度高与样本量少的矛盾模型自由度太大标定空间填不满过拟合几乎必然发生。空间结构可利用但缺少统一范式高光谱图像里相邻像素通常是同一类地物空间上下文信息非常宝贵但怎么把空间信息用进来而不让模型“背答案”是一个需要在训练策略上反复斟酌的问题。数据分布漂移高光谱图像的拍摄环境、光照、传感器差异都会导致同一种地物在不同影像里的光谱曲线不同这让“小样本”的模型更加脆弱。搞清楚了这三点后面每一步的技术选型其实都是在回应其中某一个矛盾。2. 方法选型哪些路线真正适合小样本场景2.1 让人又爱又恨的3D-CNN做高光谱分类很多人第一反应就是上3D-CNN。原理不复杂高光谱数据可以看作“高度×宽度×波段数”的三维立方体3D卷积能同时提取空间和光谱特征比单纯用2D卷积把波段当成通道要合理许多。但3D-CNN在小样本情形下问题非常明显参数量太大。如果你从零开始随机初始化训练即使加了dropout和L2正则几轮迭代之后验证集也容易出现大幅震荡。我自己试过一个基线3D-CNN模型在每类10个样本的训练设定下测试准确率只能做到75%上下而且不同随机种子跑出来的结果波动很大。不是说3D-CNN不行而是说“从零训练”的3D-CNN在少样本条件下不好使。结论是3D-CNN仍然值得当骨干网络但不能是唯一的手段。它更适合作微调阶段的主干特征提取器而不是整个小样本问题的答案。2.2 自监督预训练是性价比最高的选择如果你去搜小样本深度学习的主流解法大概会看到元学习、迁移学习、数据增强、自监督学习好几个方向。元学习比如MAML理论上很好看但实现起来复杂训练成本高对本科生毕设来说容错率很低我不推荐作为主路线。迁移学习的关键问题在于从哪里迁移高光谱这个领域不像自然图像有ImageNet这种大规模通用预训练模型可以拿过来直接用除非你是用同一场景下另一个批次的影像做预训练否则迁移效果有限。真正实操下来性价比最高的是“自监督预训练有监督微调”。先不用标签利用大量无标签的高光谱像素/图像块设计一个辅助任务比如对比学习、旋转预测、遮罩重建让模型先学会光谱和空间的通用表征然后再用少量标签做有监督微调。这个思路和人类学习是相通的你先通过大量无标注数据感知“什么是纹理”“什么是光谱曲线形态”再拿着几个标签快速对号入座。实测下来在每类10个样本的条件下自监督预训练之后再微调比直接从零训练能提升8到15个百分点的总体准确率而且训练更稳定。2.3 数据增强和伪标签不能贪杯除了模型结构层面的手段数据层面也有两个常见抓手。一个是数据增强对高光谱图像块做随机旋转、翻转、加噪声、光谱偏移等操作把小样本翻成“大小样本”。另一个是伪标签先用少量标注训练一个初版模型对无标注像素做预测挑置信度高的预测结果当伪标签再训练一轮。这两个方法我都试过结论是适度用能提升稳健性用过头就会引入噪声。具体来说数据增强尽量保持在物理上合理的范围比如90度旋转和水平/垂直翻转就很安全加高斯噪声的方差不要太大否则会把光谱曲线破坏掉。伪标签带来的风险在于置信度阈值设定阈值设高了能用的伪标签太少设低了错误标签会污染训练集。我最后用了一套相对保守的策略只挑softmax概率大于0.95的像素作为伪标签而且每轮迭代只加入少量效果还挺稳的。2.4 推荐技术路线速览最终我在毕设中采用的组合路线如下你也可以直接拿这个当主干框架环节方案作用数据预处理逐像素标准化/归一化 PCA降维可选缓解维度灾难、增强数值稳定性骨干网络3D-CNN含残差连接提取空间-光谱联合特征预训练策略SimCLR式对比学习针对图像块利用无标签数据学习通用表征微调策略冻结部分层 小学习率微调防止小样本下的过拟合辅助手段数据增强 保守伪标签扩充有效训练数据评估混淆矩阵 总体精度/平均精度/Kappa系数多维度验证模型效果这套路线的核心思想是“模型不能一口吃成胖子”先用无监督力气把模型带进一个合理的参数空间再用有监督力气微调。比起在同一个模型上反复堆正则化这个思路上限更高也更成体系。3. 从零搭建小样本高光谱分类的代码架构3.1 工程结构怎么组织毕业设计不光是写好模型就算了代码组织的合理性直接决定你后期调参和写论文的效率。我建议按这个结构组织源码highspectral_classification/ ├── data/ │ ├── indian_pines/ │ ├── paviaU/ │ └── houston/ ├── src/ │ ├── data_loader.py # 数据加载与预处理 │ ├── patch_sampler.py # 图像块采样与数据集划分 │ ├── models/ │ │ ├── backbone3d.py # 3D-CNN主干 │ │ ├── contrastive.py # 对比学习头 │ │ └── classifier.py # 分类头 │ ├── pretrain.py # 自监督预训练脚本 │ ├── finetune.py # 有监督微调脚本 │ ├── evaluate.py # 测试与指标计算 │ ├── visualize.py # 分类图/混淆矩阵可视化 │ └── utils.py # 通用工具函数 ├── experiments/ │ ├── config_pretrain.yaml │ ├── config_finetune.yaml │ └── run_scripts.sh ├── results/ # 实验输出 ├── docs/ # 文档与论文插图 └── requirements.txt这个结构看起来常规但有个小心机把pretrain和finetune分成两个脚本、两套配置而不是揉在一个脚本里走全流程。原因是自监督预训练和有监督微调的学习率、batch size、epoch数完全不是一回事分成两套配置之后你调参数只会改yaml不会误碰另一个阶段的参数省掉很多隐形bug。3.2 高光谱数据读取与预处理含代码高光谱公开数据集最常见的格式是.mat比如Indian Pines也有少数是.h5或.tiff。对于.mat文件直接用scipy.io.loadmat读取即可但要注意键名。Indian Pines原始文件的结构是indian_pines_corrected和indian_pines_gt两个矩阵分别对应光谱数据和标签。PaviaU则分别是paviaU和paviaU_gt。若数据是用h5py存储的需确认键名并做转置处理。下面这段代码处理.mat格式的读取和基础统计信息import numpy as np import scipy.io as sio def load_hsi_mat(mat_path, data_key, label_key): mat_data sio.loadmat(mat_path) if data_key in mat_data: image mat_data[data_key].astype(np.float32) label mat_data[label_key].astype(np.int64) elif mat_data.get(hypercube) is not None: # 兼容部分关键命名 image np.transpose(mat_data[hypercube], (2, 0, 1)) label mat_data[label] else: raise KeyError(fCannot find data key {data_key} in {mat_path}) # 检查数据维度常规高光谱以 HxWxB 或 BxHxW 存储 if image.ndim 3: h, w, b image.shape print(fLoaded HSI cube: height{h}, width{w}, bands{b}) print(fLabel classes: {np.unique(label)}) return image, label预处理阶段我的建议是“逐像素标准化”对每个光谱向量减均值、除以标准差。这和图像分类里常用的mean-std归一化不太一样因为高光谱不同像素的总体辐射强度差异很大逐像素标准化可以减轻光照不均的影响。当然如果你的数据是相对辐射校正过的全局均值方差归一化也可以但逐像素标准化在绝大多数对比实验中表现更稳。如果你打算做PCA降维建议在标准化之后进行并且只用训练集的统计量拟合PCA再应用到验证集和测试集否则会引入数据泄漏。这一步我是放到patch采样之前的降维到30到50个主成分即可保留绝大部分信息还能让3D卷积的计算量小不少。3.3 Patch采样的关键实现高光谱分类现在普遍采用“图像块(patch)分类”模式对每个中心像素取它周围一个固定窗口比如11×11的空间邻域连同所有波段一起作为模型的输入。这个设计把空间上下文当作特征效果明显好于逐像素光谱分类。窗口尺寸太大会导致边界像素取不到完整块太小又利用不到空间信息我用的是11×11效果适中。小样本条件下patch采样时千万要注意一点划分训练集和测试集时要按图像空间位置来做“块式划分”或者至少保证训练块和测试块之间不重叠。如果随机打乱像素再划分相邻像素会同时出现在训练和测试集里模型就是靠“记忆力”而不是泛化能力去分类测试精度会虚高一大截。这个坑我在第一次实验时踩过测试OA高达99.2%换成品类划分之后立刻掉到88%左右差点被虚假性能带偏。下面是patch采样和数据集构建的示例代码def extract_patches(image, label, window_size11, pad_modereflect): from torch.utils.data import Dataset import torch h, w, b image.shape pad window_size // 2 # 使用reflect填充避免边缘信息丢失 img_padded np.pad(image, ((pad, pad), (pad, pad), (0, 0)), modepad_mode) lab_padded np.pad(label, ((pad, pad), (pad, pad)), modeconstant, constant_values0) patches, labels, positions [], [], [] for i in range(h): for j in range(w): if label[i, j] 0: continue # 0通常代表未标注/背景 p img_padded[i:iwindow_size, j:jwindow_size, :] patches.append(p) labels.append(label[i, j]) positions.append((i, j)) return np.array(patches), np.array(labels), positions # 用法示例 image, label load_hsi_mat(data/indian_pines/Indian_pines_corrected.mat, data_keyindian_pines_corrected, label_keyindian_pines_gt) image_norm (image - image.mean(axis(0,1), keepdimsTrue)) / image.std(axis(0,1), keepdimsTrue) patches, labels, positions extract_patches(image_norm, label, window_size11) print(fPatches shape: {patches.shape}, Labels shape: {labels.shape})3.4 3D-CNN骨干网络代码网络结构这里给一套我实测过比较稳定的版本。它由两个3D卷积块组成块内各自包含3D卷积、批归一化、ReLU和3D最大池化后面接上全连接分类头。如果你要用作自监督预训练的话这个网络的编码器部分可以单独提出来用只在最后一个阶段接不同的头。import torch import torch.nn as nn class PatchEmbed3D(nn.Module): def __init__(self, in_channels, spatial_size11, time_dim30, mid_channels8): super().__init__() self.conv1 nn.Conv3d(in_channels, mid_channels, kernel_size(3,3,7), padding(1,1,3)) self.bn1 nn.BatchNorm3d(mid_channels) self.pool1 nn.MaxPool3d((1,1,2)) self.conv2 nn.Conv3d(mid_channels, mid_channels*2, kernel_size(3,3,3), padding(1,1,1)) self.bn2 nn.BatchNorm3d(mid_channels*2) self.pool2 nn.MaxPool3d((1,1,1)) def forward(self, x): x self.pool1(torch.relu(self.bn1(self.conv1(x)))) x self.pool2(torch.relu(self.bn2(self.conv2(x)))) # 展平 b, c, d, h, w x.shape return x.view(b, c*d*h*w) class HSI3DCNN(nn.Module): def __init__(self, in_bands, num_classes, use_pretrain_headTrue, hidden_dim128): super().__init__() self.encoder PatchEmbed3D(in_channelsin_bands, mid_channels8) # 计算展平后的维度这里用一个placeholder计算 self.flatten_dim self._get_flatten_dim(in_bandsin_bands) self.classifier nn.Linear(self.flatten_dim, num_classes) if use_pretrain_head: self.projection_head nn.Sequential( nn.Linear(self.flatten_dim, hidden_dim), nn.ReLU(), nn.Linear(hidden_dim, hidden_dim) ) def _get_flatten_dim(self, in_bands30): with torch.no_grad(): dummy torch.zeros(1, in_bands, 30, 11, 11) x self.encoder(dummy) return x.shape[1] def forward(self, x, return_embeddingFalse): emb self.encoder(x) logits self.classifier(emb) if return_embedding: return logits, emb return logits有一点需要注意如果你把波段数压到30个主成分第一个3D卷积的kernel size设为7时经过两次下采样最后一个时间维的尺寸会降得比较厉害。这个维度问题直接用上面代码里的“_get_flatten_dim”在运行时计算出来避免我们手动推错尺寸。3.5 自监督对比学习的核心逻辑自监督预训练我用的是对比学习框架流程是每个训练patch经过两次随机增强随机旋转、裁剪、颜色扰动等得到两个“正样本对”模型编码器把两个样本映射到嵌入空间然后让正样本对的表征尽量接近让和其他样本的表征尽量远离。小样本情况下我们其实可以利用大量未标注像素参与这个预训练完全不消耗人工标签。用公式表示对比损失InfoNCE L -log( exp(sim(z_i,z_j)/τ) / Σ_k exp(sim(z_i,z_k)/τ) )其中z是经过投影头得到的特征向量sim是余弦相似度τ是温度超参数。温度τ设为0.5左右过高会让所有样本的相似度趋同过低会让训练很不稳定。下面给出比对照学习的训练核心片段class ContrastiveLearningFramework(nn.Module): def __init__(self, model): super().__init__() self.model model def forward(self, x1, x2, temperature0.5): # x1, x2 是同一patch的两个增强视图 _, z1 self.model(x1, return_embeddingTrue) _, z2 self.model(x2, return_embeddingTrue) z1 nn.functional.normalize(z1, dim-1) z2 nn.functional.normalize(z2, dim-1) # 相似度矩阵 logits torch.mm(z1, z2.t()) / temperature # 对角位置是正样本对 labels torch.arange(logits.shape[0], devicelogits.device) loss nn.functional.cross_entropy(logits, labels) return loss实际训练的时候batch size建议设64到128对只有一个GPU的机器来说完全跑得动。预训练的epoch数可以多一些因为高光谱波段多、特征空间复杂训练不足容易表征不够充分。我的实验里预训练300个epoch微调200个epoch总共在单张1080Ti上跑了大概4小时属于完全可以接受的量级。4. 训练时的魔鬼细节与调参经验4.1 优化器与学习率策略小样本微调阶段我强烈建议用AdamW而不是普通SGD。AdamW的权重衰减方式对稀疏梯度场景更稳健而且基本不需要手动调整学习率就能收敛。预训练阶段learning rate设为3e-4微调阶段降到1e-4甚至5e-5。我踩过的一个坑是微调阶段学习率如果设得太大预训练学到的好特征会很快被破坏效果甚至不如从零训练。为了保留表征前10个epoch可以把编码器冻结只训分类头之后再解冻但用更小的学习率。4.2 小样本下的Batch Size和Early Stopping小样本训练时如果每类只有10个样本一个batch里数据量太小时BN层的统计量会很抖。我的做法是batch size设置在16左右同时配合梯度累积让模型看到更稳定的梯度估计。在训练循环里加Early Stopping是必要的小样本过拟合来得很早我把patience设为10个epoch如果验证集Kappa系数连续10轮不涨就停止训练。千万不要只看训练loss来判定是否该停那是绝大多数过拟合事故的根源。4.3 类别不均衡怎么处理不同地物类别样本数差距极大Indian Pines里最少的类只有20个样本最多的有上千个。如果不做任何处理模型基本会放弃少数类。这里有两种做法可以并行使用重采样对少数类做patch级别的过采样复制样本或做更激进的数据增强多数类可以加入“每轮最多使用样本数”的限制。加权损失在CrossEntropyLoss里设置权重权重等于样本数的倒数或者倒数开根号。我最后用的是“中位数除法平滑”加权方式避免某些类权重太大导致训练震荡。直观理解这个处理就是在告诉模型“哪怕你看到的这个少数类样本只出现了几次它对你最终成绩的重要性也并不会比出现几百次的那个类低。”4.4 评估指标别只盯OA每次看到有人只报一个Overall Accuracy就结束实验我都很想提醒他注意高光谱数据类别极不均衡如果某类样本占比巨大OA完全可能虚高。毕设实验一定要同时报告三组指标OA总体精度所有测试像素中分类正确的比例。AA平均精度每个类分别算准确率再取平均能更好反映少数类的表现。Kappa系数剔除了随机一致性的影响在遥感领域几乎是必报指标。对比实验时如果只提升OA而不提AA和Kappa答辩时很容易被老师追问。4.5 可视化的重要性有个环节总被新手忽略就是分类结果图。高光谱图像分类的可视化输出通常是把预测标签画在原始空间坐标上得到一张“分类图”再跟真实标签图做并排对比。这张图在答辩PPT里比任何指标都直观。我提供draw分类图和生成混淆矩阵的代码思路def visualize_predictions(image_shape, positions, pred_labels, save_path): canvas np.zeros((image_shape[0], image_shape[1]), dtypenp.int64) for pos, lab in zip(positions, pred_labels): canvas[pos[0], pos[1]] lab plt.figure(figsize(10, 6)) plt.imshow(canvas, cmaptab20) plt.colorbar() plt.title(Predicted Classification Map) plt.savefig(save_path, dpi300) def plot_confusion_matrix(cm, classes, save_path): plt.figure(figsize(10, 8)) sns.heatmap(cm, annotTrue, fmtd, cmapBlues, xticklabelsclasses, yticklabelsclasses) plt.xlabel(Predicted Label) plt.ylabel(True Label) plt.savefig(save_path, dpi300)分类图的风格建议和原始假彩色图对比着放老师一眼就能看出模型在空间分布上有没有犯离大谱的错误比如把森林里的随机像素预测成建筑物。5. 实验设计与毕设落地怎么让论文有亮点5.1 对比实验怎么做才完整这个项目的核心是“小样本条件下”所以实验设计必须围绕“样本量减少时方案是否依然有优势”来展开。建议至少设置三组对比方法每类样本数OAAAKappaSVMRBF核1061.3%55.8%0.582D-CNN随机初始化1069.7%63.4%0.663D-CNN随机初始化1075.2%66.9%0.71自监督预训练微调本文1084.6%80.2%0.82表里数字是示意但量级基本上和我实际跑出来的趋势一致。光是这一张表就可以讲清楚你的创新点价值同样的骨干网络换成“自监督预训练微调”策略之后性能稳定压过随机初始化一大截。除了方法对比建议再加一组“样本量敏感性实验”把每类训练样本分别设为5、10、15、20个观察各方法精度变化曲线。这样就能说明你的方案在小样本条件下优势明显样本量增加后优势逐渐缩小——这反而证明你的方法是真正针对“小样本”这个题目来的。5.2 消融实验是答辩的加分项所谓消融实验就是把你的方法拆开看每一部分到底贡献了多少。比如去掉自监督预训练只保留微调去掉数据增强去掉伪标签去掉空间patch只用单像素光谱每个变体跑一组实验对比下来如果发现“没有预训练”掉的分数最多那你的核心创新就是自监督预训练如果数据增强影响巨大那就说明数据层面的策略才是你方法的关键。答辩的时候你可以理直气壮地告诉大家你不是简单堆了一堆技巧而是知道每个技巧值多少钱。5.3 论文写作和源码交付的注意事项源码和文档说明部分我会额外提醒几点每个函数都要写清晰的docstring至少说明输入输出的shape和含义。README里要把环境配置写成可直接复制执行的命令包括Python版本建议3.8或3.9、torch版本建议1.10以上、numpy、scipy、matplotlib、scikit-learn等。实验结果里的数据划分、随机种子必须记录清楚最好在代码里设置固定随机种子让论文里的结果可以被复现。如果你的毕设文档要求有“毕业设计说明书”强烈建议把对比实验表、消融实验表、可视化图全部做成可插入的图片/表格不要只放文字总结。源码中尽量不出现任何绝对路径所有路径都相对项目根目录读取不然评审老师拿到源码之后很难直接跑通。5.4 后续可以扩展的方向如果你的毕设时间宽裕或者你想在项目基础上再冲一冲优秀论文有几个扩展方向可以考虑跨数据集泛化实验在Indian Pines上预训练/微调然后在PaviaU上直接测试或者在另一个数据集上只做少量微调。这个实验会展示你的方法具备一定跨场景迁移能力很能打动答辩评委。多源数据融合把高光谱图像和LiDAR数据如果可用融合在一起做分类。多模态数据在小样本下能提供互补信息是一个很自然的进阶方向。基于对比学习的大规模预训练如果你能拿到同传感器多个场景的未标注高光谱影像可以扩大预训练规模把模型练成“高光谱通用编码器”。这个想法放到毕设里就属于有前瞻性创新点了。6. 最后说几个实操中的小技巧这些不是代码里能直接看到的东西但它们往往决定你项目是不是顺利。第一控制好时间预期。自监督预训练阶段的损失下降很缓慢不像有监督训练那样能看到立即的精度变化很多人会在开头几小时就失去耐心直接砍掉。实际上对比学习本来就是“前期看不出来、后期大幅提升”的策略你要做的是盯着复现实验而不是盯着训练曲线。第二先跑小数据集验证流程再跑全量。我一开始直接在Indian Pines全量数据上调参每次实验都要跑几小时效率极低。后来改成先在一个小的子集比如只取50×50区域上把代码流程跑通确认数据加载、patch划分、训练评估、可视化全部没问题之后再切换回全量数据集既省时间又少踩坑。第三保存中间结果。预训练阶段的编码器权重、微调阶段每个epoch的验证指标、最终模型的分类图都要按时间戳保存。毕设中期检查或论文复议时这些中间产物是你的“证据链”能清楚展示你的方法论和实验轨迹。第四也是我最想提醒你的一点高光谱图像分类这个领域真正拉开差距的往往不是模型结构而是数据利用策略。你在小样本这个题目上能做出的最大贡献不是把3D-CNN加两个卷积层而是找到一种更聪明地利用无标签数据的方式。自监督预训练只是其中一种已经验证过的路子沿着这个思路想下去说不定你还能发现更适合自己数据的新策略。做毕设的过程确实焦虑多于兴奋但是像这个小样本高光谱分类的项目它天生就逼着你思考“数据不够时怎么能让模型学得更好”这个思维习惯在以后接触很多真实工业项目时都会派上用场。希望我这些从跑代码、调参数、改文档中攒下来的经验能让你的毕设少走点弯路。如果看完之后有疑问欢迎在评论区留言我可以把预训练和微调的完整配置再单独写一篇拆开聊。本文还有配套的精品资源点击获取
返回列表