破千贊了,來補兩個亞馬遜工程師的CNN調參經驗文章。
大概調了快一年CNN(2019年1月到今天),看到這個話題挺感興趣的,以下是我的總結
做工程
VGG16
吧。兩個3\times 3
的摺積核堆疊能獲得5\times 5
摺積核的感受野並且參數比5\times 5
摺積核少,所以是大量推薦使用的。
fusion
到3\times 3
摺積核上,在許多經典CV任務上都可以獲得大概1個點的提升。大家可以看看這篇文章解讀,來自公眾號AI科技評論。
a href="https://
mp.weixin.qq.com/s/uRwh
2-dSVyZeO1sbJzx6qg
">33摺積+13摺積+3*1摺積=白給的精度提升
weight
的初始化我一般都是使用
xavier
初始化。當然也可以可以嘗試何凱明大神的He初始化。對於bias的初始化全置於0。
Batch Normalization
。這是我一直在使用的技巧,可以很大程度的加快收斂速度。建議搭建自己網絡的時候盡量加上
BN
,如果有
BN
了全連線層就沒必要加
Dropout
了。
fpn
結構。在針對自己的數據調檢測任務如
yolov3
的時候不能盲目砍掉
fpn
結構,盡管你分析出某個分支的Anchor基本不可能會對你預測的目標起作用,但如果你直接去掉分支很可能會帶來漏檢。
SGD
。如果最佳化不動可以試試
Adam
。
ReLU
做一版,如果想再提升精度可以將
ReLU
改成
PReLU
試試。我更傾向於直接使用
ReLU
。
batch_size
:在不同類別的任務中,
batch_size
的影響也不同,大家可以看看這篇
batch_size
對模型效能影響的文章,來自公眾號AI開發者。Batch_size是怎麽影響模型效能的
0.01
開始設定,我個人認為這個學習率和學習率衰減策略是相關的,但不宜設定的過大過小,
0.01
和
0.1
應該是比較常用的。學習率衰減策略我一般使用
multistep
方式,
step_size
的設定要看視你的的
max_iter
而定。
zero-center
。第一次見到這個詞是在看cs231n的影片上。主要有2個步驟,第一個是減均值,第二個是除以變異數。這樣做下來最後的輸入是滿足均值為0變異數為1的概率分布的,一般減均值是最常用的,後面的除以變異數用不用可能需要自己動手試驗一下看看效果。
resnet
的殘留誤差結構和
dense net
密集連線結構,做工程的時候考慮到速度近乎不可能說完全使用完整版本的
resnet
和
densenet
的完整結構,但我們可以自己動手將我們網絡的某些模組替換為殘留誤差結構和密集連線,替換的時候可以適當降低這倆結構的復雜度,類似於通道數減半,密集連線中只保留一半連線等等。這裏需要做一些消融實驗來驗證改進後的精度。
loss
一般是對模型的泛化效能有所改善的,但在用
loss
的時候往往並不是直接替換
loss
那麽簡單,需要仔細思考
loss
背後的數學原理,要用對地方才可有提升。例如,如何將Focal Loss用到YOLOv3中提升
map
,大家可以看看這個貼文。https://www.
zhihu.com/question/2933
69755
。
map
值,
miou
值等。並且在調參時建議將調整的參數和在測試集上的精度組合成一個字串給模型重命令,方便之後快速
review
。
backbone
的網絡,如訓練
VGG16-SSD
建議選擇
finetune
的方式,從頭訓練不僅費時費力,甚至難以收斂。
做比賽
VGG16
提取出的特征向量維度是
[N,c1]
,
ResNet50
提取的特征向量維度是
[N,c2]
,
Xception
提取的特征向量維度是
[N, c3]
,那麽我們可以使用三個系數
a、b、c
將其組合為形狀為
[N, a*c1+b*c2+c*c3]
,其中
a、b、c
三個參數的取值代表我們使用哪個模型的特征多一些,如果是分類回歸比賽,我們在後面接特征處理網絡就可以了。可以取不同的
a、b、c
得到不同的特征,然後對結果做
voting
,
soft-voting
等多種處理,一般結果不會太差啦。
batch_size
,最佳化器)訓練出不同模型,然後做ensemble。
因為我就做了一點點入門級比賽,上面介紹的方法取得了還不錯的結果,所以我就在這裏獻醜啦,方法確實挺無腦的,大家笑一笑就好啦。 繼續想了下,我好像除了這些有接觸或者使用到,暫時沒有什麽其它的了,如果想起其他的了,之後補充下。
-----------------------------------更新--------------------------------
歡迎大家關註我的公眾號和我交流演算法哦。