如何步入深度学习刷榜第一重境界
實際上筆者也沒多少刷榜經驗,畢竟不擅長,之前老大也沒有任務指派,今年10月份得閑了個把月,沒那么多事就參加了一個場景分類的比賽,鏈接如下,https://challenger.ai/competition/scene/leaderboard/test_a
刷了一個月之后最好成績也就殺進前15然后就接著干項目去了。
與第一名差一個點,7000張測試圖,80類,基本上每一類差1張圖。到比賽結束的時候排在第20名左右,與第一名還是差一個點。說出去好像是有點不太好意思,但是作為第一次刷比賽,一個月也不能白費,畢竟績效打在那里。現在的比賽聽說還有專業刷榜團隊的,也是666。
下面也簡單分享一下。
0 刷的是什么比賽?
場景分類,80類日常生活中比較多的場景,這個在以后的社交應用中還是有需求的,相關最大的比賽是place365,有興趣可以去看。眼下這個,是創新工場,今日頭條,搜狗等一起搞的比賽,train數據集就不大,只有50000+,測試數據集7000+。
下面舉10類吧
0/航站樓:airport_terminal
1/停機坪:landing_field
2/機艙:airplane_cabin
3/游樂場:amusement_park
4/冰場:skating_rink
5/舞臺:arena/performance
6/藝術室:art_room
7/流水線:assembly_line
8/棒球場:baseball_field
9/橄欖球場:football_field
10/足球場:soccer_field
1 為什么叫第一境界?
我覺得怎么著刷榜這事也得有個三個境界,像筆者這樣,一個人拿現有的模型,4塊K40,兼職刷上一個月,最后提交也只融合了兩個模型的,怎么看都是處于剛入門的第一境界,大部分人其實也就是這個境界。
而到了第二三境界,至少得有個集群,得有一群人來嘗試各種方案,而頂尖的團隊對網絡結構肯定是需要調優設計的,歷年奪冠的那些網絡alexnet,googlenet,resnet,senet無一例外。
不過設計強大的網絡結構從時間代價,計算資源代價和算法能力都有比較高的要求,大部分人可能就是從數據層面做文章了,比如清洗數據,數據增強,搞搞不均衡樣本等。
2 怎么一步刷到比較優的單模型?
這是最關鍵的第一步。
有幾點一定是要形成共識的。
(1) 由于我是只有4個卡,用caffe或者tensorflow都是不可能的,我用了mxnet,并且在訓練的過程中都放開了所有參數,實際上也做過固定某些參數的實驗,但是效果并不好。224的尺度,放開全部訓練的話,4塊卡resnet152 batchsize可以到96。在實驗的過程中,batchsize越大,指標就越高,幾個網絡都能觀測到相關結論。
(2) 由于訓練數據少,使用當前數據從頭訓練大模型不太現實,所以,先找到相關數據集比賽finetune過的大網絡,resnet系列找了一個resnet152,dpn系列找了一個dpn92,各自先訓練。
(3) 從盡量大的模型開始,機器啃得動的就行,畢竟這個任務里面有很多類還是很難的,小網絡搞不定,resnet系至少得50層以上。
在刷這個比賽的時候,從imagenet mxnet model的模型fine-tune過來,鏈接在下面。
http://data.mxnet.io/models/
實驗了18,50,152層的網絡,使用本比賽50000+的數據進行簡單的參數調優,
解釋一下,lr是學習率,Lr=0.01(10)代表在10個epochs后下降一個數量級,從0.01到0.001,實際上在10個epoch以后都收斂了,所以后面沒有做更多step lr的比較,大家感興趣可以去嘗試。w是weight decay,m是momentum,bs是batch size,單個k40 gpu。
從上面可以看出,從18層到152層精度毫無疑問是提升的。雖然參數沒有調到各自最優,但基本能反應問題。尤其注意的是res18我加了weight decay來增加模型復雜度,不然沒有上90%的可能。從resent152到resent200指標就沒什么提升了,而且res200遠遠沒有res152參數好調。單模型單個crop 94%的精度已經差不多了,
(4) 理論上隨著訓練尺度增加,在一定范圍內性能也會增加,但是訓練尺度的增加會導致能使用的batchsize減小,所以筆者最后統一采用224這個尺度。聽說有人用到了700以上的尺度,只能說,真土豪也。
(5) 單個模型,多個crop會對結果有所提升,有的團隊用到了上百個crop,筆者最后用了10個crop,沒有去嘗試更多,畢竟測試也是很花時間,這點資源一個人搞不過來。
有了以上的共識后,那就開始干起來,過段時間我會重新整理把項目git傳上去,前段時間服務器意外格式化丟了全部訓練文件,一時還沒有恢復。如果對此感興趣,請持續關注。
總結:單模型,以resent152為例。
訓練尺度224*224,數據增強采用了水平flip和隨機crop,random resize參數照搬googlenet那套,放開所有參數,使用resnet152-place365,即在place365數據集上進行訓練過的模型,然后使用當前的訓練數據集進行finetune,validation數據集進行測試。
數據增強參數偷懶截個圖,實際上這些mxnet全部都已經集成好了,直接設置開關即可。
訓練參數,lr=0.01,分別在10,20,40個epoch時下調學習率,最后采用10個crop,分別為四個角,中心以及水平翻轉。在試用了多個batchsize之后,最大的能用的batchsize取得最優,resnet152單個模型能到97%。
在測試的時候有trick,采納dpn的思想,使用較小的尺度訓練,使用較大的尺度測試,最終在略大于224的尺度上,有微小的提升,對于刷榜來說還有很重要的,畢竟0.5%可以干掉10個人。
3 怎么做模型融合?
不同網絡架構,但能力相當的模型進行融合,結果會穩定提升。筆者單模型10個crop,resnet152得到0.971,dpn92得到0.965,兩者融合后即到0.978。要想得到最優,需采用不同的epoch進行融合,這個需要花時間去測試;所以就會出現兩個單模型最優,融合之后缺不是最優的情況。這個時候,需要把各自錯誤樣本拿出來分析,我當時沒有太多時間和耐心去嘗試各種方案。
這就是提交比賽的最后結果,兩個現有的模型在224尺度用4張卡訓練,融合之后,在比賽結束前的一個月,能排在15名左右,比賽結束后我回去一看,test_a也在20名以內,test_b也差不多,由于test_b比較難,所有參賽隊伍的成績都下降了4個點左右。
4 哪些trick比較關鍵
雖然提交的結果非常簡單,筆者還是實驗過很多參數的,稍微有些經驗拿出來分享下,有些參數是不能亂調的,有些則不需要調。
(1) finetune很關鍵
從相關大數據集上訓練好的模型開始finetune,基本上可以肯定會比從不相關大數據集上訓練的模型,或者從頭開始訓練更好,這個大家應該是通識了。
(2) 學習率lr和batchsize
學習率和batch size是成對的參數,batch size增大N倍,相當于將梯度的方差減少N倍,也就是梯度方差更小了,更加準確,更加容易跳出局部最優,帶來的后果就是收斂更慢,這時候為了提高訓練速度,可以將lr增加sqrt(N)倍。
學習率是最關鍵的參數了,沒得說,只能自己從大到小開始嘗試。
筆者列舉一個例子:dpn92, lr_step_epochs='10,20,30,40',w=0,m=0,bs=64,
lr取0.001,0.005,0.01,0.01,分別看train和val的acc。
從小到大,從欠擬合到過擬合,很明顯。
batch size相對來說沒有lr那么敏感,但是對結果也是至關重要的。
下面是resnet152的batchsize的實驗,mul_val是多個crop
下面是dpn92的batchsize的實驗,mul_val是多個crop
看的出來,指標有所上升。
當然了,還是那句話,單個最優的模型融合起來并不能保證結果最優。
(3) weight decay和momentum
這兩個參數,對于小模型的訓練是比較關鍵的,不過越大越不敏感。
下面是res18的訓練結果,從結果看來差異是很大的。
Res50,差距就不明顯了。
Senet50也是。
我的結論是這個參數可以去調一調,不過對于大模型可能不是很必要,我都用的是0
(4) 測試網絡
下面是單個crop和10個crop的比較
很明顯,不管是什么網絡,多個crop會有很明顯的提升,上面穩定提升2%以上,更多的crop筆者沒嘗試,因為實在是太慢了。
另一方面,借鑒dpn的思想,用小尺度訓練,大尺度測試可能也有微小的點提升,下面是一個比較。
(5) 數據增強
本任務中復雜的數據增強沒怎么用,使用的是mxnet? level=1的數據增強,估計是因為模型已經在大數據庫上訓練過,au=1就是基本的crop,flip,random resize,au=2會做圖像旋轉,au=3會再加上顏色擾動,實際的項目中我們還是會做一點的。
就這么多,不知道你對是否有用,下回搞點機器搞點時間去刷個大榜試試。
話說有個問題,刷比賽的各位覺得這個好玩嗎?
總結
以上是生活随笔為你收集整理的如何步入深度学习刷榜第一重境界的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【GAN的应用】基于对抗学习的图像美学增
- 下一篇: [caffe解读] caffe从数学公式