交差墒
  • 4

    获得赞
  • 0

    发布的文章
  • 1

    答辩的项目

PyTorch下用DenseNet进行图像分类

Batch大小为40,循环次数为18次,损失函数优化完,最终完成评分为92.49。

最后更新 2020/03/25 19:47 阅读 116

遥感影像场景分类预测

最后更新 2020/03/25 19:47

阅读 116

PyTorch DenseNet

赛题分析

  • 本次赛题的数据量很大,所以单次训练的时间很长,尤其在增大图像尺寸后,需要很长的时间才能训练完。
  • 图像分辨率基本都为512*512,最开始在224尺寸用的之前分类的代码随便跑了10轮,得分85左右。确定代码能跑通后再进行大刀阔斧的修改。
  • 类别45个,整个类别没有太多的不均衡,不过还是有一些图像数量远远大于其他的种类,尤其还有一些人都分不清的类别,比如桥梁和立交桥,路边停车场和停车场。
  • 尝试过ResNet50,DenseNet201,SENet154,比赛的前半阶段一直用FastAI进行训练,成绩达到了92.5x。后面改用纯PyTorch。
  • 各个类别的数量还是有差距的,这里我用到了类别平衡的方法就是PyTorch的Weighted Random Sampler和Batch Sampler,其实这个思路也是从FastAI的代码中摘来的,实测是有效果提升的。
  • Focal Loss的效果不好,其实普通的交叉熵效果更好一些,所以这个题目Focal Loss会减分。ㅤ

核心思路

  • 本次解决方案的亮点,主要是在数据处理上,完全改为常规PyTorch读取方法,能够获取到全数据进行模型迭代。(具体代码,购买后可以查看)
  • 图片大小用了224和400,400的效果好些,图像分类,尽可能的提高图片大小是一个小经验。但也不是都通用,一般情况下是可行的。
  • FastAI代码时候用的ResNet50,效果很好,其他的模型反而不好。纯PyTorch采用的是DenseNet201。
  • 常规数据增强手段。
  • 先训练最后一层分类层,再解冻后训练整个网络。
  • 用到了余弦退火。
  • 数据均衡,用的是PyTorch的Weighted Random Sampler和Batch Sampler
class TrainDataset(Dataset):

ㅤㅤdef __init__(self, label_list, transform=None, target_transform=None, loader=default_loader):
ㅤㅤㅤㅤimgs = []
ㅤㅤㅤㅤlabels = []
ㅤㅤㅤㅤfor index, row in label_list.iterrows():
ㅤㅤㅤㅤㅤㅤimgs.append((row['img_path'], row['label']))
ㅤㅤㅤㅤㅤㅤlabels.append(row['label'])
ㅤㅤㅤㅤself.imgs = imgs
ㅤㅤㅤㅤself.labels = [idx for idx in labels]
ㅤㅤㅤㅤself.transform = transform
ㅤㅤㅤㅤself.target_transform = target_transform
ㅤㅤㅤㅤself.loader = loader

ㅤㅤdef __getitem__(self, index):
ㅤㅤㅤㅤfilename, label = self.imgs[index]
ㅤㅤㅤㅤimg = self.loader(filename)
ㅤㅤㅤㅤif self.transform is not None:
ㅤㅤㅤㅤㅤㅤimg = self.transform(img)
ㅤㅤㅤㅤreturn img, label

ㅤㅤdef __len__(self):
ㅤㅤㅤㅤreturn len(self.imgs)

ㅤㅤdef get_sampler_weight(self):
ㅤㅤㅤㅤlabels = self.labels
ㅤㅤㅤㅤ_, counts = np.unique(labels, return_counts=True)
ㅤㅤㅤㅤprint(counts)
ㅤㅤㅤㅤcounts = 1. / counts
ㅤㅤㅤㅤreturn torch.DoubleTensor(counts[labels])
ㅤㅤsampler_weight = train_dataset.get_sampler_weight()
train_sampler = BatchSampler(WeightedRandomSampler(sampler_weight, len(train_dataset)), bs, False)
train_loader = DataLoader(train_dataset, batch_size=1, pin_memory=True, num_workers=0,
ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤbatch_sampler=train_sampler)
  • 用的SGD。ㅤ

比赛经验总结

  • 多上Kaggle找类似代码学习。
  • 有问题上GitHub。
  • 前期浪费了不少时间,直到最后一周采用的纯PyTorch。
本文为作者在FlyAI平台发布的原创内容,采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,转载请附上原文出处链接和本声明。
本文链接地址:https://www.flyai.com/n/56412
立即参加 遥感影像场景分类预测
代码展示

PyTorch DenseNet

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

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

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

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

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