### 比赛简介
共十类美食,总计5000张图片,包含中餐、西餐、甜点、粥类,每张图像中美食所占比例大于3/4,数据分布均衡,自由划分训练集和验证集比例,本方案采取9:1的比例进行划分,项目最终以识别准确率作为评价指标,本方案使用单模型,在ModelArts上测试集的acc为0.978
### 训练策略
1. 数据方面
- 数据集划分
- 采用9:1的比例将数据集划分为训练集和验证集,并将数据打乱(实际影响不大)
- 数据增强
- 采用简单的数据增强方案,包括图像的翻转,仿射变化及标准化
- 这里的size选用的是224(听说太小了)
```python
train_transformer_ImageNet=transforms.Compose([
transforms.Resize((size,size)),
transforms.RandomHorizontalFlip(),
transforms.RandomAffine(degrees=5, translate=(0.05, 0.05), scale=(0.95, 1.05)),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
```
2. 模型方面
- 模型的选择
- baseLine选用的是Resnet模型,本着一切从简的原则(其实就是懒),分别试了Resnet18,ResNet34,ResNet101,ResNet152,还是ResNet152的acc较高,所以预训练模型选用的是ResNet152
- 模型的训练策略方面
- 采用了标签平滑,个人感觉差别也不大
```python
def reduce_loss(loss, reduction='mean'):
return loss.mean() if reduction == 'mean' else loss.sum() if reduction == 'sum' else loss
def lin_comb(a, b, epsilon):
return epsilon * a + b * (1 - epsilon)
class LabelSmoothingCrossEntropy(nn.Module):
def __init__(self, epsilon: float = 0.1, reduction='mean'):
super().__init__()
self.epsilon, self.reduction = epsilon, reduction
def forward(self, output, target):
c = output.size()[-1]
log_preds = F.log_softmax(output, dim=-1)
loss = reduce_loss(-log_preds.sum(dim=-1), self.reduction)
nll = F.nll_loss(log_preds, target, reduction=self.reduction)
return lin_comb(loss / c, nll, self.epsilon)
```
- 学习率调整,使用ReduceLROnPlateau学习调度器,如果三个epoch准确率没有提升,则减少学习率
```python
exp_lr_scheduler = lr_scheduler.ReduceLROnPlateau(optimizer_ft,mode='max',patience=3,verbose=True)
```
### 模型性能
验证集上的acc为0.974,提交到ModelArts上为0.978
### 比赛总结
这次的比赛对我来说收获挺大的,有些东西真是在学校里边体会不到的,还得多实践,同时也认识到了不同地区的小伙伴,寒假快要结束了,又是新的学期啊,可能只有短短一个多月?我们都加油,祝大家始终保持心里有火,眼里有光的状态!


学习了
感谢分享~