关于李宏毅ML2021、2022HW3双Boss baseline的一步一步尝试实验记录与总结(五)----接近双Bossline

@CNN

1、Base_Line_V4_CNN

2、条件预设

A、数据使用情况

​ 1、完全使用2022数据,Train:9866. Validation:3430

​ 2、 添加了Augment策略,增加图片的多样性

# It is important to do data augmentation in training.
train_tfm = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.RandomChoice(
        [transforms.AutoAugment(),
        transforms.AutoAugment(transforms.AutoAugmentPolicy.CIFAR10),
        transforms.AutoAugment(transforms.AutoAugmentPolicy.SVHN)]
    ),
    # 随机水平翻转
    transforms.RandomHorizontalFlip(p=0.5),
    # 对图像执行随机仿射变换。
    transforms.RandomAffine(degrees=20, translate=(0.2, 0.2), scale=(0.7, 1.3)),
    transforms.ToTensor(),
])

# 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((224, 224)),
    transforms.ToTensor(),
])

B、模型架构

​ 1、模型为开始的卷积模型

class CNN(nn.Module):
    def __init__(self):
        super(CNN, self).__init__()
        # The arguments for commonly used modules:
        # torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding)
        # torch.nn.MaxPool2d(kernel_size, stride, padding)

        # input image size: [3, 128, 128]
        
        self.cnn_layers = nn.Sequential(
            # 3 * 224 * 224 -> 64 * 111 * 111
            nn.Conv2d(3, 32, 3, padding=1),
            nn.BatchNorm2d(32),
            nn.ReLU(),

            nn.Conv2d(32, 64, 3),
            nn.BatchNorm2d(64),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2),

            # 64 * 111 * 111 -> 128 * 54 * 54
            nn.Conv2d(64, 128, 3),
            nn.BatchNorm2d(128),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2),

            # 128 * 54 * 54 -> 256 * 26 * 26
            nn.Conv2d(128, 256, 3),
            nn.BatchNorm2d(256),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2),

            # 256 * 26 * 26  -> 256 * 12 * 12
            nn.Conv2d(256, 256, 3),
            nn.BatchNorm2d(256),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2),

            # 256 * 12 * 12  -> 512 * 5 * 5
            nn.Conv2d(256, 512, 3),
            nn.BatchNorm2d(512),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2),
        )
        
        self.fc_layers = nn.Sequential(
            nn.Linear(512 * 5 * 5, 512),
            nn.ReLU(),
            nn.BatchNorm1d(512),
            nn.Dropout(0.5),
            nn.Linear(512, 11),
        )

    def forward(self, x):
        # input (x): [batch_size, 3, 128, 128]
        # output: [batch_size, 11]

        # Extract features by convolutional layers.
        x = self.cnn_layers(x)

        # The extracted feature map must be flatten before going to fully-connected layers.
        x = x.flatten(1)

        # The features are transformed by fully-connected layers to obtain the final logits.
        x = self.fc_layers(x)
        return x

C、训练参数设置

Batch_size_Data = 32

criterion = nn.CrossEntropyLoss()

optimizer = torch.optim.Adam(model.parameters(), lr=0.0003, weight_decay=1e-5)

3、总结

在这里插入图片描述

差一点点就双过Bossbase line了,这次是使用了全部的2022提供的数据集,前面一直是使用2021的数据集,想看看半监督学习出来的效果,结果不管怎么换模型,效果都很差,甚至没有单纯使用labeled数据集的效果好,换了几次模型,也换了训练策略,都得到了很差的效果,所以暂时放弃了,转用全部的2022的数据集,发现真的好简单,2022的作业,提供的数据集相对也够大,随便用了个CNN就取得了很好的效果,差点就双Boss baseline了,这次就Private差大概0.001左右,主要是训练的时间太长了,在Kaggle上面跑的,超过了12个小时,导致数据还没有完全拟合,就这种效果,且导致没有保存训练信息,导致我画不了图、呜呜呜呜。
在这里插入图片描述
最好的一次的Res18但学习时间不够。

还尝试了Res18/Res30,可能都掌握的不好,效果没有这个好,也有可能是训练的时间太少了,每次都只能12个小时,Res30可能都还没有拟合就要停止了。不打算继续尝试了(四个号本周的时间都没了)练不动了,感觉现阶段掌握的方法就是数据增强、可变学习率、权重衰减好像没有其他办法了,使用可变学习率的话,最好先做一个不变学习率的,然后看损失的变化,再哪里学不动了,那个时候改变学习率,效果会更好一点

4、课外总结(新学的一些东西)

使用了可变学习率:可以看这篇,最好是先不用这个去学习一遍,看看模型在哪里大概会卡住,有针对性的去降低学习率,效果还不错:

可变学习率

你可能感兴趣的:(关于李宏毅ML2021,2022的实验记录。,深度学习,神经网络,cnn)