CNN 網絡應該如何設計?
回答1:網絡多一層和少一層, 好像沒什麼區別. 但這樣一層層測試調參未免太狗血了.一種挺好的方法是:
設計一種或幾種block(這block由幾層網絡構成), 然後堆這種block.
這樣看起來舒服多了,參考resnet網絡結構(其實很多優秀網絡都是這樣的設計)至於每層的通道數, VGG有個設定是: 輸出的feature
map大小相同時,卷積核個數也相同輸出的feature map大小減半(被stride=2的卷積或Pooling後),
則卷積核數翻倍.這樣讓每層的時間花銷相同.而通道數的大小如何確定? 基於對應數據集, 參考其他優秀模型的設置. 記得對比網絡參數大小 .
回答2:建議在pre-trained model 基礎之上進行改進。
回答3:我的經驗是,要知道什麼樣的結構對具體任務有作用,最有效的辦法就是去做對比實驗,從而體會不同結構對網絡性能的影響(參數量/計算量/訓練穩定性/最終精度)。例如想找到kernel_size的最優值,只能通過控制變量,對比實驗。
回答4:流程:
找baseline先找一個前人的基礎網絡結構,作為你設計的基礎。可以是resnet,densenet,Alexnet這種非常經典的,且訓練過程已經被大家復現過的。
調訓練超參訓練超參指的是: learning_rate, num_epoch, weight_decay, momentum還有learning_rate的下降方式以及其涉及到的所以超參等等。個人體會是,weight_decay 影響比較大,相對獨立,也調起來也相對容易些,可以先調;learning_rate以及它的下降方法影響也比較大,但是這裡相互關聯的量很多,調起來比較費時費力;還有num_epoch,這個量也比較關鍵,調num_epoch的時候基本都得等到訓練結束看結果,不太好像調其他參數那樣,看情況不好就提前終止。
調結構在當前基礎上找到一組合理的超參之後,就可以把這組超參固定,之後就可以進入到題主所想研究的調整結構了。這裡可以調的東西很多,對於初學者來說,如果想了解網絡中的每一層對結構的作用,其實可以逐層修改網絡的結構。從而體會不同的layer_type和kernel_size等的影響。
再調訓練超參因為其實不同的網絡結構對應的最優訓練超參不是一樣的。這一套流程走下來,就算是對於訓練參數量在在10M以下的模型,CIFAR10分類來說,也需要很多卡很多天啦。所以設計網絡結構還真是一件非常費事費力的事情。
如何設計CNN網絡架構資料匯總
在inception和resnet網絡提出並相對完善以後,網絡結構的設計就不再爆發式出現了,這兩大類網路涵蓋了大部分應用的卷積網絡結構。
!很有用——基於CNN的圖形分類綜合設計指南
對於大多數應用來說,應該使用遷移學習而不是從頭訓練網絡。但是,你需要抉擇保留哪些網絡層,以及重新訓練哪些層。這取決於你的數據是什麼樣的。你的數據與預訓練的網絡(通常在ImageNet上預訓練)的數據越相似,你應該重新訓練的層數越少,反之亦然。例如,你想分類圖片中是否包含葡萄,所以你有一堆有葡萄的和一堆沒有的圖像。這些圖像與ImageNet中的圖像非常相似,因此你只需重新訓練最後幾層,也許就是全連接層。然而,如果你想對拍攝於外太空的圖片,分類是否包含行星,那麼這樣的數據與ImageNet的數據有很大不同,所以你需要重新訓練低層的卷積層。簡而言之,遵循以下規則:
如何設計卷積神經網絡1如何設計卷積神經網絡?怎樣設計最優的卷積神經網絡內容總結:
1.提升CNN表現的操作:增加圖片解析度,增加網絡寬度,增加網絡深度,增加跳過連接(密集塊或殘差塊)
2.NAS神經架構搜索+隨機連接神經網絡:探索新的網絡架構和神經元連接方式(這個太遠了不需要做)
改進CNN的14個設計模式
1.泛化能力:是很重要的一個模型評價標準。提升泛化能力:使用正則化手段例如dropout。
2.summation ,下採樣,maxout+ELUS,freeze-drop-path,循環學習率,bootstrapping
設計CNN
part one 網絡深度的設計:網絡深度增加作用:非線性表達能力提升。
1.評估深度對模型性能的影響:層數越多線性區間越多,更好地擬合。實驗表明,錯誤率降低。
2.如何選擇網絡深度?根據一些工業界相關工作者的經驗:從5——8層開始試驗。imagenet 比賽中,2^5*7=224。一般不超過10層就能滿足工業界的一些要求。
3.深度實驗:一個複雜數據集vs一個簡單數據集,20分類。一個性能簡單的網絡vs一個高性能網絡。
網絡1:ALLCONV網絡 5-7層conv+1層全連接
網絡2:MobileNet10-16層
圖中看出增加卷積層(從5到7個卷積層)會提升準確率,但是7層再增加就出現了瓶頸。
MobileNet出現差不多的結果,從10層增加到16層時出現瓶頸。
4.網絡深度增加帶來的問題:過擬合,難以優化,PLD,PLS等。解決方案:跳層連接等。
part two 網絡寬度的設計:網絡寬度指的是每層卷積中濾波器filters(卷積核)的數量,例如VGG16網絡第一層的filter數量就是64個,第一個卷積層的網絡寬度就是64 ,第三個就是128,第五個就是256…為什麼會增加卷積核的個數:「隨著網絡的加深,feathermap的長寬尺寸會變小,也就是卷積提取的特徵越具有代表性,所以後面的卷積層數需要增加,所以卷積核的個數也是要增加的,一般是成倍增加(有的會更根據實驗的情況來具體設置)。」
1.網絡寬度下降,性能會下降。更多的通道數可以學到更多的特徵。所以要適當增加模型寬度。加寬比加深更能提升性能。但計算量提升也很快。
2.如何初始化CNN網絡寬度?答:高效率模型第一層寬度為32足夠。(根據經典網絡結構和工作經驗得出的結論)
3.優化:1*1卷積,分組卷積,跨層連接。
part three 提升模型泛化能力:正則化技術——DROPOUT and BN層的設計
1.類似技術:dropconnect,maxout,stochastic pooling
2.訓練開dropout,預測時關閉?:不一定要關,大部分時候關掉可以提升準確率。
3.dropout 相當於增加了噪聲,造成梯度的損失,訓練時間更久才能收斂。要採用更大的學習率和momentum ,加快收斂。