標籤:
最近在做一個CNN車型分類的任務,首先先簡要介紹一下這個任務。
總共30個類,訓練集圖片為車型圖片,類似監控拍攝的車型圖片,訓練集測試集安6:4分,訓練集有22302份資料,測試集有14893份資料。
首先使用的是VGGNet網路,
nn.Sequential {
[input -> (1) -> (2) -> (3) -> (4) -> (5) -> (6) -> (7) -> (8) -> (9) -> (10) -> (11) -> (12) -> (13) -> (14) -> (15) -> (16) -> (17) -> (18) -> (19) -> (20) -> (21) -> (22) -> (23) -> (24) -> (25) -> output]
(1): nn.DataLayer
(2): cudnn.SpatialConvolution(3 -> 64, 6x6, 2,2, 2,2)
(3): cudnn.ReLU
(4): cudnn.SpatialMaxPooling(2x2, 2,2)
(5): cudnn.SpatialConvolution(64 -> 128, 5x5, 2,2, 2,2)
(6): cudnn.ReLU
(7): cudnn.SpatialMaxPooling(2x2, 1,1)
(8): cudnn.SpatialConvolution(128 -> 256, 3x3, 2,2, 2,2)
(9): cudnn.ReLU
(10): cudnn.SpatialMaxPooling(2x2, 1,1)
(11): cudnn.SpatialConvolution(256 -> 512, 2x2)
(12): cudnn.ReLU
(13): cudnn.SpatialMaxPooling(2x2, 1,1)
(14): cudnn.SpatialConvolution(512 -> 512, 2x2)
(15): cudnn.ReLU
(16): cudnn.SpatialMaxPooling(2x2, 1,1)
(17): nn.View(12800)
(18): nn.Linear(12800 -> 4096)
(19): cudnn.ReLU
(20): nn.Dropout(0.500000)
(21): nn.Linear(4096 -> 4096)
(22): cudnn.ReLU
(23): nn.Dropout(0.500000)
(24): nn.Linear(4096 -> 30)
(25): nn.LogSoftMax
}
網路參數如上。五個卷積層,三個全串連層。
資料預先處理:每個圖片scale成3*150*150大小。
實驗結果:十餘小時90%的正確率。(據之前結果最高到92%)
微調:使用Imagenet訓練處的DataLayer,十餘小時正確率達92%。(據之前結果最高到97%)
注意(原始碼中資料預先處理與訓練過程中有一點不匹配,會導致維度出錯的bug,具體錯誤請自行調試)
然後使用了Residual Learning的方法,使用的模型是ResNet-50。Model詳見:http://ethereon.github.io/netscope/#/gist/db945b393d40bfa26006
使用了之前用ImageNet訓練好的ResNet-50的模型進行retrain,將最後的全串連2048-1000的Linear換成了2048-30的Linear。
訓練結果:十餘小時94%的TOP1正確率。
網路結構需參考: BatchNormalization論文。
ResNet-50網路所需記憶體達到4000MB左右,需要兩個GPU同時運行才能跑。
結構中所採用的1*1卷積大大減少了網路的參數,首先1*1進行降維,3*3卷積後再使用1*1進行升維。每次維度變化都為4倍。
資料預先處理:輸入為3*224*224。
收斂速度曲線與論文中曲線類似:
CNN車型分類總結