以下心得來自于參加FlyAI的心得戴甩,剛好在這里也分享以下,我是小林子闪彼。本篇細(xì)數(shù)我在分類中用到的Trick甜孤,以及如何快速找到它們协饲。
純分享,有不足缴川,還望指正
首先聲明本人自去年九月接觸FlyAI茉稠,未拿過第一,只想單純分享經(jīng)驗把夸,一個夢想致力于開源路上的小男孩而线。但是平臺可以幫人快速成長是一點沒錯的,當(dāng)你看到諸多優(yōu)秀的人恋日,你會有一種為什么我不行的錯覺膀篮,這篇文章就是希望幫你找到你在圖像分類中可能忽視的細(xì)節(jié)。
當(dāng)?shù)谝淮巫鰣D像分類的步驟應(yīng)該是啥岂膳?
- 觀察數(shù)據(jù):數(shù)據(jù)長什么樣誓竿,標(biāo)簽幾類啊,圖像大小啊谈截。
- 數(shù)據(jù)增強:最開始最好什么也沒有筷屡,或者肉眼感覺可以做的數(shù)據(jù)增強(僅限部分賽題,肉眼和CNN理解存在差距)
- 模型選擇:resnet簸喂,densenet速蕊,efficientnet個人最常用的三種,選擇一個淺層的開始娘赴。
- 觀察性能:有了數(shù)據(jù)规哲,模型,然后就提交看一下可以獲得多少分胺瘫怼唉锌!
看了分?jǐn)?shù)之后,發(fā)現(xiàn)怎么和第一差好多我該怎么辦竿奏?
- 我模型不對袄简,我換個模型試試?
- 我數(shù)據(jù)增強不好泛啸,我改一改绿语?
注意,我想說的是,以上這兩條再單模的時候十分關(guān)鍵,模型和數(shù)據(jù)增強很大一部分決定了你的分?jǐn)?shù)上限丽惭,所以在調(diào)參的時候可以跑一編常用的模型res34-50-101;wrn-50-101等等等,在換模型的時候注意不要改動數(shù)據(jù)增強了匹耕。然后你在修改數(shù)據(jù)增強,找到一個最好的數(shù)據(jù)增強荠雕。
這個時候就有小伙伴問了稳其,什么是最好的數(shù)據(jù)增強驶赏?
- 如果你fai足夠,你就嘗試自己認(rèn)為可能的數(shù)據(jù)增強既鞠,找到一個合適的煤傍。
- 自己寫好數(shù)據(jù)增強,自己把增強后的數(shù)據(jù)畫出來看看嘱蛋,如果差距同類中的太多蚯姆,肯定不行啊浑槽!
- 當(dāng)你遇到瓶頸后,你可以分析bad case返帕,看一下怎樣的數(shù)據(jù)增強可以讓其預(yù)測正確桐玻?(我在很多分類經(jīng)驗中都看到過這一點,雖然我從來沒用過荆萤,因為我是個懶人)
補充一點比較關(guān)鍵的optimizer和 lr_scheduler
- 如果你不知道如何使用優(yōu)化器:Adam镊靴,學(xué)習(xí)率3e-4。
- 如果你不明白學(xué)習(xí)率遞減策略: ReduceLROnPlateau(patience通常3链韭、4)和余弦學(xué)習(xí)率選一個
數(shù)據(jù)增強偏竟,模型都說完了,怎么上分才是關(guān)鍵啊敞峭,一下我就列舉我在FlyAI踊谋,用到過的所有Trick(Pytorch版,Keras可能沒啥人用吧旋讹,搜索?Github)殖蚕。
- 數(shù)據(jù)重新劃分:官方給的是6:2,第一步我默認(rèn)直接0.1或者0.2沉迹,這點我覺得也是大多數(shù)人默認(rèn)的技術(shù)了睦疫。
- 標(biāo)簽平滑:適用于有噪聲的標(biāo)簽,我在標(biāo)簽種類多的比賽中常用鞭呕,少的幾乎不用蛤育,來自于經(jīng)驗。個人取舍葫松!
- 樣本平衡:幾乎不用瓦糕,大部分評估指標(biāo)acc(因此你可以揣測測試樣本也是如此的,過大的權(quán)重不利于樣本多的類更準(zhǔn)確)腋么。如果你非要用刻坊,搜索ImbalancedDatasetSampler即可使用。
- warmup:最開始我用小的學(xué)習(xí)率訓(xùn)練党晋,防止一開始底層的權(quán)重被拉偏了谭胚。當(dāng)數(shù)據(jù)量較少的時候我會使用徐块。當(dāng)數(shù)據(jù)量很大的時候,我通常為了剩fai這里就不做過多的設(shè)置灾而。搜索GradualWarmupScheduler即可使用
- cutout以及隨機擦除:這里有時候是漲分點胡控,例如你畫我猜的時候就很好用。這個trick在pytorch的transforms中自帶了旁趟,可想而知昼激,這個還是常用的。
- Mixup:我看到已經(jīng)有大佬分享這個了锡搜,我只能說橙困,用這個我從來沒有上過分,不知道是不是自己太菜了8汀凡傅!所以,這個大家自己試試肠缔。在嘗試的時候注意夏跷,如果你已經(jīng)用到了cutout的話,再用是不是有點就不好了明未,個人理解槽华。搜索pytorch mixup
- 分層學(xué)習(xí)率:backbone和fc使用不同的學(xué)習(xí)率,這點我感覺和warmup有點相似之處趟妥,所以大家各取所好就好猫态。具體實現(xiàn)可以自己寫網(wǎng)絡(luò)類,或者根據(jù)網(wǎng)絡(luò)層的名字在optimizer里指定披摄。
- Dropout和BN:抑制過擬合的好手段懂鸵,將最后的fc前面加一層DP或者BN,或者自己重新寫一下FC行疏。這里分享以下匆光,我以前Keras,后來Pytorch酿联,所以在修改fc的時候有點不適應(yīng)终息。后來發(fā)現(xiàn)只需要 nn.Sequential( nn.Dropout(0.2),nn.Linear(nfs, cfg.num_class) )即可。
- TTA:測試增強贞让,這也是幾乎必用的手段周崭,沒有副作用(在不要求復(fù)雜度的情況下)。模型預(yù)測的時候喳张,使用數(shù)據(jù)增強的多張照片续镇,取結(jié)果的平均值。這里的數(shù)據(jù)增強销部,我通常直接使用訓(xùn)練時候的數(shù)據(jù)增強摸航。如果你分析了bad case在這里修改一下增強效果制跟,漲分利器。
- 模型融合:Flyai2.0更加開放酱虎,使得模型融合變得非常簡單雨膨,所以不妨試一下,你會發(fā)現(xiàn)新大陸读串,就像我在X肺炎檢測里說的聊记,在過擬合的情況下,通常能帶來穩(wěn)定的漲點恢暖,也是各路比賽要求的排监。
-
交叉驗證:這里就和模型融合有點類似,區(qū)別在于數(shù)據(jù)上而已杰捂,使用不同的數(shù)據(jù)訓(xùn)練多個模型舆床。有時候也是漲點利器。
今天就分享這么多琼娘,以后可能會更新峭弟,怎么合理使用這些技巧呢附鸽?每次都試一遍不是 太扯淡了嗎脱拼?
加油
這里要說的就是,當(dāng)你看了很多心得坷备,你發(fā)現(xiàn)為啥感覺大家說來說去就這么多熄浓,我好像都明白,但是為什么我的分?jǐn)?shù)不如別人呢省撑?哈哈赌蔑,我也有同樣的問題,這其中有運氣的成分竟秫,但不可否認(rèn)別人的經(jīng)驗和技術(shù)的差距娃惯,隨便一個參數(shù)(例如學(xué)習(xí)率)別人設(shè)置的可能就比你設(shè)置的結(jié)果好一些。不乏大佬可以重新修改底層網(wǎng)絡(luò)結(jié)構(gòu)肥败,所以在抱怨的時候趾浅,為何不去嘗試一點新的東西,不分析一下bad case呢馒稍?例如最新的cbam皿哨,cutmix,優(yōu)秀的預(yù)訓(xùn)練模型啊纽谒,kaggle就有你畫我猜原題目啊证膨,對吧?是不是說太多廢話了
如果覺得我說的有用鼓黔,就給我點個贊吧央勒!
PS:
本人懶人不见,以上trick我在接觸平臺的時候就已經(jīng)開始收集各種實現(xiàn)方式了,很多大佬也是如此订歪。所以你看脖祈,同樣一個題目,別人可能直接修改少量的參數(shù)就比較有好的效果了刷晋,所以把好用的就封裝起來盖高,下次直接用,祝大家可以取得高分眼虱。