heshuting555

  • 59

    获得赞
  • 0

    发布的文章
  • 1

    答辩的项目

基于PyTorch工程利器解析遥感影像分类任务,小白必看!

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

最后更新 2020/03/25 23:02 阅读 1530

遥感影像场景分类预测

最后更新 2020/03/25 23:02

阅读 1530

PyTorch SENet

本赛题共有45个类别,涉及多分类问题。必定会存在样本不平衡问题。


核心思路

数据预处理:每个类别的样本个数不一样,故采用Imbalanced Dataset Sampler调整每个类别的权重最后使得整个样本群每个类别平衡。

以下是 Label Smoothing 的代码:

class ImbalancedDatasetSampler(torch.utils.data.sampler.Sampler):
ㅤdef __init__(self, dataset, indices=None, num_samples=None):
ㅤㅤㅤself.indices = list(range(len(dataset)))
ㅤㅤㅤㅤㅤif indices is None else indices
ㅤㅤㅤself.num_samples = len(self.indices)
ㅤㅤㅤㅤㅤif num_samples is None else num_samples

  # distribution of classes in the dataset
ㅤㅤㅤlabel_to_count = {}
ㅤㅤㅤfor idx in self.indices:
ㅤㅤㅤㅤㅤtry:
ㅤㅤㅤㅤㅤㅤㅤlabel = self._get_label(dataset, idx)
ㅤㅤㅤㅤㅤㅤㅤif label in label_to_count:
ㅤㅤㅤㅤㅤㅤㅤㅤlabel_to_count[label] += 1
ㅤㅤㅤㅤㅤㅤㅤelse:
ㅤㅤㅤㅤㅤㅤㅤㅤlabel_to_count[label] = 1
ㅤㅤㅤㅤㅤexcept:
ㅤㅤㅤㅤㅤㅤㅤpass

ㅤㅤㅤ# weight for each sample
ㅤㅤㅤweights = [1.0 / label_to_count[self._get_label(dataset, idx)]
ㅤㅤㅤㅤㅤㅤㅤㅤㅤfor idx in self.indices]
ㅤㅤㅤself.weights = torch.DoubleTensor(weights)

ㅤdef _get_label(self, dataset, idx):
ㅤㅤㅤdataset_type = type(dataset)
ㅤㅤㅤif dataset_type is torchvision.datasets.MNIST:
ㅤㅤㅤㅤㅤreturn dataset.train_labels[idx].item()
ㅤㅤㅤelif dataset_type is torchvision.datasets.ImageFolder:
ㅤㅤㅤㅤㅤreturn dataset.imgs[idx][1]
ㅤㅤㅤelse:
ㅤㅤㅤㅤㅤreturn np.argmax(dataset.labels[idx])

ㅤdef __iter__(self):
ㅤㅤㅤreturn (self.indices[i] for i in torch.multinomial(
ㅤㅤㅤㅤㅤself.weights, self.num_samples, replacement=True))

ㅤdef __len__(self):
ㅤㅤㅤreturn self.num_samples

数据增强:采用随机裁剪,随机旋转,随机翻转,随机擦除 

模型选择:senet154,够强大的Baseline

模型优化:

  • Loss:基于CrossEntropy进行Label Smooth操作
class CrossEntropyLabelSmooth(nn.Module):
ㅤdef __init__(self, num_classes, epsilon=0.1, use_gpu=True):
ㅤㅤㅤsuper(CrossEntropyLabelSmooth, self).__init__()
ㅤㅤㅤself.num_classes = num_classes
ㅤㅤㅤself.epsilon = epsilon
ㅤㅤㅤself.use_gpu = use_gpu
ㅤㅤㅤself.logsoftmax = nn.LogSoftmax(dim=1)

ㅤdef forward(self, inputs, targets):
ㅤㅤㅤlog_probs = self.logsoftmax(inputs)
ㅤㅤㅤtargets = torch.zeros(log_probs.size()).scatter_(1, targets.unsqueeze(1).data.cpu(), 1)
ㅤㅤㅤif self.use_gpu: targets = targets.cuda()
ㅤㅤㅤtargets = (1 - self.epsilon) * targets + self.epsilon / self.num_classes
ㅤㅤㅤloss = (- targets * log_probs).mean(0).sum()
ㅤㅤㅤreturn loss
  • Learning Rate:warm up

模型集成;没采用此方法,单模型单尺度测试得到的结果


比赛经验总结

  • 多看知乎上面的大佬分享,多动手多实践。多看论文,多关注一些最新的主流方法,其实通用的Trick就那么多,比如看到目标检测的Trick其实很多时候都可以用在分割或者识别上,很多任务都是共通的。 
  • 采用最强大Baseline进行网络训练才可以取得更高的分数。打比赛的时候先把Baseline设置好,再进行添砖加瓦,把一些骚操作用起来。 
  • Warm Up 能涨一个点,Label Smooth 能涨一个点, Imbalanced Dataset Sampler能涨一个点,随机擦除能涨一个点。对这些Trick要铭记于心,不管在什么任务上都可以用的。 Triplet Loss在图像分类上也有不容忽视的作用,因为时间关系没有加上,之后大家也可以试试。
本文为作者在FlyAI平台发布的原创内容,采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,转载请附上原文出处链接和本声明。
本文链接地址:https://www.flyai.com/n/51410
立即参加 遥感影像场景分类预测
代码展示

PyTorch SENet

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

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

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

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

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