国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

SE、CBAM、ECA注意力機(jī)制(網(wǎng)絡(luò)結(jié)構(gòu)詳解+詳細(xì)注釋代碼+核心思想講解+注意力機(jī)制優(yōu)化神經(jīng)網(wǎng)絡(luò)方法)——pytorch實(shí)現(xiàn)

這篇具有很好參考價(jià)值的文章主要介紹了SE、CBAM、ECA注意力機(jī)制(網(wǎng)絡(luò)結(jié)構(gòu)詳解+詳細(xì)注釋代碼+核心思想講解+注意力機(jī)制優(yōu)化神經(jīng)網(wǎng)絡(luò)方法)——pytorch實(shí)現(xiàn)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

? ? ? ?這期博客我們來(lái)學(xué)習(xí)一下神秘已久的注意力機(jī)制,剛開(kāi)始接觸注意力機(jī)制的時(shí)候,感覺(jué)很有意思,事實(shí)上學(xué)會(huì)之后會(huì)發(fā)現(xiàn)比想象中的要簡(jiǎn)單,復(fù)雜的注意力機(jī)制后續(xù)會(huì)講解,這期博客先講解最常見(jiàn)的三種SE、CBAM、ECA注意力機(jī)制。

? ? ? ?注意力機(jī)制更詳細(xì)的可以被稱(chēng)為資源分配機(jī)制,神經(jīng)網(wǎng)絡(luò)的計(jì)算能力是有限的,因?yàn)槲覀優(yōu)榱嗽谟邢薜馁Y源下提高神經(jīng)網(wǎng)絡(luò)的準(zhǔn)確性,因此我們要對(duì)識(shí)別對(duì)象的重要特征,增加更多的資源(在神經(jīng)網(wǎng)絡(luò)中叫做權(quán)重)用來(lái)提高識(shí)別的準(zhǔn)確率。卷積神經(jīng)網(wǎng)絡(luò)特征的提取,越來(lái)越成為大家研究的重點(diǎn),由于卷積神經(jīng)網(wǎng)絡(luò)提取特征時(shí)對(duì)于每部分特征的提取都是相同權(quán)重,并不能專(zhuān)注于有效特征的提取,反而提取了很多無(wú)用的特征,增大運(yùn)算量,因此跟人類(lèi)相似的注意力機(jī)制(專(zhuān)注有效特征提取的方式)得到了發(fā)展。注意力機(jī)制思想的引入主要在于使得卷積神經(jīng)網(wǎng)絡(luò)提取有效的特征,刪掉無(wú)用的特征。事實(shí)上卷積神經(jīng)網(wǎng)絡(luò)并不能算是人工智能,我用一個(gè)簡(jiǎn)單的例子來(lái)形容就是:假如我們要識(shí)別一個(gè)人,卷積神經(jīng)網(wǎng)絡(luò)更像是一個(gè)掃描儀,對(duì)著當(dāng)前的圖像進(jìn)行掃描,根據(jù)胳膊,腿,身材等部分綜合判斷(每部分占的權(quán)重一樣),然后得出結(jié)論這是我們要識(shí)別的那個(gè)人,但是真正的人我們?cè)诂F(xiàn)實(shí)生活中識(shí)別人的時(shí)候往往是這個(gè)人的臉是占更大權(quán)重的,比如說(shuō)一個(gè)人他瘦了好多,我們也能認(rèn)出來(lái)他,因?yàn)橹灰麤](méi)整容,他的臉對(duì)于我們對(duì)他的身份進(jìn)行識(shí)別就占決定性作用。因此在我們對(duì)人進(jìn)行識(shí)別的過(guò)程中,我們需要更在意他的臉,身材等其他部分占的權(quán)重非常少,這就是注意力機(jī)制的思想。注意力機(jī)制極大的提高了人處理圖像的效率,準(zhǔn)確性和速度,深度學(xué)習(xí)的注意力機(jī)制跟人類(lèi)的注意力機(jī)制類(lèi)似,或者說(shuō)深度學(xué)習(xí)中注意力機(jī)制的發(fā)展就是借鑒了人類(lèi)注意力機(jī)制的思想。

? ? ? ?大家對(duì)注意力機(jī)制的理解可能存在某種誤解,其實(shí)這東西很簡(jiǎn)單,不管是哪類(lèi)注意力機(jī)制,都類(lèi)似一個(gè)插件,可以各類(lèi)卷積神經(jīng)網(wǎng)絡(luò)或者目標(biāo)檢測(cè)網(wǎng)絡(luò)中對(duì)網(wǎng)絡(luò)進(jìn)行優(yōu)化,使網(wǎng)絡(luò)關(guān)注到更重要的特征,類(lèi)似SENET是從通道領(lǐng)域關(guān)注到通道類(lèi)特征,類(lèi)似CBAM,從通道和空間領(lǐng)域?qū)χ匾卣鬟M(jìn)行優(yōu)化等等,東西很簡(jiǎn)單,就放到卷積神經(jīng)網(wǎng)絡(luò)的卷積層之后就行了,當(dāng)然你也可以放到更有意思的地方,根據(jù)你對(duì)網(wǎng)絡(luò)改進(jìn)的需要,當(dāng)然我只是想表達(dá)這個(gè)東西不難,很容易的意思。因?yàn)榉胖米⒁饬C(jī)制一般也不會(huì)改變特征的通道數(shù),所以就是個(gè)萬(wàn)能插件,代碼放進(jìn)去就能用??梢圆迦敫黝?lèi)CNN分類(lèi)網(wǎng)絡(luò)和YOLO系列和RCNN系列的算法中進(jìn)行優(yōu)化,是個(gè)簡(jiǎn)單好用的trick。

SE(通道注意力機(jī)制):

論文下載地址:https://arxiv.org/pdf/1709.01507v2.pdf

論文名稱(chēng):Squeeze-and-Excitation Networks,翻譯過(guò)來(lái)是:擠壓和激勵(lì)網(wǎng)絡(luò)

網(wǎng)絡(luò)結(jié)構(gòu)圖如下:

SE、CBAM、ECA注意力機(jī)制(網(wǎng)絡(luò)結(jié)構(gòu)詳解+詳細(xì)注釋代碼+核心思想講解+注意力機(jī)制優(yōu)化神經(jīng)網(wǎng)絡(luò)方法)——pytorch實(shí)現(xiàn)

SE通道注意力機(jī)制的流程:

1、對(duì)輸入的圖像特征進(jìn)行全部平均池化。

2、再將圖像特征經(jīng)過(guò)兩個(gè)全連接層,第二個(gè)全連接層的神經(jīng)元個(gè)數(shù)與輸入特征層相同,這樣也保證了圖像的通道數(shù)不會(huì)改變。

3、最后使用Sigmod函數(shù)將輸出限制到(0-1)之間,然后作為通道注意力機(jī)制產(chǎn)生的權(quán)重,跟原特征圖進(jìn)行相乘,獲取最終的加入注意力機(jī)制的提取后的特征圖。

SENET代碼:

import torch.nn as nn

class SE_block(nn.Module):
    def __init__(self, channel, scaling=16): #scaling為縮放比例,
                                           # 用來(lái)控制兩個(gè)全連接層中間神經(jīng)網(wǎng)絡(luò)神經(jīng)元的個(gè)數(shù),一般設(shè)置為16,具體可以根據(jù)需要微調(diào)
        super(SE_block, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.fc = nn.Sequential(
                nn.Linear(channel, channel // scaling, bias=False),
                nn.ReLU(inplace=True),
                nn.Linear(channel // scaling, channel, bias=False),
                nn.Sigmoid()
        )

    def forward(self, x):
        b, c, _, _ = x.size()
        y = self.avg_pool(x).view(b, c)
        y = self.fc(y).view(b, c, 1, 1)
        return x * y

CBAM(混合注意力機(jī)制)

論文下載鏈接:https://arxiv.org/abs/1807.06521

論文名稱(chēng):CBAM: Convolutional Block Attention Module翻譯過(guò)來(lái)是CBAM卷積塊注意力模塊

CBAM之所以被叫做混合注意力機(jī)制,是因?yàn)橄噍^于SENET通道注意力機(jī)制,他在保留原有通道注意力機(jī)制的基礎(chǔ)上加入了空間注意力機(jī)制,從通道和空間兩個(gè)方面對(duì)網(wǎng)絡(luò)進(jìn)行優(yōu)化,使得優(yōu)化后的網(wǎng)絡(luò)可以從通道和空間兩個(gè)角度獲取更為有效的特征,進(jìn)一步提高模型同時(shí)在通道和空間兩個(gè)角度的特征提取效果,結(jié)構(gòu)圖如下圖所示:

CBAM結(jié)構(gòu)圖

SE、CBAM、ECA注意力機(jī)制(網(wǎng)絡(luò)結(jié)構(gòu)詳解+詳細(xì)注釋代碼+核心思想講解+注意力機(jī)制優(yōu)化神經(jīng)網(wǎng)絡(luò)方法)——pytorch實(shí)現(xiàn)

Channel Attention Module:通道注意力機(jī)制模塊

Spatial Attention Module:空間注意力機(jī)制模塊

? ? ? ?CBAM會(huì)對(duì)輸入的圖像分別進(jìn)行通道注意力機(jī)制和空間注意力機(jī)制的處理,兩個(gè)模塊是串聯(lián)在一起的如上圖所示,輸入的圖像進(jìn)行先經(jīng)過(guò)通道注意力機(jī)制,再通過(guò)空間注意力機(jī)制兩個(gè)處理,最終形成通道權(quán)重,與輸入的圖像相乘,得到最終的圖像特征圖。下面分別介紹通道注意力機(jī)制和空間注意力機(jī)制的結(jié)構(gòu)。

Channel Attention Module:通道注意力機(jī)制模塊

? ? ? ?通道注意力機(jī)制的結(jié)果如上圖所示,他跟SENET這個(gè)通道注意力機(jī)制還有點(diǎn)不一樣,CBAM的通道注意力機(jī)制模塊,首先對(duì)輸入的圖像分別同時(shí)進(jìn)行最大池化和平均池化兩個(gè)處理,然后將最大池化和平均池化的結(jié)果分別輸出共享的全連接層進(jìn)行處理,然后將兩者處理的結(jié)果進(jìn)行疊加,然后使用Sigmoid函數(shù)縮放到(0-1)之間,作為通道注意力機(jī)制權(quán)重,最后與輸入圖像進(jìn)行相乘,獲得最后的圖像特征圖。

Spatial Attention Module:空間注意力機(jī)制模塊?

SE、CBAM、ECA注意力機(jī)制(網(wǎng)絡(luò)結(jié)構(gòu)詳解+詳細(xì)注釋代碼+核心思想講解+注意力機(jī)制優(yōu)化神經(jīng)網(wǎng)絡(luò)方法)——pytorch實(shí)現(xiàn)

? ? ? ?空間注意力機(jī)制的結(jié)構(gòu)如上圖所示,空間注意力機(jī)制對(duì)于輸入的特征圖,進(jìn)行最大池化處理和平均池化處理,然后將兩者處理的結(jié)果在同一維度上進(jìn)行堆疊,再利用一個(gè)1*1的卷積調(diào)整通道數(shù),不改變通道數(shù),最后使用Sigmoid函數(shù)縮放到(0-1)之間,作為通道注意力機(jī)制權(quán)重,最后與輸入圖像進(jìn)行相乘,獲得最后的圖像特征圖。

CBAM代碼:

import torch.nn as nn
import torch

class ChannelAttention(nn.Module): #通道注意力機(jī)制
    def __init__(self, in_planes, scaling=16):#scaling為縮放比例,
                                           # 用來(lái)控制兩個(gè)全連接層中間神經(jīng)網(wǎng)絡(luò)神經(jīng)元的個(gè)數(shù),一般設(shè)置為16,具體可以根據(jù)需要微調(diào)
        super(ChannelAttention, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.max_pool = nn.AdaptiveMaxPool2d(1)

        self.fc1   = nn.Conv2d(in_planes, in_planes // scaling, 1, bias=False)
        self.relu1 = nn.ReLU()
        self.fc2   = nn.Conv2d(in_planes // scaling, in_planes, 1, bias=False)

        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        avg_out = self.fc2(self.relu1(self.fc1(self.avg_pool(x))))
        max_out = self.fc2(self.relu1(self.fc1(self.max_pool(x))))
        out = avg_out + max_out
        out = self.sigmoid(out)
        return out

class SpatialAttention(nn.Module): #空間注意力機(jī)制
    def __init__(self, kernel_size=7):
        super(SpatialAttention, self).__init__()

        assert kernel_size in (3, 7), 'kernel size must be 3 or 7'
        padding = 3 if kernel_size == 7 else 1
        self.conv1 = nn.Conv2d(2, 1, kernel_size, padding=padding, bias=False)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        avg_out = torch.mean(x, dim=1, keepdim=True)
        max_out, _ = torch.max(x, dim=1, keepdim=True)
        x = torch.cat([avg_out, max_out], dim=1)
        x = self.conv1(x)
        x = self.sigmoid(x)
        return x

class CBAM_Attention(nn.Module):
    def __init__(self, channel, scaling=16, kernel_size=7):
        super(CBAM_Attention, self).__init__()
        self.channelattention = ChannelAttention(channel, scaling=scaling)
        self.spatialattention = SpatialAttention(kernel_size=kernel_size)

    def forward(self, x):
        x = x * self.channelattention(x)
        x = x * self.spatialattention(x)
        return x

ECA(通道注意力機(jī)制的改進(jìn)版)

論文下載鏈接:https://arxiv.org/pdf/1910.03151.pdf

論文題目ECA-Net: Efficient Channel Attention for Deep Convolutional Neural Networks

翻譯過(guò)來(lái)ECA Net:有效的通道注意力機(jī)制深度卷積神經(jīng)網(wǎng)絡(luò)

? ? ? ?ECA事實(shí)上是SENET的改進(jìn)版,它去除了原來(lái)SENET中的全連接層,換成了1*1的卷積核進(jìn)行處理,使得模型參數(shù)變小,變得更加輕量級(jí),因?yàn)镋CA的作者認(rèn)為卷積具有良好的跨通道信息捕捉能力,因此捕捉所有通道的信息是沒(méi)必要的,因此取消了全連接層,換成了1*1的卷積。?

SE、CBAM、ECA注意力機(jī)制(網(wǎng)絡(luò)結(jié)構(gòu)詳解+詳細(xì)注釋代碼+核心思想講解+注意力機(jī)制優(yōu)化神經(jīng)網(wǎng)絡(luò)方法)——pytorch實(shí)現(xiàn)

?ECA代碼:

import torch.nn as nn
import math

class ECA_block(nn.Module):
    def __init__(self, channel, b=1, gamma=2):
        super(ECA_block, self).__init__()
        kernel_size = int(abs((math.log(channel, 2) + b) / gamma))
        kernel_size = kernel_size if kernel_size % 2 else kernel_size + 1

        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.conv = nn.Conv1d(1, 1, kernel_size=kernel_size, padding=(kernel_size - 1) // 2, bias=False)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        y = self.avg_pool(x)
        y = self.conv(y.squeeze(-1).transpose(-1, -2)).transpose(-1, -2).unsqueeze(-1)
        y = self.sigmoid(y)
        out = x * y.expand_as(x)
        return out

如何使用注意力機(jī)制優(yōu)化神經(jīng)網(wǎng)絡(luò):

將注意力機(jī)制放在網(wǎng)絡(luò)的卷積層之后即可,

類(lèi)似我之前用來(lái)優(yōu)化Alexnet和Resnet,代碼如下圖所示:

    class alexnet(nn.Module):
        def __init__(self):
            super(alexnet , self).__init__()
            self.model = nn.Sequential(

                nn.Conv2d(3, 48, kernel_size=11, stride=4, padding=2),  # input[3, 120, 120]  output[48, 55, 55]
                SENET(48 , r = 0.5),
                nn.ReLU(inplace=True),
                nn.MaxPool2d(kernel_size=3, stride=2),  # output[48, 27, 27]
                nn.Conv2d(48, 128, kernel_size=5, padding=2),  # output[128, 27, 27]
                SENET(128, r=0.5),
                nn.ReLU(inplace=True),
                nn.MaxPool2d(kernel_size=3, stride=2),  # output[128, 13, 13]
                nn.Conv2d(128, 192, kernel_size=3, padding=1),  # output[192, 13, 13]
                SENET(192, r=0.5),
                nn.ReLU(inplace=True),
                nn.Conv2d(192, 192, kernel_size=3, padding=1),  # output[192, 13, 13]

                SENET(192, r=0.5),

                nn.ReLU(inplace=True),
                nn.Conv2d(192, 128, kernel_size=3, padding=1),  # output[128, 13, 13]
                SENET(128, r=0.5),
                nn.ReLU(inplace=True),
                nn.MaxPool2d(kernel_size=3, stride=2),  # output[128, 6, 6]
                nn.Flatten(),
                nn.Dropout(p=0.5),
                nn.Linear(512, 2048),
                nn.ReLU(inplace=True),
                nn.Dropout(p=0.5),
                nn.Linear(2048, 1024),
                nn.ReLU(inplace=True),
                nn.Linear(1024, 7),

            )
        def forward(self , x):
            x = self.model(x)
            return x

    class SENET(nn.Module):
        def __init__(self, channel, r=0.5):  # channel為輸入的維度, r為全連接層縮放比例->控制中間層個(gè)數(shù)
            super(SENET, self).__init__()
            # 全局均值池化
            self.global_avg_pool = nn.AdaptiveAvgPool2d(1)
            # 全連接層
            self.fc = nn.Sequential(
                nn.Linear(channel, int(channel * r)),  # int(channel * r)取整數(shù)   #通道壓縮
                nn.ReLU(),  # relu激活函數(shù)進(jìn)行激活 ()激勵(lì)
                nn.Linear(int(channel * r), channel),  # 展開(kāi)
                nn.Sigmoid(),  # 折算成0到1之間的權(quán)重
            )

        def forward(self, x):
            # 對(duì)x進(jìn)行分支計(jì)算權(quán)重, 進(jìn)行全局均值池化
            branch = self.global_avg_pool(x)  # 前向傳播先平均池化
            branch = branch.view(branch.size(0), -1)  # 展開(kāi)

            # 全連接層得到權(quán)重
            weight = self.fc(branch)  # 經(jīng)過(guò)全連接得到權(quán)重

            # 將維度為b, c的weight, reshape成b, c, 1, 1 與 輸入x 相乘 即乘以權(quán)重
            hi, wi = weight.shape
            weight = torch.reshape(weight, (hi, wi, 1, 1))

            # 乘積獲得結(jié)果
            scale = weight * x  # weight為權(quán)重 x為輸入的  輸出結(jié)果
            return scale

因?yàn)椴⒉粫?huì)改變通道數(shù),因此不用修改代碼,直接放到卷積層后面就行了,很簡(jiǎn)單,有問(wèn)題朋友歡迎在評(píng)論區(qū)指出,感謝!

SE、CBAM、ECA注意力機(jī)制(網(wǎng)絡(luò)結(jié)構(gòu)詳解+詳細(xì)注釋代碼+核心思想講解+注意力機(jī)制優(yōu)化神經(jīng)網(wǎng)絡(luò)方法)——pytorch實(shí)現(xiàn)

下面給出上述三個(gè)代碼和下載好的論文下載鏈接:

https://pan.baidu.com/s/1aPXJ4O_el-ZxCsZWpQMnbw?
提取碼:fd1i
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-471516.html

到了這里,關(guān)于SE、CBAM、ECA注意力機(jī)制(網(wǎng)絡(luò)結(jié)構(gòu)詳解+詳細(xì)注釋代碼+核心思想講解+注意力機(jī)制優(yōu)化神經(jīng)網(wǎng)絡(luò)方法)——pytorch實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包