水下鱼类物种识别(FlyAI2.0 竞赛框架)
最后更新 2020/05/06 11:35
阅读 4044
PyTorch ResNet DenseNet EfficientNet
小林子
55
获得赞1
发布的文章4
答辩的项目Batch大小为64,循环次数为30次,通过在线上环境完成训练,模型最优精度评分为99.89。
最后更新 2020/05/06 11:35
阅读 4044
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就可以了,取五张求个平均。
小结:
关于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参数可能对分数有很大的影响,你要问我如何设置,我也是一个小白还没有丰富的经验所以,我就是用的大家都用的。
(但就是忍不住,我总想调一个试试,然后内心想万一有提升呢?)
PyTorch ResNet DenseNet EfficientNet
请先绑定您的微信账号 点击立即绑定
敬请谅解,如有疑问请联系FlyAI客服