NTU ML2023Spring Part3.3 CNN
License: CC BY-NC-SA 4.0
卷,就硬卷.jpg
Google Colab 的免费 GPU 达到限额了,Kaggle 又没有 GPU 可用[1],只好用旧手机(刷上 postmarketOS)炼丹。Money is all you need,氪不了但是可以挂机。
由于炼丹炉(旧手机)比较破,所以在训的时间删掉了 cnn 层里的 BatchNorm 和 ReLU,并改小了一些参数。事实证明和效果和硬跑差不多。
class Classifier(nn.Module):
def __init__(self):
super(Classifier, self).__init__()
# torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding)
# torch.nn.MaxPool2d(kernel_size, stride, padding)
# input 維度 [3, 128, 128]
self.cnn = nn.Sequential(
nn.BatchNorm2d(3),
nn.Conv2d(3, 64, 3, 1, 1), # [64, 128, 128]
# nn.BatchNorm2d(64),
# nn.ReLU(),
nn.MaxPool2d(2, 2, 0), # [64, 64, 64]
nn.Conv2d(64, 128, 3, 1, 1), # [128, 64, 64]
# nn.BatchNorm2d(128),
# nn.ReLU(),
nn.MaxPool2d(2, 2, 0), # [128, 32, 32]
nn.Conv2d(128, 256, 3, 1, 1), # [256, 32, 32]
# nn.BatchNorm2d(256),
# nn.ReLU(),
nn.MaxPool2d(2, 2, 0), # [256, 16, 16]
nn.Conv2d(256, 256, 3, 1, 1), # [512, 16, 16]
# nn.BatchNorm2d(512),
# nn.ReLU(),
nn.MaxPool2d(2, 2, 0), # [512, 8, 8]
nn.Conv2d(256, 256, 3, 1, 1), # [512, 8, 8]
# nn.BatchNorm2d(512),
# nn.ReLU(),
nn.MaxPool2d(2, 2, 0), # [512, 4, 4]
)
self.fc = nn.Sequential(
nn.Dropout(p=0.1),
nn.Linear(256*4*4, 512),
nn.ReLU(),
nn.Linear(512, 256),
nn.ReLU(),
nn.Linear(256, 11)
)
def forward(self, x):
out = self.cnn(x)
out = out.view(out.size()[0], -1)
return self.fc(out)
最后发现卷积这部分根本不用改,全连接层里加点 dropout 也能训。但是交上去之后只有 0.6 的成绩,连 simple baseline 都达不到。鉴定为菜。
2025.1.28 update:其实是有的,见下一篇(hw4). ↩︎

浙公网安备 33010602011771号