大家好,我是阿泽。
这两年带毕设,选深度学习方向的人越来越多了。为啥?听着就高级——图像识别、目标检测、人脸识别,随便一个词扔出来,导师都得扶一下眼镜。
 
但也正因为“听着高级”,每年都有大量学弟卡在环境配置、数据集、模型训练上,最后要么换题,要么花钱救火。深度学习这东西,会的人觉得简单,不会的人连报错都看不懂。
 
今天我就把图像识别类毕设最常见的5个坑拆开揉碎讲清楚。无论你是做猫狗分类、农作物病害识别,还是口罩佩戴检测,这篇文章都能让你少走两个月弯路。
 
坑1:环境装了两天,TensorFlow和PyTorch死活装不上
 
症状:
 
- pip install tensorflow 报错一堆红色
- 装了CUDA,但TensorFlow说找不到GPU
- 好不容易装上,一跑程序直接崩,提示“内核已重启”
 
原因:
深度学习框架的版本依赖简直是噩梦——Python版本、CUDA版本、cuDNN版本、TensorFlow/PyTorch版本,任何一个对不上,全都跑不起来。
 
填坑步骤:
 
1. 不要自己瞎配,直接上Anaconda
Conda会自动帮你解决大部分依赖冲突:
conda create -n tf python=3.8
conda activate tf
conda install tensorflow-gpu=2.6   # 指定版本,conda会配好CUDA
 
或者PyTorch:
conda install pytorch torchvision cudatoolkit=11.3 -c pytorch
 
2. 先跑一段测试代码确认环境正常
import tensorflow as tf
print(tf.version)
print("GPU可用" if tf.config.list_physical_devices('GPU') else "CPU模式")
 
PyTorch版:
import torch
print(torch.version)
print("GPU可用" if torch.cuda.is_available() else "CPU模式")
 
3. 没GPU怎么办?
可以用Google Colab,免费GPU(虽然有时限),或者用CPU跑小模型(如简单的CNN,数据集别太大)。毕设重点在于流程完整,不一定非要GPU。
 
阿泽说:
我最怕学弟一上来就“我要用最新的TensorFlow 2.15”。别!选一个稳定版本(比如TF 2.6或2.10),教程多,坑少。毕设做完再追新。
 
坑2:数据集找到了,但格式看不懂,或者根本打不开
 
症状:
 
- 下载了一个公开数据集,解压出来全是.mat、.pkl,不知道咋读
- 图片文件有jpg、png,但文件名乱码,标签在哪?
- 数据集太大,内存直接爆掉
 
原因:
公开数据集的格式五花八门,初学者拿到手根本不知道从哪下手。
 
填坑步骤:
 
1. 先搞清楚数据集的结构
一般数据集会提供说明文档(readme.txt)。仔细看:
 
- 图片存放在哪个文件夹?
- 标签是存在csv里,还是在文件夹名里(如cat/001.jpg)?
- 如果是特殊格式,用对应库读取:
 
读.mat文件
 
from scipy.io import loadmat
data = loadmat('data.mat')
 
读.pkl文件
 
import pickle
with open('data.pkl', 'rb') as f:
data = pickle.load(f)
 
2. 用ImageDataGenerator或torchvision.datasets自动加载
如果图片按类别分文件夹存放,可以直接用:
 
TensorFlow
 
from tensorflow.keras.preprocessing.image import ImageDataGenerator
train_gen = ImageDataGenerator().flow_from_directory('train/', target_size=(224,224))
 
PyTorch
 
from torchvision import datasets, transforms
dataset = datasets.ImageFolder('train/', transform=transforms.ToTensor())
 
3. 内存不够?用生成器
不要一次性把所有图片读进内存,用上面说的flow_from_directory或自定义生成器,边训练边读。
 
坑3:模型跑起来了,但准确率一直在50%徘徊(等于瞎猜)
 
症状:
训练了好几个小时,loss降不下去,准确率始终在50%左右(如果是二分类)或者极低。
 
原因:
 
- 学习率设置不对(太大震荡,太小不收敛)
- 没有做数据归一化(像素值0-255直接喂进网络)
- 网络太浅,学不到特征
- 类别不平衡(比如猫1000张,狗10张)
 
填坑步骤:
 
1. 检查数据预处理
一定要归一化!将像素值缩放到[0,1]或[-1,1]:
 
TensorFlow
 
tf.keras.applications.resnet50.preprocess_input
 
手动归一化
 
images = images / 255.0
 
2. 用预训练模型(迁移学习)
别自己从头搭网络,直接用现成的VGG16、ResNet50,冻结前几层,只训练最后一层:
 
TensorFlow
 
base_model = tf.keras.applications.ResNet50(weights='imagenet', include_top=False)
base_model.trainable = False
model = tf.keras.Sequential([
base_model,
tf.keras.layers.GlobalAveragePooling2D(),
tf.keras.layers.Dense(2, activation='softmax')  # 二分类
])
 
3. 调整学习率
用回调函数动态调整:
tf.keras.callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=3)
4. 处理类别不平衡
 
- 在class_weight里给少数类更高的权重
- 或者用数据增强(翻转、旋转、缩放)扩充少数类
 
坑4:训练到一半,爆显存/内存,程序直接挂掉
 
症状:
 
- ResourceExhaustedError: OOM when allocating tensor
- 或者Jupyter Notebook直接卡死,内核断开
 
原因:
 
- batch_size太大,显存放不下
- 模型太大,参数太多
- 代码里创建了多个graph,内存泄漏
 
填坑步骤:
 
1. 减小batch_size
从32减到16,再减到8,直到能跑起来。
2. 使用更小的输入图片尺寸
比如224x224改成128x128,显存占用直接减半。
3. 清理无用变量
在PyTorch里,及时del变量,加上torch.cuda.empty_cache()
4. 用梯度累积(TensorFlow/PyTorch都支持)
模拟更大的batch_size,但不增加显存。
 
坑5:训练完了,保存模型,下次加载预测时结果完全不对
 
症状:
 
- 训练时准确率95%,保存模型后重新加载,预测一张训练集图片,结果错了
- 加载模型时报错“unable to load model”
 
原因:
 
- 保存和加载时的环境不一致(比如Keras版本不同)
- 预处理方式不同(训练时做了归一化,预测时忘了)
- 只保存了权重,没保存模型结构
 
填坑步骤:
 
1. 统一保存方式
TensorFlow推荐保存整个模型:
model.save('my_model.h5')  # 保存整个模型
model = tf.keras.models.load_model('my_model.h5')
2. 保存预处理参数
最好把预处理步骤也封装进模型(如Rescaling层),或者写一个预测函数,确保预处理一致。
3. 预测前加上model.eval()(PyTorch)
否则因为Dropout/BatchNorm行为不同,结果会变。
 
写在最后
 
深度学习的坑远不止这些,比如过拟合、数据集划分、评估指标选择……每一个都能让人熬几个通宵。
 
但说到底,大部分问题不是技术多难,而是没人告诉你坑在哪。如果你现在正在做深度学习方向的毕设,遇到了下面这些情况:
 
- 环境装不上,报错看不懂
- 模型训练不收敛,不知道从哪调
- 数据集不会处理
- 马上要交初稿了,模型还没跑通
 
私信我,发你项目的报错截图/代码片段,我帮你免费看一眼。
哪怕最后不是我带,至少让你知道下一步怎么走,不卡死。
 
—— 阿泽,前大厂算法工程师,现专治毕设疑难杂症。

更多推荐