FastAI可解释性差
  • 5

    获得赞
  • 0

    发布的文章
  • 1

    答辩的项目

你画我猜赛题不可错过的"炼丹"技巧,迅速带你涨分!!

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

你画我猜
PyTorch ResNet SENet
最后更新 2020/03/25 22:34 阅读 322

你画我猜

最后更新 2020/03/25 22:34

阅读 322

PyTorch ResNet SENet

image.png

为了增强人工智能的趣味性,我们开展了你画我猜这一竞赛。你画我猜数据集中包括了40种生活中常见的类别如飞机、苹果、篮球等。图片信息以json格式存储,在每个json中记录了用户每一笔简笔画对应的横坐标集合和纵坐标集合。其中训练集、验证集和测试集划分比例为6:2:2.

以下为给的json示例:

{"drawing": [[[18, 21, 15, 17, 23], [255, 185, 106, 97, 89]], [[17, 7, 3, 0, 9, 19, 29, 40, 41, 30, 28], [70, 60, 50, 26, 4, 0, 12, 39, 49, 75, 88]], [[28, 25, 22, 13, 11, 14, 15, 7, 11], [63, 10, 67, 53, 30, 17, 28, 63, 58]]]}

可以看到数据给的格式是用户绘画是的点的顺序。由于本人对nlp不是很熟悉,因此将此问题转化为图像分类问题。具体就是将这些点在(256, 256, 3)大小的图像上面显示。可视化结果如下:

image.png

数据预处理

  • 将给的json数据格式转化为图片格式,然后以图片分类的思路进行分类。

数据增强

  • 训练的时候使用随机翻转、随机尺度以及mixup来进行数据增强。 
  • mixup是一种非常规的数据增强方法,一个和数据无关的简单数据增强原则,其以线性插值的方式来构建新的训练样本和标签。最终对标签的处理如下公式所示,这很简单但对于增强策略来说又很不一般。

image.png


实现mixup数据增强很简单,其实我个人认为这就是一种抑制过拟合的策略,增加了一些扰动,从而提升了模型的泛化能力。

def get_batch(x, y, step, batch_size, alpha=0.2):
    candidates_data, candidates_label = x, y
    offset = (step * batch_size) % (candidates_data.shape[0] - batch_size)
    train_features_batch = candidates_data[offset:(offset + batch_size)]
    train_labels_batch = candidates_label[offset:(offset + batch_size)]
    if alpha == 0:
        return train_features_batch, train_labels_batch
    if alpha > 0:
        weight = np.random.beta(alpha, alpha, batch_size)
        x_weight = weight.reshape(batch_size, 1, 1, 1)
        y_weight = weight.reshape(batch_size, 1)
        index = np.random.permutation(batch_size)
        x1, x2 = train_features_batch, train_features_batch[index]
        x = x1 * x_weight + x2 * (1 - x_weight)
        y1, y2 = train_labels_batch, train_labels_batch[index]
        y = y1 * y_weight + y2 * (1 - y_weight)
        return x, y

而模型增前后的效果如下:

image.png

模型选择

  • 模型选择上面采用先小模型验证代码流程,后用大模型涨分的策略。
  • 首先使用resnet18模型可以快速验证想法的正确性,将模型表达能力增强放在最后一步提升。使用resnet18可以达到84的准确率。
  • 最终使用的senet154则可以将准确率提升到91.5左右。

模型优化

  • 模型优化使用SGD算法,采用动量优化,权重衰减0.0001.具体代码如下:
optimizer = torch.optim.SGD(filter(lambda p: p.requires_grad, model.parameters()), lr=lr, momentum=0.9, weight_decay=0.0001, nesterov=True)
  • 学习率使用带有warmup的的余弦退火动态调整。其示意如下:

image.png


最后的总结


首先要使用一个简单的基础模型将流程跑通,得到一个baseline。之后在baseline的基础上添加测试训练技巧,这样可以快速涨分!!

本文为作者在FlyAI平台发布的原创内容,采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,转载请附上原文出处链接和本声明。
本文链接地址:https://www.flyai.com/n/110736
立即参加 你画我猜
代码展示

PyTorch ResNet SENet

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

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

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

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

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