• 李宏毅 2022机器学习 HW3 boss baseline 上分记录


    作业数据是所有数据都有标签的版本。

    1. 训练数据增强, private 0.76056

    结论:训练数据增强、更长时间的训练、dropout都证明很有效果,实验效果提升至接近strong baseline

    增强1:crop + geometry
    增强2:crop + geometry + gray
    另外epochs数目增加到100,patience增加到10个epochs,FC层增加 dropout(0.3)

    增强代码如下

    #训练数据增强代码
     train_tfm = transforms.Compose([
        # Resize the image into a fixed shape (height = width = 128)
        # transforms.Resize((128, 128)),
        transforms.RandomResizedCrop(size=(128, 128), scale=(0.8, 1)),
        # 几何变换
        transforms.RandomHorizontalFlip(p=0.5),
        transforms.RandomVerticalFlip(p=0.5),
        transforms.RandomRotation(degrees=180),
        transforms.RandomAffine(degrees=30),
        #像素变换
        transforms.RandomGrayscale(p=0.2), 
        # You may add some transforms here.
        # ToTensor() should be the last one of the transforms.
        transforms.ToTensor(),
    ])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    具体实验结果如下:
    在这里插入图片描述

    2. cross validation&ensemble, private 0.81647

    使用5-fold cross validation,划分的时候使用分层抽样,
    2.1)epochs=100, patience=10
    训练时发现通常在60 epochs左右就early stop了,最终public score不如之前,但private score有提升,说明cross validation在过拟合上还是有效果的。
    在这里插入图片描述
    2.2)epochs=100, patience=16,再看看效果
    patience增大后,效果有了一个非常明显的提升,超过strong baseline。具体看实验过程,会发现之前patience=10的时候,基本60epochs就停了,而现在patience=100的时候,early stop没有起作用,都是训练满100个epochs。猜测应该是使用5-fold的cross validation时,对比默认的train/valid,一方面训练数据更多,另一方面valid数据变少波动性更大,所以应该给更多的时间训练。
    在这里插入图片描述

    3. test dataset augmentation, private 0.82458

    结论:此方式有效,分数进一步提升
    在这里插入图片描述
    测试数据的具体增强方式如下:
    在步骤2的基础上,对test数据集使用了train数据集的数据增强方式,生成5张图片预测,对预测结果值平均,然后再用这个结果与原预测结果平均。以下为作业PPT相关部分。
    在这里插入图片描述

    4. resnet, private 0.86555

    使用torchvision自带的resnet模型(按照作业要求,pretrained=False),尝试了resnet18和resnet50,效果进一步有了明显提升。public榜上超过bossline,但是从private榜上,可以看出存在一定过拟合。 另外resnet50的效果并没有比resnet18好,可能是小数据集的原因。这里均使用epochs=200,patience=16, lr=0.0003, weight_decay=1e-5。
    在这里插入图片描述
    在这里插入图片描述

    两个注意点:
    1,图片size设成224x224(论文中使用的图片尺寸),对比了128和224,两者差别很大。
    2,resnet中的全连接层需要从原来的1000改成此次任务预测的类别数目11,代码如下:

    def model_resnet():
        resnet = resnet18(pretrained=False)
        resnet.fc = nn.Sequential(
            nn.Linear(resnet.fc.in_features, 512),
            nn.ReLU(),
            nn.Dropout(0.3),
            nn.Linear(512, 11)
        )
        
        return resnet
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    5. Image Normalization, private 0.87494

    尝试了image normalization,略微有一些提升,尤其是做了test augmentation的private榜,达到了目前最高分。
    在这里插入图片描述
    image normalization的代码如下,注意train和test需要加上同样的norm。

    height, width = 224, 224
    
    # Normally, We don't need augmentations in testing and validation.
    # All we need here is to resize the PIL image and transform it into Tensor.
    test_tfm = transforms.Compose([
        # transforms.Resize((128, 128)),
        transforms.Resize((height, width)),
        transforms.ToTensor(),
        transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))
    ])
    
    # However, it is also possible to use augmentation in the testing phase.
    # You may use train_tfm to produce a variety of images and then test using ensemble methods
    train_tfm = transforms.Compose([
        # Resize the image into a fixed shape (height = width = 128)
        # transforms.Resize((128, 128)),
        # transforms.RandomResizedCrop(size=(128, 128), scale=(0.8, 1)),
        transforms.RandomResizedCrop(size=(height, width), scale=(0.8, 1)),
        # 几何变换
        transforms.RandomHorizontalFlip(p=0.5),
        transforms.RandomVerticalFlip(p=0.5),
        transforms.RandomRotation(degrees=180),
        transforms.RandomAffine(degrees=30),
        #像素变换
        transforms.RandomGrayscale(p=0.2), 
        # You may add some transforms here.
        # ToTensor() should be the last one of the transforms.
        transforms.ToTensor(),
        transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))
    ])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    6. 减小batch_size, private 0.895

    将batch_size从64减小到16,模型效果进一步提升,加上image normalization后,private和public双双达到目前最高分。
    在这里插入图片描述

    7. label smoothing

    label smoothing是为了让模型不要那么武断,加强模型鲁棒性的手段,尤其可以介绍标签错误带来的影响。
    尝试了label_smoothing 0.1和0.05,其余超参保持不变,实验结果不如之前。pytorch的crossentropyloss里面有label_smoothing参数,直接设置就好。

    # For the classification task, we use cross-entropy as the measurement of performance.
    criterion = nn.CrossEntropyLoss(label_smoothing=0.05)
    
    
    • 1
    • 2
    • 3

    在这里插入图片描述

  • 相关阅读:
    柱状图中最大的矩形
    (六)Vue之数据代理
    仓库风格,数据库系统、黑板系统、超文本系统的概念以及应用
    maven配置远程私有仓库拉取库件
    PTA题目 福到了
    【无标题】
    jquery-qrcode客户端二维码生成类库扩展--融入自定义Logo图片
    Linux了解
    Linux--MQTT(二)通信基本原理
    linux删除软件
  • 原文地址:https://blog.csdn.net/weixin_39925939/article/details/133303484