隨著cnn在手機終端部署的越來越多,很多研究人員在研究如何降低神經網路的計算量。同時,大家都觀察到乙個現象,feature map 中的冗餘是 cnn 的重要特點。
下圖是 resnet50 中的 feature map,可以看到很多的 feature map 是很相似的,比如圖中標出的紅、綠、藍三組,這也說明 feature map 中存在較多的冗餘。下面分析下相關的三個工作:
華為在 cvpr 2020 發表的 ghostnet (**:沒有去除冗餘特徵,而是採用一種比傳統卷積更輕量化的方法來生成冗餘特徵。通過「少量傳統卷積計算」+「輕量的冗餘特徵生成器」的方式,既能減少網路的整體計算量,又能保證網路的精度。
作者提出了用於代替傳統卷積層的ghost module。ghost module 如下圖所示,包括兩次卷積:
第一次卷積:假設output中的通道數為 init_channels * ratio,那麼第一次卷積生成 init_channels 個 feature map
第二次卷積:每個 feature map 通過對映生成 ratio-1 個新的 feature map,這樣會生成 init_channels * (ratio-1)個 feature map 。最後,把第一次卷積和第二次卷積得到的 feature map 拼接在一起,得到 output。
**如下所示:
class ghostmodule(nn.module):
def __init__(self, inp, oup, kernel_size=1, ratio=2, dw_size=3, stride=1, relu=true):
super(ghostmodule, self).__init__()
self.oup = oup
init_channels = math.ceil(oup / ratio)
new_channels = init_channels*(ratio-1)
# 第一次卷積:得到通道數為init_channels,是輸出的 1/ratio
self.primary_conv = nn.sequential(
nn.conv2d(inp, init_channels, kernel_size, stride, kernel_size//2, bias=false),
nn.batchnorm2d(init_channels),
nn.relu(inplace=true) if relu else nn.sequential())
# 第二次卷積:注意有個引數groups,為分組卷積
# 每個feature map被卷積成 raito-1 個新的 feature map
self.cheap_operation = nn.sequential(
nn.conv2d(init_channels, new_channels, dw_size, 1, dw_size//2, groups=init_channels, bias=false),
nn.batchnorm2d(new_channels),
nn.relu(inplace=true) if relu else nn.sequential(),
)def forward(self, x):
x1 = self.primary_conv(x)
x2 = self.cheap_operation(x1)
# 第一次卷積得到的 feature map,被作為 identity
# 和第二次卷積的結果拼接在一起
out = torch.cat([x1,x2], dim=1)
return out[:,:self.oup,:,:]
在實際應用中,作者構建了 ghost bottleneck,如下圖所示。其中包含2個ghost module,第1個ghost module用於擴充特徵的通道數,第2個ghost module用於減少特徵的通道數。
這是一篇 ijcai 2020 的**,在這個**中,作者認為,卷積得到的 feature map 存在大量的冗餘資訊。因此,可以選擇一些有代表性的 feature map 表達目標的本徵特徵,剩餘的只需要補充一些細節資訊。
作者提出了乙個 spconv 的模組,用來降低常規卷積中的冗餘資訊。在該模組中,所有的輸入通道按比例α分為兩部分:representative部分用 k x k 的卷積提取重要資訊;redundant部分用 1x1 的卷積補充細節資訊。如下圖所示:
作者還認為,representative 部分仍可能存在冗餘,因此,可以進一步拆分。因此,作者使用使用group-wise和point-wise卷積分別處理,再將結果融合。
對於得到的上下兩個分支的特徵,使用了類似 sknet 的處理方式進行融合(這裡是比較熟悉的 self-attention),得到最終的輸出特徵。
這篇**是berkeley 的 xudong wang 博士20年9月放在 arxiv 上的**。作者同樣指出,在卷積當中, feature map 的冗餘比較高。作者提出了 tied block convolution (tbc)。
tbc 和 group conv 比較像,首先回顧一下 group conv :如果輸入 feature map 的通道數是 \(c_i\),輸出的 feature map 通道數是 \(c_o\),卷積核大小為 \(k\times k\) ,分為 \(g\) 組做卷積,那麼參數量為:\(c_i\times c_o \times k \times k / g\)。
tbc 通過在不同組間重用 kernel 來減少濾波器的有效數量。直觀來說,tbc 把特徵為 \(b\) 組做卷積,但是這 \(b\) 組的 kernel 是完全相同的 ( group conv 裡,各組的 kernel 是不同的)。這樣,tbc 的參數量就是 \(c_i \times c_o \times k\times k / (b\times b)\) 。參數量進一步降低了。
作者認為 tbc 與 group conv 相比有三個優勢:1、引數降低了; 2、更加容易在gpu 上並行; 3、每一組 filter 都應用於所有輸入通道,可以更好的建模跨通道的依賴關係。
目前能想到的有這三個工作,再有類似的,隨時想到再繼續補充。
卷積層特徵視覺化
import torch import numpy as np from torchvision import datasets import torchvision.transforms as transforms set the parameters num workers 0batch siz...
Caffe中卷積層的實現
出處 將尺寸為k k的卷積核在某個位置對應的feature map區域表示為k k的一維向量 將feature map各個通道對應的向量之間,串聯起來 那麼尺寸k k的卷積核在某個位置對應的各個通道的feature map,組合起來就是長度為c k k的一維向量。當卷積核對應到新的位置上,又得到新的...
神經網路中的卷積層
卷積層是卷積神經網路中的基礎操作,甚至在網路最後起分類作用的全連線層在工程實現時也是由卷積操作替代的。卷積運算實際上是分析數學的一種運算方式,在卷積神經網路中通常僅涉及離散卷積的情形。下面以輸入影象為5 x 5矩陣,其對應的卷積核 亦稱卷積引數,convolution kernel或convolut...