最近關注了下大模型,整理一下,備忘。
1. ResNet,原始caffe版本,結構如下:
InsightFace對Resnet的實現有點不同,首先是默認會把第一個7x7的卷積換成3x3,並去掉pool操作(人臉識別輸入分辨率112x112比ImageNet小),另外當層數大於101時才使用先1x1再3x3再1x1的bottleneck結構,resnet50里面還是2個3x3卷積,這樣簡單看的話,同樣是50層的resnet,Insightface的版本相當於用16個3x3卷積換之前的1x1,參數量是變多的。后來看ZhaoJ實現的pytorch版本才注意到這個差別,具體如下:
在ZhaoJ代碼里這個結構名字是IR-SE,SE好理解,就是加了Squeeze and Exciation Block,起初以為是基於Inception-Resnet backbone,仔細分析其實是每個bottleneck里的差距,所以IR是指Insightface-Resnet或者是Improved Resnet?
2. ResNeXt,原始版本貌似是lua的,框架不變,修改bottleneck內部,論文切圖:
就是把ResNet拆成多個組卷積,論文認為像VGG、ResNet這種簡單卷積模塊的堆疊除了設計/實現簡單方便之外,還可以減少對某一特定數據集過擬合的問題;而inception這種復雜的手工設計更容易在有限的計算量下達到更高的准確率,於是將ResNet里bottleneck中的3x3卷積改為分組卷積,以兼收兩者之長。
3. DenseNet,特點是把ResNet里的特征圖對應通道相加改成通道拼接,這會導致網絡越來約寬,因此每個DenseBlock之間插一個TransitionBlock(1x1卷積)做降維,torchvision有模型,Insightface里也有實現:
展開來大概長這樣:
4. DPN,Dual Path Network,雙路指的是Resnet+Desenet,參考Insightface模型描述:
覺得可以理解成利用ResNet和DenseNet的結構相似性,讓兩者共用中間的3組卷積。原文還將ResneXt里的分組卷積應用到其中的3x3上,買一得三。。。
5. SENet,原始實現在這里,是caffe的,所以論文里的圖合並時直接用的scale,是一個可以定制化地嵌入到各種網絡中的小模塊,Squeeze and Exciation Block。主要是想彌補卷積神經網絡感受野比較小的話會太過關注局部信息的問題,Sequeeze部分將每個特征圖進行全局池化,Excitiation部分引入非線性,操作就是獲得每個通道的權重乘回去,結構就如原文所畫,展開來大概像這樣:
看論文里的圖總有種錯覺以為SE Block和bottleneck是並聯的,但其實是串聯的,bottleneck結構沒有變,SE Block可以靈活地插在它的前面或后面。
DenseNet占顯存已經被大家詬病很久了,關於速度這里說得比較詳細,直接偷圖了,侵刪。確實加了SE以后訓練速度會降,但是之前用caffe,端上的模型mergeBN只能帶來比較小的收益,加速沒有很明顯。
其他參考:
卷積網絡的進化史 大概參考下就好,不可深究....