kaggle入门(1):手写字符识别0.99575(top12%-2020/7/2)

1)minist数据集介绍

mnist数据本身是70000张。
kaggle给的训练集:42000张图,用于提交的测试图28000张;

2)递进提交记录

第一次:0.98682 (top50%)
  • 网络:原生Lenet5
  • 数据:随机分配0.1比例的验证集,无数据增广
class Lenet(nn.Module):
    def __init__(self, in_channel = 1, cls = 10):
        super(Lenet, self).__init__()

        self.conv1 = nn.Conv2d(in_channel, 20, kernel_size=5, stride=1)
        self.conv2 = nn.Conv2d(20, 50, kernel_size=5, stride=1)
        self.ip1 = nn.Linear(800, 500)
        self.logit = nn.Linear(500, cls)

    def forward(self, x): 
        x = self.conv1(x)
        x = F.max_pool2d(x, kernel_size = 2, stride = 2)
        x = self.conv2(x)
        x = F.max_pool2d(x, kernel_size = 2, stride = 2)
        x = x.view(x.size(0), -1)
        x = self.ip1(x)
        x = F.relu(x, inplace=True)
        x = self.logit(x)
        return x
第二次 0.98682->0.98814
  • 网络:原生Lenet5, 不变
  • 数据将第一次验证集和训练集识别错的数据,每类复制约500张,随机分配0.1比例的验证集
  • 优化想法:从识别错的的数据入手,应该是会这类数据增加识别率。效果有提升,但提升不是很大,说明还有一些类型数据是训练集信息较少的。
第三次 0.98814->0.99078
  • 网络:改变Lenet5,用(conv-relue-maxpool)x3-fc-dropout结构替代
  • 数据:同第二次数据一样
  • 优化想法:加dropout,抑制过拟合,并尝试其他结构CNN
第四次 0.99078->0.99082
  • 网络:同第三次
  • 数据:验证集比例0.03,即训练集数量增多
  • 结论说明:从数据上着手还能提高准确率
第五次 0.99082->0.99135
  • 网络:同第三次
  • 数据:验证集比例0.03,同时对数据集施加数据增广(shift、rotato、scale)
  • 结论说明:数据增广确实是有必要的
第六次 0.99135->0.99210 top29%
  • 网络:同第三次
  • 数据:类似交叉验证,训练15个模型,每次训练的分配不同验证集,验证集比例为0.1,同时对数据集施加数据增广(shift、rotato、scale),每个模型训练20个epoch
  • 预测:15个模型进行投票
  • 思想:充分利用数据
第七次 0.99210->0.99575 top12%
  • 网络:在第三次网络基础上,添加BN层
  • 数据:同第六次(数据增广、随机0.1测试集),训练了9个模型,取epoch45进行级联判断

关于kaggle的mnist

kaggle入门(1):手写字符识别0.99575(top12%-2020/7/2)_第1张图片
利用kaggle的给的训练数据,最高应该达到99.79%的准确率,榜单上99.8%以上的,应该都是训练了全部70000张图像,这实际上称为作弊了。

小结

1、数据增广基本上是所有深度学习项目都必须的,提高泛化能力的有效手段,但需要注意,不能随意增广,比如此例的手写数字,6和9,旋转角度范围需要注意;
2、对于kaggle这种限定数据集上的项目,网络级联能效果比但模型要好。
3、添加dropout、BN层是有效的
4、验证集上表现最好的模型,对测试集不一定表现好(用级联模型时,我选最后一个epoch训练的模型级联比选验证集上表现最好的模型进行级联,对最终分数要更好,15个模型和9个模型都遵从此规律)

你可能感兴趣的:(深度学习)