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

为了增强人工智能的趣味性,我们开展了你画我猜这一竞赛。你画我猜数据集中包括了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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章