計算機視覺注意力網絡(四)——GSoP-Net [CVPR 2019]

Paper: Global Second-Order Pooling Convolutional Networks
Code:GitHub - ZilinGao/Global-Second-order-Pooling-Convolutional-Networks: Global Second-order Pooling Convolutional Networks (cvpr2019 GSoP)
在這裏插入圖片描述
給定一個輸入張量,降維後,GSoP塊先進行協方差矩陣計算,然後進行線性卷積和非線性激活的兩個連續運算,得到輸出張量,輸出張量沿通道維數對原始輸入進行縮放,一定程度上也是一種通道注意力的體現,但與SEnet不同的是該模塊提出了2維平均池化,通過協方差的形式體現了通道與通道之間的關係。
與SEnet中的一階注意力機制最大的區別爲這裏統計了協方差矩陣,再進行pooling。

論文主要貢獻有三方面

  1. 與現有的只能利用網絡端二階統計量的方法不同,最早將該模型引入到中間層,以便在深度卷積網早期利用整體圖像信息的人。通過對整體張量之間的相關性建模,所提出的塊可以捕獲長期統計相關性[35],充分利用圖像中的上下文信息。
  2. 設計了一個簡單有效的GSoP塊,模塊化程度高,內存低,計算複雜度低。GSoP塊能夠沿着通道維度或位置維度捕獲全局二階統計信息,可以方便地插入到現有的網絡架構中,在較小的開銷下進一步提高其性能。
  3. 在ImageNet基準測試上,我們對所提出的網絡進行了深入的燒蝕研究,分析了所提出的GSoP塊的特性和行爲。與其他競爭對手的廣泛比較顯示,我們的網絡具有競爭力。

GAvP一階間網絡。
在網絡[25]末端插入的全局平均池,它彙總了一階統計信息(即作爲圖像表示,廣泛應用於ResNet[11]、Inception[31]和DenseNet[17]等深卷積網絡中。第一次,SE-Net[15]引入了GAvP中間網絡,在早期階段利用整體圖像上下文,報告明顯改善了其網絡端對應。SE-Net由兩個模塊組成:壓縮模塊完成全局平均池化,然後卷積和非線性激活以捕獲信道依賴性;激勵模塊縮放通道用於數據重校。CBAM[38]除了沿信道維度的GAvP外,還擴展了SE-Net的思想,將沿信道維度的GAvP與空間維度相結合,實現自關注。與只使用整體圖像的一階統計量(平均值)的SE-Net和CBAM相比,我們的GSoPNet利用了二階統計量(相關性)網絡具有更好的適用性。
GSoP(二階)網絡
在網絡端插入、可端到端訓練的全局二級池技術受到了極大的關注,其性能得到了顯著提高[3,23,22]。一些研究人員[7,3,1]已經證明了高階池與內核機之間的密切聯繫,他們基於此提出了顯式映射函數作爲協方差表示緊性的核逼近。Wang等人[34]提出了一種全局高斯分佈嵌入網絡(G2DeNet),其中在網絡端插入一個多元高斯,識別爲協方差矩陣和均值向量[21]的對稱正定矩陣。莫奈[39]提出了一個子矩陣方根層,使G2DeNet具有緊湊的表示。在[4]中,一階信息與二階信息相結合,在紋理識別方面取得了比標準雙線性網絡一致的改進。在上述工作中,二階建模只在深度網絡的末端進行了開發。

在這裏插入圖片描述

如上圖所示,通過GSop模塊的不同位置,作者提供了兩個模型稱爲GSopNet1和GSopNet2。GSopNet2中還涉及到修改和推進(平方根和帶參數)涉及到一些統計和線代上的知識。
我們在圖1a中演示了提議的GSoP-Net。注意,我們設計的二級池塊可以方便地插入到任何卷積層之後。通過在中間層中引入該塊,可以在早期對整體圖像進行高階統計建模,增強了深卷積網的非線性建模能力。在實踐中,我們構建了兩個網絡架構。通過GSoP塊在網絡之間和網絡末端,我們也可以使用GSoP塊,然後是公共的全局平均池,產生的平均向量作爲緊湊的圖像表示,我們稱之爲GSoPNet1。在網絡末端,我們也可以採用矩陣功率歸一化協方差矩陣來表示圖像[23],
在這裏插入圖片描述

GSoP-Net的實現代碼如下:

# https://github.com/ZilinGao/Global-Second-order-Pooling-Convolutional-Networks/blob/master/torchvision/models/resnet.py
# init
if GSoP_mode == 1:
    self.avgpool = nn.AvgPool2d(14, stride=1)
    self.fc = nn.Linear(512 * block.expansion, num_classes)
    print("GSoP-Net1 generating...")
else :
    self.isqrt_dim = 256
    self.layer_reduce = nn.Conv2d(512 * block.expansion, self.isqrt_dim, kernel_size=1, stride=1, padding=0, bias=False)
    self.layer_reduce_bn = nn.BatchNorm2d(self.isqrt_dim)
    self.layer_reduce_relu = nn.ReLU(inplace=True)
    self.fc = nn.Linear(int(self.isqrt_dim * (self.isqrt_dim + 1) / 2), num_classes)
    print("GSoP-Net2 generating...")

# forward
if self.GSoP_mode == 1:
    x = self.avgpool(x)
else :
    x = self.layer_reduce(x)
    x = self.layer_reduce_bn(x)
    x = self.layer_reduce_relu(x)

    x = MPNCOV.CovpoolLayer(x)
    x = MPNCOV.SqrtmLayer(x, 3)
    x = MPNCOV.TriuvecLayer(x)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章