小林子

  • 36

    获得赞
  • 1

    发布的文章
  • 2

    答辩的项目

比赛答辩:水下鱼物种分类(详情参数设置)

Batch大小为64,循环次数为30次,损失函数优化完,最终完成评分为99.89。

水下鱼类物种识别(FlyAI2.0 竞赛框架)
PyTorch ResNet DenseNet EfficientNet
最后更新 2020/05/06 11:35 阅读 265

水下鱼类物种识别(FlyAI2.0 竞赛框架)

最后更新 2020/05/06 11:35

阅读 265

PyTorch ResNet DenseNet EfficientNet

最近由于时间所以没有太多时间调参,所以解决问题比较暴力,个人觉得自己的思路不是很值得学习。侥幸取得了第四,但是我发现很多人也都到了99.86的分数,我也看了学习圈鹏大佬对本题的思路,当中确实有很多值得学习的地方,感觉比较专业的样子(有机会去加个好友,学习一下),本次也多分享点自己写的代码,比较差劲各位见谅。

个人思路(评估指标acc,所以没有太多关注样本均衡的问题,这可能也是到不了99.91的原因?)

观察数据(数据增强) >>  模型选择(resnet,densenet,efficientnet) >> TTA预测

下面分享一下怎么做以上三个操作的:

1. 数据增强(如下所示,优于数据本身有增强过的痕迹,所以数据增强很简单)

def get_trans(size=224):
   mean, std = [0.485, 0.456, 0.406], [0.229, 0.224, 0.225]
   return \
       {
           'train': torch_transforms.Compose([
               torch_transforms.Resize((size,size)),
               torch_transforms.RandomHorizontalFlip(),
               # transforms.RandomVerticalFlip(),
               torch_transforms.RandomAffine(degrees=5, translate=(0.05, 0.05), scale=(0.95, 1.05)),
               torch_transforms.ToTensor(),
               torch_transforms.Normalize(mean, std),
           ]),
           'val': torch_transforms.Compose([
               torch_transforms.Resize((size,size)),
               torch_transforms.ToTensor(),
               torch_transforms.Normalize(mean, std)
           ]),
       }

2. 模型选择

处于习惯原因,也是个人原因,骨干网络也不是很注意特别新的网络架构就是最基础的resetnet,densenet和比较新的efficientNet。在选择上,图片像素比较低,所以就直接采用resnet34,densenet121,efficientnet-b0;

代码如下,放到list是因为最后取个平均而已

# -*- coding: utf-8 -*
import torchvision.models as models
import torch.nn as nn
from config import cfg
from cbam_resnet import resnet34_cbam
from efficientnet_pytorch import EfficientNet
import torch
def get_model(model_name):
   model_list = []
   for name in model_name:
       if name == 'resnet34':
           cnn = models.resnet34(pretrained=True)
           cnn.avgpool = nn.AdaptiveAvgPool2d(1)
           cnn.fc = nn.Sequential(
               nn.Dropout(0.2),
               nn.Linear(512, cfg.num_class)
           )
           model_list.append(cnn)
       if name == 'resnet34_cbam':
           cnn = resnet34_cbam(pretrained=True)
           cnn.avgpool = nn.AdaptiveAvgPool2d(1)
           cnn.fc = nn.Sequential(
               nn.Dropout(0.2),
               nn.Linear(512, cfg.num_class)
           )
           model_list.append(cnn)
       elif name=='densenet121':
           cnn = models.densenet121(pretrained=True)
           cnn.classifier = nn.Sequential(
               nn.Dropout(0.2),
               nn.Linear(1024, cfg.num_class)
           )
           model_list.append(cnn)
       elif name=='resnet50':
           cnn = models.resnet50(pretrained=True)
           cnn.avgpool = nn.AdaptiveAvgPool2d(1)
           cnn.fc = nn.Sequential(
               nn.Dropout(0.2),
               nn.Linear(2048, cfg.num_class)
           )
           model_list.append(cnn)
       elif name == 'efficientnet-b0':
           cnn = EfficientNet.from_pretrained('efficientnet-b0', num_classes=cfg.num_class)
           model_list.append(cnn)
   return model_list

3. TTA预测

直接使用数据增强里面的train就可以了,取五张求个平均。

小结:

  • 做到这里我就取得了99.86,然后没有提升了,很明显自己也没有分析啥问题,所以就没怎么当回事了。其实自己所作的结果平均和TTA本质都是一件事情,尽可能降低预测结果的方差,但是非常耗时(训练5h左右,推理其实还是比较快的)。
  • 提升到了99.89的技术就是,偶然想起我看到过之前天池的一个trick将数据的99.99%用来训练,可以涨分?我抱着试一试的态度然后重新提交了一次,发现到了99.89,然后提交了几次,发现分数稳定在了99.89和99.86。。然后我就没管了

关于optimizer、lr、 lr_scheduler、loss_func,再贴代码

loss_fn = nn.CrossEntropyLoss()
optimizer = optim.Adam(cnn.parameters(), lr=cfg.lr, weight_decay=1e-4)
optimizer = optim.SGD(cnn.parameters(), lr=cfg.lr, momentum=0.9, nesterov=True)
scheduler = optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='max', patience=3, verbose=True)
config的设置贴一下
 
class Config:
   def __init__(self):
       self.lr = 3e-4
       self.img_size = 224
       self.bs = 64
       self.epochs = 25
       self.num_class = 21
       self.model_names = ['resnet34','densenet121','efficientnet-b0']

我不知道是不是有很多人和我一样,认为这些lr,bs,epochs,img_size,weight_decay,nesterov,lr_scheduler参数可能对分数有很大的影响,你要问我如何设置,我也是一个小白还没有丰富的经验所以,我就是用的大家都用的。

(但就是忍不住,我总想调一个试试,然后内心想万一有提升呢?)

本文为作者在FlyAI平台发布的原创内容,采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,转载请附上原文出处链接和本声明。
本文链接地址:https://www.flyai.com/n/131910
立即参加 水下鱼类物种识别(FlyAI2.0 竞赛框架)
代码展示

PyTorch ResNet DenseNet EfficientNet

选择查看文件
$vue{codeKeys}
  • $vue{ix}
赞赏贡献者还可以查看和下载优质代码内容哦!
赞赏 ¥29.59元
©以上内容仅用于在FlyAI平台交流学习,禁止转载、商用;违者将依法追究法律责任。
讨论
500字
表情
每日参与讨论奖励 20FAI
发送
每日参与讨论奖励 20FAI
删除确认
是否删除该条评论?
取消 删除
感谢您的关注
该篇内容公开后我们将会给你推送公开通知
好的
发布成功!
您的公开申请已发送至后台审核,
通过后将公开展示本详情页!
知道了
向贡献者赞赏
¥29.59
微信支付
支付宝

请先绑定您的微信账号 点击立即绑定

立即支付
温馨提示:
支付成功后不支持申请退款,请理性消费;
支付成功将自动解锁当前页面代码内容,付款前请确认账号信息。
微信扫码支付
请前往Web网页进行支付

敬请谅解,如有疑问请联系FlyAI客服

知道了
举报
请选择举报理由
确定
提示
确定要删除?
取消删除