项目归纳(用于自己回忆项目内容)
项目目的:
面向移动端设备拍摄的实景图像,解决实际场景中标注样本稀缺、人工标注成本高的问题。采用伪标签半监督学习方案,利用少量标注样本搭配大量无标注实景图像完成 11 类物体分类。使用 ResNet18 骨干网络完成算法验证,缓解小样本场景下模型过拟合、泛化能力不足的问题。
项目过程:
- 数据处理:图像统一缩放至 224×224;训练集使用随机增强,验证 / 无标签集关闭随机变换,规避数据泄露;
- 工程封装:手写 PyTorch 自定义 Dataset、DataLoader,同时兼容有标签、无标签两套数据源;固定全局随机种子保证实验可复现;
- 模型搭建:使用 ResNet18 骨干网络,加载 ImageNet 预训练权重完成迁移学习;
- 半监督训练:模型对无标签数据推理,设置高置信阈值筛选可信伪标签样本,迭代扩充训练集辅助训练;
- 训练流程:交叉熵损失,SGD 优化,保存最优验证精度模型,绘制 acc/loss 训练曲线;
- 工程排错:修复伪标签索引错乱、种子不生效、transform 混用带来的评估失真 bug。
项目经历(放在简历描述)
基于伪标签半监督学习的移动端实景物体分类模型 | 项目负责人
项目介绍:
针对移动端采集实景图像时人工标注代价高、标注样本不足的现实问题,构建伪标签半监督图像分类方案。依托少量标注样本结合大量无标注实景图像,实现 11 类实景物体分类。采用 ResNet18 骨干网络完成算法验证;从零搭建 PyTorch 深度学习流水线,完成图像预处理、自定义数据集封装、迁移学习建模、高置信伪标签筛选、训练验证可视化全流程开发,提升小样本场景下模型分类精度与鲁棒性。
技术栈:
Python、PyTorch、Torchvision、NumPy、PIL、Matplotlib
核心技术: 图像数据增强、图像标准化、自定义 Dataset、ResNet18 迁移学习、伪标签半监督学习、高置信样本过滤、全局随机种子固定、SGD、交叉熵损失、训练过程可视化
项目成果:
- 实现同时支持有标签、无标签样本的数据流水线,充分挖掘无标注图像价值,缓解标注样本不足的困境;
- 设置高置信度阈值筛选伪标签,过滤低置信噪声样本,避免错误标签污染模型参数;
- 基于 ResNet18 结合迁移学习,在小样本条件下取得较好识别效果,完成半监督算法有效性验证;
- 工程层面固定全链路随机种子,严格区分训练 / 验证预处理逻辑,保存最优模型并可视化训练指标,整套实验可复现。
项目亮点:
- 重视实验可复现性:设置全局随机种子,固定 numpy、python、pytorch、cuda、cudnn 全部随机源,消除增强、权重初始化、GPU 计算带来的随机波动;
- 伪标签做高置信过滤,不盲目使用全部无标签样本,宁可少选不引入噪声,解决半监督学习里噪声标签损害模型的经典问题;
- 预处理逻辑严格隔离:训练集开启随机增强,验证集、无标签集只做固定变换,不引入随机扰动,防止数据泄露,保证评估指标真实可信;
- 使用残差网络 ResNet18,依靠残差结构缓解深度网络梯度消失问题,配合迁移学习,小样本任务收敛效果稳定。
复试口述
老师你好,我的项目是基于伪标签半监督学习的移动端实景物体分类,主要解决移动端采集图像时标注样本少、人工标注成本高的问题。 传统全监督图像分类很依赖大量标注数据,但移动端实景图像标注成本很高,所以我采用监督 + 伪标签半监督的训练范式,同时使用少量标注样本和大量无标注图像共同训练。
数据层面,我手写自定义 Dataset,分别封装训练、验证、无标签数据集,图像统一调整到 224×224。训练集使用随机裁剪、随机旋转做数据增强,提升模型鲁棒性;验证集和无标签数据关闭所有随机变换,保证评估客观。同时配置全局随机种子,保证实验能够复现。
半监督是本项目核心:每轮训练之后,用当前模型对无标签图像做推理,把 softmax 之后概率高于设定阈值的样本筛选出来,生成伪标签并入训练集,迭代辅助模型训练,充分利用无标注数据。
模型上选用 ResNet18,利用残差块结构缓解深度网络梯度消失;加载 ImageNet 预训练权重做迁移学习,借助预训练学到的通用视觉特征加快收敛,提升小样本下的识别效果。
训练上使用交叉熵损失、SGD 优化器,保存验证集精度最高的模型,绘制 loss 和准确率曲线,完成从数据处理、建模、半监督迭代到结果分析的完整深度学习流程。通过这个项目,我不仅掌握图像分类、迁移学习、伪标签半监督的原理,也建立起深度学习实验工程的规范意识。
面试问答
技术栈问答
Q:项目里各个库分别做什么?A:Python 作为基础开发语言;PIL 负责图像读取、尺寸变换;NumPy 做图像数组运算;Torchvision 提供图像 transform、ResNet18 预训练模型;PyTorch 负责自定义 Dataset、搭建网络、训练循环、反向传播、模型保存;Matplotlib 用来绘制损失、准确率变化曲线。
Q:Torchvision 的 transform 你是怎么区分训练和验证集的?为什么要这么做?A:训练集加入随机裁剪、随机旋转等随机增强;验证集、无标签数据集只用 Resize、Normalize,不使用任何随机操作。 训练集随机增强用来模拟真实场景的视角、光照变化,扩充虚拟样本,对抗过拟合;验证集不能带随机变换,否则每次输入图像不一样,指标会波动失真,无法客观衡量模型真实性能。
项目基础问答
Q:简单介绍你的项目。A:这是面向移动端实景图像的半监督物体分类任务。移动端拍摄的实景图像标注成本高、标注样本有限,我使用少量标注样本,搭配大量无标注图像,用伪标签的方式扩充训练数据;选用 ResNet18 残差网络,结合数据增强、迁移学习、高置信伪标签过滤,完成 11 类实景物体分类,解决小样本容易过拟合、泛化差的问题。
Q:为什么选用半监督,直接只用标注样本不行么?A:只用少量标注样本做全监督训练,模型很容易记住训练图像的细节,发生过拟合,在测试图像上效果差。移动端场景下大量无标注图片很容易获取,半监督可以挖掘无标注数据的信息,提升模型泛化能力,更贴近真实业务场景。
Q:数据集是什么情况?A:数据集分为三部分:少量人工标注训练集、独立标注验证集,还有大量没有标签的移动端实景图像;一共 11 类物体,图像存在光照、角度、拍摄设备带来的差异,对模型鲁棒性有一定要求。
Q:项目的主要难点是什么?A:第一是标注样本少,小样本训练极易过拟合;第二是伪标签自带噪声,如果直接全部使用无标签数据,错误标签会误导模型;第三是图像增强、GPU 计算存在随机性,如果不控制,实验结果不可复现。
数据与工程相关
Q:为什么要固定全局随机种子?哪些地方会产生随机性?A:为了保证实验可复现。随机性来源包括:数据集 shuffle、随机图像增强、网络权重初始化、CUDA 卷积运算。只固定一个种子不够,需要同时固定 python、numpy、pytorch、cuda,并且开启 cudnn 确定性模式,保证每次运行实验结果一致。
Q:数据集划分和 dataloader 的 shuffle 怎么设置?A:训练集 shuffle=True,打乱样本顺序,避免模型学到样本顺序带来的偏见;验证集、无标签数据集 shuffle=False,保证样本索引固定,伪标签能够和图像一一对应,评估结果稳定可复现。
Q:图像标准化 Normalize 的均值方差是哪里来的,会不会出现数据泄露?A:使用 ImageNet 数据集统计得到的均值和方差,迁移学习场景直接使用预训练模型配套的统计参数,不需要自己从本项目训练集统计,不存在泄露;如果是从零训练 CNN,统计量只能在训练集计算,验证、测试集直接复用。
Q:数据增强一定越多越好吗?A:不是。增强需要贴合真实业务场景,如果增强出来的图像和真实样本分布差距过大,相当于引入噪声,反而会降低精度。本项目只选用旋转、裁剪这类符合真实拍摄情况的增强。
模型、迁移学习
Q:讲一下 ResNet18 迁移学习你是怎么做的?A:加载 ImageNet 预训练的 ResNet18 权重,替换最后的全连接分类头,修改输出维度为 11,对应物体类别数。我采用微调的训练方式,利用预训练学到的底层纹理、边缘等通用视觉特征,再适配本项目的分类任务,小样本场景下效果远好于从零训练。
Q:ResNet 残差块的核心思想是什么,解决了什么问题?A:引入短路连接,把输入直接加到卷积层的输出上。解决深度网络训练时的梯度消失问题,让深层网络可以收敛,能够训练更深的网络。
Q:迁移学习为什么效果好?预训练学到了什么?A:在大规模 ImageNet 数据集上预训练,网络浅层学到边缘、纹理、颜色,中层学到局部形状,高层学到物体部件等通用视觉模式。迁移到本任务,不需要从零学习基础图像特征,只需要适配本项目的类别,小样本场景收敛更快、泛化更强。
Q:为什么用交叉熵损失,适合什么场景?A:交叉熵损失用于多分类任务,对分类概率分布做约束;配合 softmax,衡量预测类别分布和真实标签之间的差距,梯度计算稳定,适合图像分类任务。
Q:model.train ()、model.eval ()、torch.no_grad () 分别作用,伪标签推理阶段怎么设置?A:model.train () 训练模式,启用 dropout、bn 训练逻辑,开启梯度;model.eval () 评估模式,bn、dropout 切换为推理模式;torch.no_grad () 关闭计算图,不保存梯度,节省显存。 伪标签推理的时候,需要同时使用 model.eval () 加上 torch.no_grad (),不更新参数,只做预测。
Q:怎么保存最优模型?A:每个 epoch 结束在验证集上计算分类准确率,只保存验证准确率最高的权重,不直接保存最后一轮 epoch 的模型,避免保存过拟合的权重。
半监督伪标签(核心高频)
Q:什么是伪标签,你的伪标签实现思路?A:伪标签就是模型对无标签图像推理得到的预测类别。将无标签图片送入模型,输出 logits 经过 softmax 得到每一类概率;设置置信阈值,只有最大类别概率大于阈值,才把该类别作为伪标签,把这部分样本加入训练集参与后续迭代训练。
Q:为什么要设置置信阈值?阈值设置太高或者太低会怎么样?A:伪标签会存在错误预测,也就是噪声标签。阈值太低,大量置信度低的错误样本被加入训练,噪声会污染模型,精度下降;阈值太高,筛选出来的样本数量很少,半监督带来的增益就会很小。本项目经过对比实验选择合适阈值,做到样本数量和样本质量之间权衡。
Q:伪标签迭代训练,会不会出现模型越训越差,模型把错误伪标签不断强化的情况?怎么缓解?A:会存在这个风险,也就是噪声累积。我主要用几个手段缓解:第一高置信过滤,尽量少引入错误标签;第二每一轮重新对无标签集推理生成伪标签,不使用上一轮的旧伪标签;第三依然保留原始标注样本参与每一轮训练,保证真实标签的监督信号始终存在。
Q:伪标签和自监督学习有什么简单区别?A:伪标签属于半监督,依赖模型输出的预测类别作为监督信号,需要一部分标注样本初始化模型;自监督不需要标签,通过构造图像本身的代理任务,比如图像旋转、拼图,让网络自己学习特征,不需要外部标签。
拔高、项目反思
Q:本项目中如何对抗过拟合?A:1)数据增强,虚拟扩充训练样本;2)迁移学习,利用大规模预训练特征;3)伪标签只选用高置信样本,减少噪声干扰;4)保存验证集最优模型,避免过拟合权重。
Q:这个项目还有哪些改进方向?A:1)可以尝试更强的半监督算法,比如 FixMatch,强增强 + 弱增强的一致性约束; 2)引入早停策略,验证集精度长期不提升就终止训练,防止过拟合; 3)后续可以替换 MobileNet 系列轻量网络,为实际移动端部署做准备; 4)做 K 折交叉验证,让实验评估结果更加可靠。
Q:做完这个项目你的收获?A:一方面掌握图像分类、残差网络、迁移学习、伪标签半监督的原理与代码实现;另一方面意识到深度学习实验工程规范的重要性,比如控制随机性、区分训练评估预处理、处理标签噪声,这些对得到可信实验结果至关重要。
面试小提示:面试官问 “为什么叫移动端实景图像”,你就回答:数据集图片来源于手机拍摄,是手机采集来的图像,实验先用 ResNet18 完成算法验证,后续可更换轻量网络做部署,不说自己已经部署完成。