SKNet(Selective Kernel Network)是一種用于圖像分類和目標(biāo)檢測(cè)任務(wù)的深度神經(jīng)網(wǎng)絡(luò)架構(gòu),其核心創(chuàng)新是引入了選擇性的多尺度卷積核(Selective Kernel)以及一種新穎的注意力機(jī)制,從而在不增加網(wǎng)絡(luò)復(fù)雜性的情況下提升了特征提取的能力。SKNet的設(shè)計(jì)旨在解決多尺度信息融合的問(wèn)題,使網(wǎng)絡(luò)能夠適應(yīng)不同尺度的特征。
1. 核心思想
SKNet的核心思想是**通過(guò)選擇性地應(yīng)用不同尺度的卷積核,從而在不同層級(jí)上捕捉多尺度特征。**為了實(shí)現(xiàn)這一點(diǎn),SKNet引入了一個(gè)選擇模塊,用于自適應(yīng)地決定在每個(gè)通道上使用哪些尺度的卷積核。這種選擇性的多尺度卷積核有助于提升特征表示的能力,使網(wǎng)絡(luò)更具適應(yīng)性和泛化能力。
2. 結(jié)構(gòu)
SKNet的結(jié)構(gòu)如下:
實(shí)現(xiàn)機(jī)制:
-
split:對(duì)特征圖進(jìn)行多分支分離卷積,各分支使用不同的卷積核(感受野不同)進(jìn)行特征提取。(并未對(duì)原始特征圖進(jìn)行拆解分離,只是使用不同的卷積核對(duì)原始特征圖進(jìn)行卷積操作)。假設(shè)分支為n,則特征圖維度變換為 (c, h, w) -> (n, c, h, w),原文中n=2。
-
Fuse:將多個(gè)分支的特征圖提取結(jié)果相加。特征圖維度變換為 (n, c, h, w) -> (c, h, w)。再通過(guò)全局平均池,特征圖維度變換為 (c, h, w) -> (c, 1, 1),然后利用全連接層進(jìn)行降維(限制了最低維度,通過(guò)全連接層生成d×1的向量(圖中的z),公式如圖中所示(δ表示ReLU激活函數(shù),B表示Batch Noramlization,W是一個(gè)d×C的維的)。d的取值是由公式d = max(C/r,L)確定,r是一個(gè)縮小的比率(與SENet中相似),L表示d的最小值,原文實(shí)驗(yàn)中L的值為32。),再利用兩個(gè)(或多個(gè),和分支數(shù)目相同,原論文中為兩個(gè))全連接層進(jìn)行升維,得到兩個(gè)(多個(gè))維度同降維前相同的特征圖(向量)。在對(duì)兩個(gè)特征向量進(jìn)行softmax處理。假設(shè)分支為n,則特征圖維度為 n個(gè)(c, 1, 1) ,原文中n=2,即a->(c, 1, 1), b->(c, 1, 1)。
-
select:利用softmax處理后的多個(gè)特征向量分別乘以第一步中的多分支提取的特征圖結(jié)果。特征維度變化為n個(gè)(c, 1 ,1) * n 個(gè)(c, h ,w) = (n, c, h, w)。最后將n個(gè)特征圖進(jìn)行相加。
3. 優(yōu)勢(shì)
SKNet的設(shè)計(jì)在以下幾個(gè)方面具有優(yōu)勢(shì):
- 多尺度信息融合
通過(guò)選擇性地應(yīng)用不同尺度的卷積核,SKNet能夠有效地融合多尺度的特征信息。這有助于網(wǎng)絡(luò)捕捉不同層次的視覺(jué)特征,提高了特征的表征能力。
- 自適應(yīng)性
選擇模塊使網(wǎng)絡(luò)能夠自適應(yīng)地選擇卷積核的尺度,從而適應(yīng)不同任務(wù)和圖像的特點(diǎn)。這種自適應(yīng)性能夠使網(wǎng)絡(luò)在各種場(chǎng)景下都能表現(xiàn)出色。
- 減少計(jì)算成本
盡管引入了多尺度卷積核,但由于選擇模塊的存在,SKNet只會(huì)選擇一部分卷積核進(jìn)行計(jì)算,從而減少了計(jì)算成本,保持了網(wǎng)絡(luò)的高效性。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-636506.html
4.代碼實(shí)現(xiàn)
class SKNet(nn.Module):
def __init__(self, in_channels, out_channels, stride=1, M=2, r=16, L=32):
"""
:param in_channels: 輸入通道維度
:param out_channels: 輸出通道維度 原論文中 輸入輸出通道維度相同
:param stride: 步長(zhǎng),默認(rèn)為1
:param M: 分支數(shù)
:param r: 特征Z的長(zhǎng)度,計(jì)算其維度d 時(shí)所需的比率(論文中 特征S->Z 是降維,故需要規(guī)定 降維的下界)
:param L: 論文中規(guī)定特征Z的下界,默認(rèn)為32
采用分組卷積: groups = 32,所以輸入channel的數(shù)值必須是group的整數(shù)倍
"""
super(SKNet, self).__init__()
d = max(in_channels // r, L)
self.M = M
self.out_channels = out_channels
self.conv = nn.ModuleList()
for i in range(M):
self.conv.append(nn.Sequential(
nn.Conv2d(in_channels, out_channels, 3, stride, padding=1 + i, dilation=1 + i, groups=32, bias=False),
nn.BatchNorm2d(out_channels),
nn.ReLU(inplace=True)))
self.global_pool = nn.AdaptiveAvgPool2d(output_size=1)
self.fc1 = nn.Sequential(nn.Conv2d(out_channels, d, 1, bias=False),
nn.BatchNorm2d(d),
nn.ReLU(inplace=True)) # 降維
self.fc2 = nn.Conv2d(d, out_channels * M, 1, 1, bias=False)
self.softmax = nn.Softmax(dim=1)
def forward(self, input):
batch_size = input.size(0)
output = []
for i, conv in enumerate(self.conv):
output.append(conv(input))
U = reduce(lambda x, y: x + y, output)
s = self.global_pool(U)
z = self.fc1(s)
a_b = self.fc2(z)
a_b = a_b.reshape(batch_size, self.M, self.out_channels, -1)
a_b = self.softmax(a_b)
a_b = list(a_b.chunk(self.M, dim=1))
a_b = list(map(lambda x: x.reshape(batch_size, self.out_channels, 1, 1),
a_b))
V = list(map(lambda x, y: x * y, output,
a_b))
V = reduce(lambda x, y: x + y,
V)
return V
總結(jié)
SKNet是一種創(chuàng)新的深度神經(jīng)網(wǎng)絡(luò)架構(gòu),通過(guò)引入選擇性的多尺度卷積核和注意力機(jī)制,提升了特征提取的能力。其核心結(jié)構(gòu)包括選擇模塊和SK卷積層,能夠有效地融合多尺度信息、自適應(yīng)地調(diào)整卷積核的尺度,并減少計(jì)算成本。這使得SKNet在圖像分類和目標(biāo)檢測(cè)等任務(wù)中取得了優(yōu)越的性能。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-636506.html
到了這里,關(guān)于【深度學(xué)習(xí)注意力機(jī)制系列】—— SKNet注意力機(jī)制(附pytorch實(shí)現(xiàn))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!