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的給的訓練數據,最高應該達到99.79%的準確率,榜單上99.8%以上的,應該都是訓練了全部70000張圖像,這實際上稱爲作弊了。

小結

1、數據增廣基本上是所有深度學習項目都必須的,提高泛化能力的有效手段,但需要注意,不能隨意增廣,比如此例的手寫數字,6和9,旋轉角度範圍需要注意;
2、對於kaggle這種限定數據集上的項目,網絡級聯能效果比但模型要好。
3、添加dropout、BN層是有效的
4、驗證集上表現最好的模型,對測試集不一定表現好(用級聯模型時,我選最後一個epoch訓練的模型級聯比選驗證集上表現最好的模型進行級聯,對最終分數要更好,15個模型和9個模型都遵從此規律)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章