@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、课外总结(新学的一些东西)
使用了可变学习率:可以看这篇,最好是先不用这个去学习一遍,看看模型在哪里大概会卡住,有针对性的去降低学习率,效果还不错: