最近在做一个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车型分类总结-LMLPHP

04-17 03:16