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個模型都遵從此規律)