11 类食物分类项目:迁移学习与半监督学习解析
结合你的11类食物图像分类项目 (PyTorch + 迁移学习/VGG + 半监督学习 + 自定义CNN),我整理了考研复试面试高频提问,全部贴合你的代码,答案简洁专业、直接背诵即可!
一、项目整体介绍(必问,开场题)
问题1:请简单介绍一下你的这个项目?
回答:
本项目是基于PyTorch框架实现的11类食物图像分类任务,核心目标是实现食物图片的自动识别分类。
项目采用迁移学习 (VGG预训练模型微调)替代传统从零训练,同时结合半监督学习(伪标签) 利用无标签数据提升模型精度;
整体流程包括数据集读取、数据增广、模型构建、训练验证、最优模型保存,最终完成小样本下的高精度食物分类。
二、数据集与数据处理(基础必问)
问题2:你的数据集是怎样的?如何划分的?
回答:
数据集是food-11食物分类数据集,共11个类别;
我将其划分为三部分:有标签训练集、验证集、无标签训练集;
有标签数据用于模型监督训练,验证集用于评估模型泛化能力,无标签数据用于半监督学习扩充训练样本。
问题3:项目中做了哪些数据预处理/数据增广?为什么?
回答:
-
统一将图片resize为
224×224,适配VGG模型输入; -
训练集使用随机裁剪、随机旋转的数据增广,验证集不做增广;
-
目的:扩充数据多样性,防止模型过拟合,提升泛化能力。
问题4:为什么用Dataset和DataLoader?
回答:
-
Dataset:自定义数据集类,负责读取图片、加载标签、数据变换,封装数据读取逻辑; -
DataLoader:将数据集打包成批次(batch_size=16),支持打乱数据、批量加载,满足模型批量训练的需求,提高训练效率。
三、模型与迁移学习(核心高频,重中之重)
问题5:你为什么用VGG模型,而不是自己写的CNN?
回答:
-
自定义CNN是从零训练,需要大量数据,且特征提取能力弱;
-
VGG是预训练模型 ,在ImageNet数据集上学到了通用视觉特征(边缘、纹理、形状),采用迁移学习微调,仅用少量数据就能达到更高精度;
-
我修改了VGG的输出层为11分类,适配我的食物分类任务。
问题6:什么是迁移学习?在项目中怎么用的?
回答:
迁移学习是复用预训练模型的通用特征,迁移到自己的小样本任务中,无需从零训练。
在项目中:加载VGG预训练权重,保留其特征提取层,仅微调最后几层全连接层,用我的食物数据训练,让模型适配11类食物分类。
问题7:什么是微调(Fine-tune)?
回答:
微调是迁移学习的核心操作:冻结预训练模型的底层特征提取层,仅训练顶层的分类层,小幅度更新模型参数,让通用特征适配自己的任务,训练更快、精度更高。
问题8:介绍一下你自定义的CNN模型结构?
回答:
自定义模型由卷积块+全连接层组成:
-
基础卷积模块:卷积+BN归一化+ReLU激活+最大池化;
-
3个堆叠的卷积层块(layer1-layer3),逐步提升通道数、压缩特征图尺寸;
-
最后通过池化、展平、两层全连接层,输出11分类结果。
四、半监督学习(项目亮点,加分题)
问题9:项目中为什么用半监督学习?怎么做的?
回答:
因为项目有大量无标签食物图片,半监督学习可以利用这些数据提升精度。
实现方式:伪标签法,当模型验证精度超过60%时,用模型对无标签数据预测,选取置信度大于0.99的结果作为伪标签,加入训练集补充训练。
问题10:伪标签的阈值为什么设为0.99?
回答:
只有模型高度置信(99%确定) 的预测结果,才会作为伪标签使用,避免错误标签污染模型,保证半监督训练的有效性。
五、训练过程与核心函数(代码细节)
问题11:训练的前向传播和反向传播流程是什么?
回答:
-
前向传播:图片输入模型,逐层计算得到11分类预测值;
-
计算损失:用交叉熵损失对比预测值和真实标签;
-
反向传播:根据损失计算梯度;
-
优化器更新参数,清零梯度,完成一轮训练。
问题12:为什么用CrossEntropyLoss交叉熵损失?
回答:
交叉熵损失是分类任务专用损失函数,可以有效衡量模型预测概率分布和真实标签的差异,适合多分类任务(11分类)。
问题13:为什么用AdamW优化器?
回答:
AdamW是Adam的改进版,收敛速度快、精度高,自带权重衰减防止过拟合,是图像分类任务的首选优化器。
问题14:model.train()和model.eval()的区别?
回答:
-
model.train():开启训练模式,启用BN、Dropout,计算梯度,更新参数; -
model.eval():开启验证模式,冻结参数,关闭BN/Dropout,只预测不学习,保证评估结果准确。
问题15:torch.no_grad()作用是什么?
回答:
验证时关闭梯度计算,节省显存、加快推理速度,验证阶段不需要更新梯度,必须加。
问题16:为什么要梯度清零zero_grad()?
回答:
PyTorch梯度会默认累积,不清零会导致梯度计算错误,模型无法正常训练,每次更新参数后必须清零。
问题17:模型输出是小数,怎么计算准确率?
回答:
模型输出11个预测分数,用np.argmax()取分数最大值的索引作为预测类别,和真实整数标签对比,统计正确的数量,计算准确率。
六、项目难点、解决方法与收获(压轴题)
问题18:项目中遇到的难点是什么?怎么解决的?
回答:
- 难点1:训练数据量小,自定义模型精度低
解决:采用VGG迁移学习,复用预训练特征,小样本也能高精度训练;
- 难点2:无标签数据无法利用
解决:采用半监督伪标签学习,扩充训练样本;
- 难点3:模型过拟合
解决:加入数据增广、BN归一化、权重衰减优化。
问题19:通过这个项目你学到了什么?
回答:
-
掌握了PyTorch搭建图像分类项目的完整流程;
-
理解了卷积神经网络、迁移学习、半监督学习的核心原理;
-
学会了数据处理、模型微调、训练优化的工程实践技巧;
-
提升了深度学习问题分析和解决问题的能力。
复试面试小技巧
-
重点背:迁移学习、半监督学习、模型训练流程(老师最爱问);
-
回答时结合你的项目(11类食物分类、VGG、伪标签),不要空泛;
-
代码细节不用死记,说核心逻辑即可。
(注:文档部分内容可能由 AI 生成)