在之前的文章中,我曾經詳細的分析過DenseNet。隨着時間的推移,越來越多的人開始關注DenseNet並且把它應用到實際的項目中(我從百度搜索的統計上得到這個結論 😃)。所以我決定也在應用這方面寫一點。
當前卷積網絡使用最廣泛的兩種結構是ResNet和Inception,當然還有各種衍生系列以及它倆的合體Inception-Resnet。從結構特點上,它們都是某個小結構的組合,包括DenseNet也是這樣,這也符合一般的規律。但是ResNet和DenseNet有一點顯著的不同,那就是Residual Block比Dense Block要小得多。這個不同使Residual Block更容易靈活的拼接組合到各種不同的網絡裏,不見得一定要使用整個ResNet101或者ResNet152什麼的,單獨用幾個Residual Block也能見效,比如CycleGAN風格的生成器就使用了這種結構。Inception塊比殘差塊要大一些,但是作爲一個單獨的模塊使用也沒什麼問題。
而Dense Block就不一樣了,由於Dense的結構,每一層的Channel都不能太多,所以只能使用比較多的層數,典型的一個block要12層。根據我的試驗,縮減層數(爲保持平衡而)適當增加每層Channel的Dense Block效果很差,基本沒有使用價值。這也是DenseNet用的不如ResNet廣泛的一個原因。
這篇文章就是寫這一點 😃