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的给的训练数据,最高应该达到99.79%的准确率,榜单上99.8%以上的,应该都是训练了全部70000张图像,这实际上称为作弊了。
小结
1、数据增广基本上是所有深度学习项目都必须的,提高泛化能力的有效手段,但需要注意,不能随意增广,比如此例的手写数字,6和9,旋转角度范围需要注意; 2、对于kaggle这种限定数据集上的项目,网络级联能效果比但模型要好。 3、添加dropout、BN层是有效的 4、验证集上表现最好的模型,对测试集不一定表现好(用级联模型时,我选最后一个epoch训练的模型级联比选验证集上表现最好的模型进行级联,对最终分数要更好,15个模型和9个模型都遵从此规律)