
简介数据分类是天文信息处理的核心环节面对海量天体光谱传统人工判读与模板匹配方法已难以满足时效与规模需求。光谱型分类本质上是一维信号的模式识别问题卷积神经网络CNN通过多层卷积自动提取局部到全局的谱线特征无需人工设计特征即可实现高精度判别成为替代传统方案的主流技术路径。以LAMOST巡天数据为对象深度学习模型能够高效处理千万量级恒星光谱完成OBAFGKM光谱型与光度级的自动分类并输出带置信度的科学星表。该技术广泛应用于恒星物理参数测量、特殊天体搜寻及大规模巡天数据挖掘在测光与光谱联合分析中具有重要工程价值。本文从数据预处理、类别不均衡处理、一维卷积网络设计到星表质量审查完整介绍了一套可复现的自动化光谱分类流水线为天文大数据时代的科研数据产品生产提供了可靠范式。1. 恒星光谱分类这件事为什么值得用卷积神经网络重做一遍1.1 光谱分类到底是什么天文研究为什么离不开它恒星光谱分类是天体物理学最古老也最基础的任务之一。每颗恒星的光谱本质上是它表面物理状态的指纹——温度、表面重力、金属丰度全部以吸收线深浅、连续谱形态、特定谱线强弱的方式写在一条光谱里。天文学家把恒星按照光谱特征归类最经典的体系就是Morgan-Keenan分类也就是我们常说的O、B、A、F、G、K、M序列从炽热的蓝白色O型星到偏冷的红色M型星再配合I到V的光度级构成一个二维分类网格。太阳在这个体系里是G2V这几个字符背后就锁定了它的有效温度约5770K、表面重力落在主序带附近。以前做光谱分类靠的是人眼和经验。观测者拿到一张底片或一条光谱对比标准星模板判断吸收线强度然后给出一组MK类型。这种方式准确度高但速度是硬伤。一个人一天能分类几百条光谱已经算非常快了而且需要长期训练才能保持标准一致性。更麻烦的是不同人之间的判断会有系统差同一个人状态不同时也可能漂移。所以在海量光谱数据面前人工分类根本不是个可扩展的方案。到了LAMOST这一代设备情况彻底变了。LAMOST一次曝光可以同时获取4000条光谱一晚上轻松产出数万条。截至当前LAMOST已经发布了千万量级的恒星光谱这个数量级已经完全不是人力可以处理的了。自动分类不是可选项是必选项。1.2 LAMOST的数据规模给传统方法带来的压力LAMOST的关键优势在于它的视场足够大焦面上密布光纤能够在一个3到5度的视场内一次对准几千个天体。这种设计让它在巡天效率上极其恐怖。但效率高的另一面就是数据产出速度和人工处理能力之间的鸿沟越来越大。传统自动分类方法也不是没有。LAMOST早年的pipeline中用的是模板匹配和谱线指数测量相结合的方式简单说就是把观测光谱跟一套理论或经验模板做相关分析取最接近的模板类型作为输出。这种方法在信噪比高的时候表现不错但有几个根深蒂固的问题。第一模板匹配容易受红移和视向速度影响虽然恒星光谱的红移通常很小但光谱的波长标定误差、仪器轮廓差异都会让相关性计算出现偏差。第二模板库的密度有限。如果一颗恒星恰好处于两个模板之间或者有特殊的化学丰度特征模板匹配的结果就会在几个类型之间摇摆。第三模板匹配很难给一个合理的不确定度估计它输出的相似度分数本质上不是一种概率。光谱型分类本质上是一个非常典型的模式识别问题。输入是一条长度几千的一维数组输出是离散的类别标签。这种问题恰恰是卷积神经网络最擅长解决的。1D卷积可以直接在一维光谱信号上滑动滤波核逐层提取从局部到全局的特征最后通过softmax层输出每个光谱型的概率分布。相比模板匹配CNN不用人为设计特征也不需要维护庞大的模板库只要数据充足它自己会找到区分不同光谱型的关键模式。1.3 CNN做光谱分类的核心逻辑以及这个项目想解决什么问题这个项目的目标很直接用卷积神经网络替代人工和传统模板匹配对LAMOST的低分辨率恒星光谱进行自动分类输出一个可用的光谱型星表。星表不是简单的标签列表它必须包含天体的坐标、编号、信噪比、预测光谱型、置信度以及必要的质量标记让后续研究者能直接基于它做科学筛选。模型需要解决的实际问题有三个。第一个是多类别分类光谱型加上光度级类别数量可以扩展到几十个这不是简单的二分类问题。第二个是数据不均衡真实巡天数据里G型和K型恒星数量远超O型和B型不处理的话模型会对少数类视而不见。第三个是结果的可信度度量只给一个标签远远不够研究者需要知道这个标签有多可靠因此这里使用了软标签输出——模型给出的是每一类的概率分布而不仅仅是得分最高的那一类。在正式动手之前我们把这个项目的全链路拆成几个阶段数据获取与清洗、预处理与样本构建、模型设计与训练、评估与交叉验证、星表生成与质量审查。下面顺着这个链路把每个环节的关键细节讲清楚。2. 数据准备从LAMOST原始FITS到可训练的样本集2.1 从哪下载数据、怎么组织本地文件LAMOST的数据是公开的从官网的数据发布平台按批次下载即可。我们使用的是DR5之后的数据因为前期的数据release在天体参数上做过系统更新DR5的恒星参数一致性更好。下载时建议选择低分辨率1D光谱产品这是已经完成一维抽取、背景扣除、波长定标的光谱文件。如果你只是想复现分类流程不需要去碰2D平场和原始CCD图像那个处理链路完全是另一个工程。目录结构建议直接按release批次组织方便后面复盘和对照lamost_cnn/ ├── data/ │ ├── raw/ │ │ ├── dr5/ │ │ ├── dr6/ │ │ └── dr7/ │ ├── processed/ │ │ ├── train/ │ │ ├── val/ │ │ └── test/ │ └── catalogs/ │ ├── lamost_stellar_metadata.csv │ └── sdss_spectral_type_crossmatch.csv ├── src/ │ ├── preprocess.py │ ├── train.py │ ├── evaluate.py │ └── predict_catalog.py ├── models/ │ └── cnn_spectral/ └── output/ ├── logs/ ├── checkpoints/ └── catalogs/批量下载时不要一个个点网页直接用官方提供的FTP或HTTP目录索引配合脚本拉取。我们用了wget的递归下载配合--continue参数断了能接着下。整个DR7的恒星光谱产品解压后大概几百GB但实际不需要全量下载——先做一次目标筛选只下载信噪比大于某个阈值、且已经归类为恒星的天体目录文件再按目录索引去拉对应光谱能节省大量硬盘空间和时间。2.2 光谱FITS文件里的关键字段LAMOST一维光谱FITS文件的结构并不复杂但有几个字段需要特别留意。主头Primary Header里记录着天体的坐标和观测信息核心字段包括字段名含义使用场景RA / DEC天体的赤经赤纬J2000生成星表坐标OBJECT目标名称通常为LAMOST编号主键关联SNR信噪比估计值各波段可能分别给出样本质量筛选Z红移恒星光谱一般接近0校验是否银河系内天体R光谱分辨率判断适用分类器光谱数据本身存在Primary扩展或单独的扩展中以波长和流量两个数组为核心。波长数组通常是等间隔对数网格覆盖范围约3700到9000埃低分辨率模式的分辨率R约1800意味着在5500埃附近一个分辨元的宽度大约是3埃。这个分辨率下巴耳末线、Ca II HK线、吸收带等关键特征都清晰可辨做MK分类是够用的。一个小建议下载样本时不要只凭SNR一个指标做筛选。LAMOST的SNR字段在蓝端和红端差别很大目视检查时你会发现蓝端信噪比10的光谱和红端信噪比10的光谱质量完全不是一个概念。我们实际处理时用蓝端SNR5作为最低门槛同时要求红端SNR5再叠加一条总SNR10的过滤条件既保证样本量足够又能滤掉大量低质量的边缘光谱。2.3 预处理流程以及最容易踩坑的环节预处理是整个项目里最枯燥但最关键的一步。我们最终的流程是五步波长网格统一、流量归一化、异常谱剔除、数据增强、训练集划分。波长网格统一这一步由于LAMOST不同批次的波长起点和步长并不完全一致直接拿原始数组喂给CNN是不行的模型要求所有输入长度一致。我们统一重采样到3700到9000埃步长1埃输出长度为5301。重采样使用线性插值就够了更高阶的样条插值在这种步长变更幅度很小的场景下不会带来可感知的差异反而增加计算量。流量归一化是个需要讨论的细节。原始光谱流量值的绝对量级受观测条件、曝光时间、消光影响本身没有物理意义。我们最终采用的是中位数归一化每条光谱除以自身流量的中位数把整体量级压到1附近。为什么不用最大值归一化因为光谱里的宇宙线残差或者坏像素会产生极端峰值最大值会被污染。中位数对离群点稳健得多。归一化之后在常见的光谱型之间做目视对比轮廓一致性明显变好。这一步最容易踩的坑是坏谱没有清理干净。LAMOST自动pipeline的光谱整体质量不错但总有少数光谱存在严重的问题比如一段区域的流量出现“台阶式”跳变或者某几个波长通道完全被宇宙线打穿甚至整条光谱只是噪声没有信号。如果你不做异常谱剔除模型在训练时会被这些坏样本带偏。我们的剔除策略分两层第一层是工程判断检查流量数组中是否存在NaN或inf存在则直接丢弃第二层是统计判断计算每条光谱在中位数归一化后的标准差如果显著偏离全体样本的标准差中位数就标记为可疑样本人工抽样复核。用这两层过滤后训练集的质量就基本可控了。2.4 标签怎么来类别体系怎么定训练CNN必须有标签LAMOST的光谱分类标签来自哪里首选方案是用LAMOST内部pipeline的恒星参数结果。LAMOST数据产品中包含了斯隆数字巡天SDSS交叉证认的恒星也有基于自身数据测定的有效温度、表面重力、金属丰度。我们可以把这些物理参数映射回MK分类体系。温度对应谱型序列经典的映射表是O型对应有效温度30000K以上B型10000到30000KA型7500到10000KF型6000到7500KG型5200到6000KK型3700到5200KM型2400到3700K。表面重力logg区分光度级logg4.0为V型主序3.0到4.0为IV型亚巨星1.0到3.0为III型巨星低于1.0为I型超巨星。不过直接按数值映射会产生一个问题——边界附近的标签噪声。一颗有效温度6010K的恒星和一颗5990K的恒星物理上几乎一样却被分到了F和G两个不同类别。这种边界抖动会造成训练样本的标签噪声影响模型收敛。我们做了个小优化读取LAMOST官方已经给出的光谱型子类比如G2、K0这样的精细分类再根据有效温度和logg做一次交叉校验只有两者一致时才保留原始标签不一致就标记为不确定样本不参与训练。这个策略虽然损失了一部分样本量但换来的是训练标签质量的显著提升。在类别体系上我们设计了两个预测层次。第一层只预测主谱型OBAFGKM七类这是最粗也最稳定的分类准确率最高。第二层预测主谱型加光度级比如F5V、G8III这样的细分类类别数量扩展到42类但部分类别的样本量很小需要靠类别加权和数据补充来稳住。实际使用中第一层适合快速筛选全样本第二层适合做精细的科学样本选择。2.5 类别不均衡怎么处理LAMOST是巡天数据真实天空里G星、K星数量多O星、B星稀少。如果直接拿原始分布训练模型会学出一个偏向多数类的分类器——所有输入都会被分成G型或K型整体准确率还很高但少数类的召回率低到没法看。这个小把戏骗不了任何人但确实会骗过那些只看准确率的初学者。解决不均衡我们用了三管齐下的策略。第一个是类别重采样在构造训练集时对少数类做重复采样对多数类做随机下采样把有效样本数的比例压到可控范围。第二个是损失函数加权在交叉熵损失里按样本量倒数设置权重让少数类样本的错误贡献更大。第三个是数据增强对少数类光谱做小幅平移、加噪声、轻微缩放的增强把有限样本的利用率提上去。这里要特别提醒数据增强时不要改变光谱的物理特征。对光谱做随机平移时幅度不能超过一个波长像素因为整体平移等价于视向速度的微小变化这个物理上是合理的。但如果你顺手做了一次裁剪或者改变谱线宽度那就等于在篡改光谱型信息模型会被你引入的人工特征误导。你在增强时的物理合理性最终会反映在泛化能力上。3. 卷积神经网络应该如何设计结构、参数与训练策略3.1 为什么选一维卷积而不是二维卷积或Transformer很多第一次接触光谱分类的人会问光谱图不是可以画成二维图像吗为什么不用二维CNN或者直接上Vision Transformer理论上都能做但工程上不推荐。光谱本质上是一维信号它的特征空间是沿着波长轴展开的。一维卷积天然匹配这个结构卷积核只在波长方向滑动参数量小计算开销低训练收敛也快。如果你把光谱画成二维图增加的那一维只是颜色或灰度通道没有额外物理信息只会平白增加计算量。Transformer那套架构确实在光谱分类的学术论文里出现得越来越多但对于我们这个项目来说它需要一个更大的数据规模才能发挥优势。我们项目的训练样本大约几十万条这个量级下CNN已经能把特征学得很扎实而且训练时间短、调优成本低、推理速度极快一张显卡跑完全部测试集只需要几分钟。做星表项目不是发论文不需要在架构上追求新潮选一个能在给定算力下把效果推到最高、同时工程上最稳的方案才是正路。3.2 具体网络结构从输入到输出的完整链路我们的基线模型是一个7层的1D卷积网络整体结构遵循“卷积块-池化-卷积块-池化-全连接”的经典范式。输入是长度为5301的一维数组通道数为1。第一层是Conv1d输入通道1输出通道16卷积核大小7padding为3保证输出长度不变。这一层的感受野是7个波长像素约7埃足以捕捉单条强吸收线。激活函数用ReLU后面接一个步长为2的MaxPool1d把长度压缩到2650。第二层卷积输出通道32核大小5padding为2再接ReLU和池化到1325。第三层卷积输出通道64核大小5继续池化到662。第四层和第五层分别扩到128和256通道池化后长度降到165。这时候每个特征图的一个位置已经对应了大约32埃的光谱区间能够表征分子带和多重谱线的组合特征。第六层是全局平均池化把256个通道压成256维向量这一层的作用是防止过拟合同时让模型不再敏感于输入光谱的整体偏移。最后一层全连接把256维映射到类别数输出。这里面两个关键设计我要单独强调。第一我们使用了全局平均池化而不是把前面的特征图直接展平再接全连接。全局平均池化能大幅减少全连接层的参数量在这个样本量级下展平的参数量很容易过大导致模型记住训练集而不是学出可泛化的特征。第二每组卷积后面都加了BatchNorm1d。光谱数据的分布在不同批次间可能存在漂移BatchNorm能把每层的输入分布重新拉回零均值单位方差训练过程会稳定非常多。3.3 损失函数、优化器和学习率策略分类任务的标准选择是交叉熵损失这个不用多讲。在类别不均衡的场景下我们在交叉熵里引入类别权重。权重按w_c N_total / (C * N_c)计算其中N_total是总样本数C是类别数N_c是第c类的样本数。这个公式的本质是把每个类别的贡献拉平——样本少的类别每个样本得到更高的权重。优化器用的是AdamW初始学习率设为3e-4weight decay设为1e-4。AdamW比普通的Adam多了解耦的权重衰减正则化效果更干净不容易出现参数范数过大导致泛化变差的问题。学习率调度采用了CosineAnnealing周期设为30个epoch。这个调度策略的好处是前期学习率较大、快速收敛后期学习率平滑下降、精细微调比阶梯式下降更容易到达一个平滑的局部最优。训练时batch size设为256数据加载是异步的GPU利用率能稳定保持在90%以上。如果用CPU训练这个网络在几十万条光谱上会非常痛苦不推荐。一张RTX 3090级别的显卡一个epoch大概3到5分钟30个epoch半天内能跑完。如果只有老显卡可以下调batch size到64学习率跟着降到7.5e-5也能收敛只是需要多跑几个epoch。3.4 训练流程、评估指标和模型选择训练流程是经典的“训练-验证-早停”三件套。每个epoch结束后在验证集上计算准确率、F1分数和混淆矩阵。我们设置了一个检查点保存机制只要验证集F1分数比历史最好值高就覆盖保存模型权重。最终执行完所有epoch后再加载验证集表现最好的checkpoint去跑测试集而不是用最后一个epoch的权重。这个细节很多人会忽略但实际操作中最后一个epoch因为学习率已经压得很低模型权重往往比不过中间某个F1峰值时的权重。评估指标上整体的准确率肯定要看但不能只看总准确率。我们同时记录每个类别的精确率、召回率、F1分数形成一张完整的分类报告。星表项目尤其关心少数类的表现——O型星在整个数据里可能不到1%但如果漏掉一半后续做特殊天体筛选的研究者就会抱怨。模型选择还有一个经验如果训练过程中发现验证集F1一直卡在某个平台期不要急着加网络深度先检查标签质量再检查数据预处理。我们的项目里F1从0.90提升到0.95是网络结构优化的功劳但从0.95到0.96以上靠的是清洗掉一批标签噪声样本这个提升路径很少被写进论文里但工程上非常常见。4. 从模型到星表如何生成一份合格的光谱型星表4.1 星表的字段设计哪些列是必须的模型训练好之后最核心的工作是把预测结果输出成星表。输出星表的质量决定了这个项目到底是一个“自娱自乐的模型演示”还是一个能被同行直接使用的科学产品。我们最终输出的星表包含了以下核心列列名说明lamost_idLAMOST源编号关联官方数据ra / decJ2000坐标snr_blue / snr_red蓝端和红端信噪比spec_type_primary主序列谱型O/B/A/F/G/K/Mspec_type_full完整分类含光度级如F5Vprobability_top1top1预测的softmax概率probability_top2第二高概率用于标记类边界样本uncertain_flag是否落入类边界不确定区quality_flag质量标记A/B/C三级probability_top2这个列是很多星表都没有的但它在科学使用中非常关键。想象一颗真正处于G型和K型边界上的恒星模型输出G型概率0.45、K型概率0.40。如果只记录top1这颗星会被标记为G型看起来很确定但实际它的类别归属本身就模糊。把top2概率单独留出来研究者就可以自己设置筛选条件比如找出所有top2概率差小于0.1的样本作为潜在的特殊星候选体。4.2 置信度与质量标记的判定逻辑质量标记不能只看softmax概率。我们发现高概率并不一定对应高可靠度因为模型对某些类型的预测天然更自信。比如A型星有非常强的巴耳末吸收线特征突出模型经常给出0.97以上的高置信度但K型星的特征偏弱置信度普遍在0.85到0.92之间。如果只按概率统一划线可能会误伤K型星的有效样本。所以质量标记综合了三个因素top1概率、top1与top2的差值、以及输入光谱的信噪比。规则如下A级top1概率0.90top1-top20.20SNR15B级top1概率0.80top1-top20.10SNR8C级其余有预测结果的样本实测下来A级样本的误分类率就是几个百分点B级会高一些C级样本基本只能拿来当候选体不能直接做统计用途。对于C级样本我们额外增加了一个重新检查流程把这类光谱的光谱型改为“unreliable”而不是硬给一个标签。不强求覆盖所有样本反而让星表的质量更加可信。4.3 与SDSS/LAMOST官方星表的交叉验证模型输出的星表不能自说自话必须跟官方数据做交叉验证。我们把几万条跨Matching到的样本与SDSS的光谱分类以及LAMOST pipeline给出的光谱型直接做了对比。对比方式很直观计算预测光谱型的温度序列位置差异。比如预测是G2官方分类是G5差了两个子类在允许范围内预测是F0官方是K5这是灾难性错误需要重点分析。统计结果显示绝大多数差异出现在相邻子类之间跨超过两个子类的错误占比很低而且这些极端错误大多集中在低信噪比样本中说明模型并没有学到什么系统性的特征偏移。交叉验证还有一个重要用途是定位模型系统性偏向。我们统计了不同信噪比区间、不同颜色区间的预测准确率差异。发现蓝端信噪比低于10的样本中模型对B型和A型的分类会倾向于预测为A型。原因也很清楚低信噪比时巴耳末线的深度被噪声扰乱模型学到的“强线特征”可能被噪声淹没。针对这个问题我们在星表的质量说明里单独标注了低信噪比蓝端样本在B/A边界的不可靠性并建议使用者以光变或测光颜色作为辅助判断。4.4 星表发布格式与可视化辅助星表最终发布为FITS表格和CSV两种格式。FITS表格是天文社区的标准格式CSV则是给不熟悉FITS的编程用户准备的。CSV里注意不要写科学计数法因为很多数据处理库的CSV解析器对科学计数法支持不友好。坐标字段保留6位小数这个精度对应的角分辨率远远高于LAMOST的定位误差足够做交叉匹配了。我们同时生成了一张光谱型分布直方图和一张可信度-信噪比散点图方便快速了解星表的整体构成。分布直方图能一眼看出样本是否在G型、K型处出现峰值如果峰值异常尖锐要怀疑模型是不是对多数类产生了偏置。可信度-信噪比散点图则能反映质量体系是否合理正常情况下应该看到SNR越高、top1概率的集中度越高。5. 源码结构、复现步骤与二次开发建议5.1 源码目录结构总览项目源码不是单文件而是一套完整的工程。核心文件包括src/ ├── preprocess.py # FITS读取、重采样、归一化、坏谱剔除 ├── build_dataset.py # 训练集/验证集/测试集划分、类别重采样 ├── train.py # 模型训练、checkpoint保存、日志记录 ├── evaluate.py # 测试集评估、混淆矩阵、分类报告 ├── predict_catalog.py # 加载模型批量预测并输出星表 └── visualization.py # 生成训练曲线、混淆矩阵、光谱例图preprocess.py负责把原始FITS转成numpy的npy格式这一步单独拆出来做是有原因的。预处理和训练解耦后如果数据版本更新或者需要调整归一化规则只需要重跑preprocess不需要动训练代码。而且预处理是纯CPU任务可以和训练并行用多进程分片处理速度能快很多。build_dataset.py里有一个值得注意的设计它会把每个样本对应的lamost_id记录在文件名中而不是只存特征数组。这个做法的意义在于训练之后任何时候都可以回溯到原始FITS文件方便排查错误样本和做人工复核。很多人在做光谱分类时只存数据和标签丢掉源编号最后分析错误案例时想找回原始光谱还要重新匹配非常麻烦。5.2 运行流程从零到星表需要几步如果要在本地完整复现这个项目流程如下# 1. 安装依赖 pip install astropy numpy scikit-learn torch tqdm pandas # 2. 配置数据路径 # 修改config.yaml中的raw_data_dir和output_dir # 3. 预处理全部FITS光谱 python src/preprocess.py --config config.yaml # 4. 构建训练集、验证集、测试集 python src/build_dataset.py --config config.yaml # 5. 训练模型 python src/train.py --config config.yaml # 6. 在测试集上评估 python src/evaluate.py --checkpoint models/checkpoint_best.pt # 7. 对全量无标签光谱做预测生成星表 python src/predict_catalog.py --checkpoint models/checkpoint_best.pt每一步产出的中间结果都有明确的意义。第3步产出的是预处理的npy数组第4步产出的是三个数据集的npy文件路径列表第5步产出的是模型checkpoint和训练日志第6步产出的是测试集分类报告第7步产出的就是最终星表。整个流程从原始数据到星表如果算力充足、数据已经下载好一天之内可以全部跑完。预处理是最耗时的环节几万条光谱大约需要一两个小时训练大约半天预测几乎是几分钟的事。5.3 环境依赖与版本锁定这个项目的环境依赖不算复杂但有一个版本问题需要特别说明PyTorch的版本影响模型加载。不同大版本之间pickle序列化的模型文件并不能保证完全兼容。我们的checkpoint文件是基于PyTorch 2.x保存的如果用1.x版本加载大概率会报错。所以在README里明确写了推荐环境Python 3.9PyTorch 2.0torchvision没有依赖astropy 5.0。astropy的版本影响FITS读取的兼容性但影响不算大。真正需要注意的版本坑在numpy。如果你用的是numpy 2.x一些旧代码里的np.float写法会直接报错因为numpy 2.x移除了一批旧别名。我们的代码里所有地方都用了np.float32或np.float64这种明确类型这是从项目一开始就坚持的规范避免后期被版本迁移折磨。GPU版本的CUDA环境建议直接用PyTorch官方推荐的conda安装方式不要自己手动装CUDA工具包。省下的时间足够你多训练两轮模型。5.4 想把效果再往上提可以从哪里下手如果你照着这个项目跑完之后想把准确率进一步往上推我按投入产出比排序给出几个方向。第一个方向是标签质量兜底。去清理训练集中那些模棱两可的边界标签宁可烧掉一些样本也要让训练标签更干净。我们在实验中发现清洗10%的边界噪声样本效果比增加10%的训练数据还明显。第二个方向是模型结构上小步快跑可以试试在原来的卷积块里加上残差连接或者把全局平均池化替换成注意力池化这两个改动都会带来几个百分点的收益且工程改动量不大。第三个方向是数据侧的纵向扩展引入多波段联合预测把LAMOST的蓝端和红端光谱拆成双通道输入让模型同时看到两个波段的信息。这个改动能把B/A边界和K/M边界的误分率降下来不少。还有一个容易被忽视的点训练完成后用模型自己产出的高置信度预测结果去扩充训练集做一轮自训练。这在半监督学习中叫作伪标签法。对于像O型星这样的少数类先让模型预测出高置信度样本人工抽样确认后把它们加入训练集模型的类别均衡度会明显改善。这个方法在真实数据上能再榨出一截性能但一定要注意人工抽检的比例不能太低。我个人在实际操作中的体会是这个项目最有价值的产出不是那套模型权重而是完整的“数据-模型-星表”链路。后续如果有新的LAMOST数据发布你只需要重新拉数据、跑一遍预处理和预测就能得到更新版星表。这种可重复的自动化流程才是量产科研数据产品的正确姿势。做的时候耐心一点把每一步的质量控制做好后面所有下游分析都会轻松很多。本文还有配套的精品资源点击获取