美文网首页
Kaggle实战:Plant Pathology

Kaggle实战:Plant Pathology

作者: 海盗船长_coco | 来源:发表于2020-03-30 22:24 被阅读0次

比赛地址:https://www.kaggle.com/c/plant-pathology-2020-fgvc7/overview
参考kernel:https://www.kaggle.com/pestipeti/plant-pathology-2020-pytorch
pytorch-code:https://github.com/872699467/Plant-Pathology

题目描述

根据提供的图片,判断植物当前的健康状态,提交的内容为每个状态的概率。


示例图片

认知数据

植物的状态一共有4种,且已经用one-hot表示。每种类别的样本比例并不均衡,第二种明显少于其他种类。

import pandas as pd
import matplotlib.pyplot as plt
from collections import Counter
import numpy as np

if __name__ == '__main__':
    train_df = pd.read_csv('data/train.csv')
    print(train_df.head(5))
    label = train_df.iloc[:, [1, 2, 3, 4]].values
    label = label[:, 0] * 0 + label[:, 1] * 1 + label[:, 2] * 2 + label[:, 3] * 3
    count = Counter(label)
    x = [0, 1, 2, 3]
    y = [count[i] for i in x]
    fig = plt.figure(figsize=(6, 4), dpi=100)
    ax = fig.subplots(1, 1)
    ax.bar(x, y,label='label')
    ax.set_xticks(np.arange(0, 5))
    ax.set_xticklabels(['healthy', 'multiple_diseases', 'rust', 'scab'])
    plt.show()
前5条数据
每种类别的柱状图

开始编码

一、采用5折交叉验证,本地的得分与kaggle公共的得分相差较大,推测是由于验证集数量过少导致的,所以采用交叉验证的方法。又由于每个类别的数量并不均衡,所以将原本的KFold交叉验证方法改成了StratifiedKFold。确保训练集和验证集的每个类别样本比例相同。两者方法的区别可参考https://www.jianshu.com/p/c84818b56fa0
二、数据增强,如果我们想要训练更多的epoch,为了模型不会过拟合,我们需要对训练集进行数据增强,这也是一种增加训练样本量的方法。
三、损失函数为softmax+cross entropy。作者原本使用的是sigmoid+Binary Cross Entropy,并没有解释原因。不过一般的分类任务其损失函数为交叉熵损失函数。
四、输入图片的大小,从256像素增加到512像素。高分辨率虽然增加了计算量,但是会提高模型的精度。
模型采用的预训练的resnet-18。

class PlantModel(nn.Module):

    def __init__(self, pretrained, num_class=4):
        super(PlantModel, self).__init__()
        self.backbone = resnet18(pretrained=pretrained)
        in_feature = self.backbone.fc.in_features
        self.logit = nn.Linear(in_feature, num_class)
        self.dropout = nn.Dropout(0.25)

    def forward(self, x):
        x = self.backbone.conv1(x)
        x = self.backbone.bn1(x)
        x = self.backbone.relu(x)
        x = self.backbone.maxpool(x)

        x = self.backbone.layer1(x)
        x = self.backbone.layer2(x)
        x = self.backbone.layer3(x)
        x = self.backbone.layer4(x)

        x = self.backbone.avgpool(x)
        x = x.view(x.size(0), -1)
        x = self.dropout(x)

        out = self.logit(x)
        return out

损失函数上述提到是softmax+CE

class DenseCrossEntropy(nn.Module):

    def __init__(self):
        super(DenseCrossEntropy, self).__init__()

    def forward(self, y_pred, y_true):
        y_pred = y_pred.float()
        y_true = y_true.float()

        logprobs = torch.log_softmax(y_pred, dim=-1)

        loss = -y_true * logprobs
        loss = torch.sum(loss)

        return loss.mean()

其他关于数据读取、log记录等编码均已给出。

训练过程

训练集和验证集的收敛

结果

将每折的验证集预测叠加,就是对训练集中所有数据的预测,再与数据集进行比较,auc得分为0.9954。但是最终提交的测试集得分只有0.919,还是有比较大的提升空间。
5-Folds CV score: 0.9954


提交结果

相关文章

网友评论

      本文标题:Kaggle实战:Plant Pathology

      本文链接:https://www.haomeiwen.com/subject/cyybuhtx.html