共计 1835 个字符,预计需要花费 5 分钟才能阅读完成。
背景介绍
102 花朵数据集(Oxford-102 Flowers)是一个经典的细粒度分类数据集,包含 102 种英国常见花卉的图片,每类至少有 40 张图像。该数据集的主要挑战在于:

- 类别不均衡 :部分类别样本量差异显著
- 细粒度分类 :不同品种间视觉差异微小(如不同颜色的玫瑰)
- 背景干扰 :花朵在自然场景中的构图多变
技术选型对比
- 基础 CNN:参数量小但特征提取能力有限,验证集准确率约 65%
- ResNet18:残差连接缓解梯度消失,验证集准确率可达 82%
- EfficientNet:计算效率高但需要更多调参,验证集准确率约 85%
实际测试表明,ResNet34 在准确率(86%)和训练速度之间取得了较好平衡,适合作为基线模型。
核心实现流程
数据预处理
关键步骤包括:
- 统一缩放到 256×256 像素
- 随机裁剪 224×224 训练区域
- 颜色抖动增强(亮度 / 对比度 / 饱和度)
- 标准化处理(ImageNet 均值方差)
train_transform = transforms.Compose([transforms.Resize(256),
transforms.RandomCrop(224),
transforms.RandomHorizontalFlip(),
transforms.ColorJitter(0.4, 0.4, 0.4),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225])
])
迁移学习实现
冻结底层卷积层,仅微调全连接层:
model = models.resnet34(pretrained=True)
for param in model.parameters():
param.requires_grad = False
model.fc = nn.Sequential(nn.Linear(512, 256),
nn.ReLU(),
nn.Dropout(0.5),
nn.Linear(256, 102)
)
类别权重处理
使用逆类别频率平衡损失函数:
class_counts = [...] # 每个类别的样本数
weights = 1. / torch.tensor(class_counts, dtype=torch.float)
weights = weights / weights.sum()
criterion = nn.CrossEntropyLoss(weight=weights)
模型评估方法
- Top- 1 准确率 :常规分类指标
- 混淆矩阵 :识别易混淆类别对
- Class-wise 召回率 :检查小样本类别表现
可视化示例:
from sklearn.metrics import confusion_matrix
import seaborn as sns
cm = confusion_matrix(true_labels, preds)
sns.heatmap(cm, annot=True, fmt='d')
生产环境建议
- 内存优化 :
- 使用混合精度训练(AMP)
-
启用 CUDA Graph 减少内核启动开销
-
部署一致性 :
- 固化预处理参数(均值 / 方差值)
-
使用 ONNX 统一推理管线
-
持续学习 :
- 添加新类别时冻结特征提取器
- 采用 Elastic Weight Consolidation 防止遗忘
完整代码结构
# 数据加载
class FlowerDataset(Dataset):
def __init__(self, ..., transform=None):
# 实现读取逻辑
# 模型定义
class FlowerModel(nn.Module):
def __init__(self):
super().__init__()
# 网络层定义
# 训练循环
def train_epoch(model, loader, optimizer, criterion):
# 包含梯度裁剪和 LR 调度
# 评估函数
def evaluate(model, loader):
# 计算指标和混淆矩阵
避坑指南
- 数据泄漏 :确保增强操作不跨训练 / 验证集共享随机种子
- 梯度爆炸 :添加
nn.utils.clip_grad_norm_(model.parameters(), 1.0) - 过拟合 :早停策略(patience=5)比单纯依赖验证集更可靠
延伸思考
当遇到某些类别只有 20-30 张样本时,可以考虑:
– 使用基于原型的少样本学习方法(Prototypical Networks)
– 引入自监督预训练(SimCLR)增强特征提取
– 通过 GAN 生成更多该类别样本
欢迎在评论区分享你对小样本花朵分类的解决方案!
正文完
发表至: 未分类
近三天内
