[Deep Learning Attention Mechanism Series] – SKNet Attention Mechanism (mit Pytorch-Implementierung)

SKNet (Selective Kernel Network) ist eine tiefe neuronale Netzwerkarchitektur für Bildklassifizierungs- und Zielerkennungsaufgaben. Seine Kerninnovation ist die Einführung eines selektiven Multiskalen-Faltungskerns (Selective Kernel) und eines neuartigen Aufmerksamkeitsmechanismus . Daher die Funktionsfähigkeit Die Extraktion wird verbessert, ohne die Komplexität des Netzwerks zu erhöhen. SKNet wurde entwickelt, um das Problem der Informationsfusion auf mehreren Skalen zu lösen und es dem Netzwerk zu ermöglichen, sich an Merkmale unterschiedlicher Skalen anzupassen.

1. Kernidee

Die Kernidee von SKNet besteht darin, Multiskalenmerkmale auf verschiedenen Ebenen durch selektive Anwendung von Faltungskernen unterschiedlicher Skalen zu erfassen. **Um dies zu erreichen, führt SKNet ein Auswahlmodul ein, um adaptiv zu entscheiden, welche Skalen von Faltungskernen auf jedem Kanal verwendet werden sollen. Dieser selektive Faltungskern mit mehreren Maßstäben trägt dazu bei, die Fähigkeit zur Merkmalsdarstellung zu verbessern und das Netzwerk anpassungsfähiger und generalisierbarer zu machen.

2. Struktur

Die Struktur von SKNet ist wie folgt:

Fügen Sie hier eine Bildbeschreibung ein

Implementierungsmechanismus:

  • Split : Auf der Feature-Map wird eine Trennungsfaltung mit mehreren Zweigen durchgeführt, und jeder Zweig verwendet unterschiedliche Faltungskerne (unterschiedliche Empfangsfelder) zur Merkmalsextraktion. (Die ursprüngliche Feature-Map wird nicht zerlegt und getrennt, sondern die ursprüngliche Feature-Map wird unter Verwendung verschiedener Faltungskerne gefaltet.) Unter der Annahme, dass der Zweig n ist, lautet die Dimensionstransformation der Feature-Map (c, h, w) -> (n, c, h, w), n = 2 im Originaltext.

  • Sicherung : Fügen Sie die Ergebnisse der Feature-Map-Extraktion mehrerer Zweige hinzu. Die Feature-Map-Dimension wird in (n, c, h, w) -> (c, h, w) umgewandelt. Anschließend wird durch den globalen Durchschnittspool die Dimension der Feature-Map in (c, h, w) -> (c, 1, 1) umgewandelt und dann die vollständig verbundene Ebene verwendet, um die Dimension zu reduzieren (die niedrigste Dimension ist begrenzt). , und d×1 wird durch den Vektor der vollständig verbundenen Schicht (z in der Abbildung) erzeugt, die Formel ist in der Abbildung dargestellt (δ stellt die ReLU-Aktivierungsfunktion dar, B stellt die Batch-Noramlisierung dar, W ist eine d×C-Dimension). Der Wert von d wird durch die Formel d = max(C /r, L) bestimmt, r ist ein reduziertes Verhältnis (ähnlich SENet), L stellt den Minimalwert von d dar, der Wert von L im ursprünglichen Experiment beträgt 32. ) und verwenden Sie dann zwei (oder mehr) und die Anzahl der Zweige. Auf die gleiche Weise werden im Originalpapier zwei) vollständig verbundene Ebenen verwendet, um die Dimension zu erhöhen, und zwei (mehrere) Dimensionen werden mit derselben Feature-Map erhalten (Vektor) wie vor der Dimensionsreduktion. Führen Sie eine Softmax-Verarbeitung für die beiden Merkmalsvektoren durch. Unter der Annahme, dass der Zweig n ist, beträgt die Dimension der Feature-Map n (c, 1, 1). Im Originaltext ist n = 2, also a->(c, 1, 1), b->( c, 1, 1).

  • select : Mehrere Feature-Vektoren nach der Softmax-Verarbeitung werden im ersten Schritt mit den Feature-Map-Ergebnissen der Multi-Branch-Extraktion multipliziert. Die Merkmalsdimension ändert sich zu n (c, 1,1) * n (c, h, w) = (n, c, h, w). Abschließend werden die n Feature-Maps hinzugefügt.

3. Vorteile

Das Design von SKNet bietet in folgenden Aspekten Vorteile:

  • Multiskalige Informationsfusion

Durch die selektive Anwendung von Faltungskernen verschiedener Maßstäbe kann SKNet die Merkmalsinformationen mehrerer Maßstäbe effektiv zusammenführen. Dies hilft dem Netzwerk, visuelle Merkmale auf verschiedenen Ebenen zu erfassen und verbessert die Darstellungsfähigkeit von Merkmalen.

  • adaptiv

Das Auswahlmodul ermöglicht es dem Netzwerk, den Maßstab des Faltungskerns adaptiv auszuwählen, um ihn an die Eigenschaften verschiedener Aufgaben und Bilder anzupassen. Diese Anpassungsfähigkeit ermöglicht es dem Netzwerk, in verschiedenen Szenarien eine gute Leistung zu erbringen.

  • Rechenaufwand reduzieren

Obwohl der Multi-Scale-Faltungskern eingeführt wird, wählt SKNet aufgrund des Vorhandenseins des Auswahlmoduls nur einen Teil des Faltungskerns für die Berechnung aus, wodurch die Berechnungskosten gesenkt und die Effizienz des Netzwerks aufrechterhalten werden.

4. Code-Implementierung

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:  步长,默认为1
        :param M:  分支数
        :param r: 特征Z的长度,计算其维度d 时所需的比率(论文中 特征S->Z 是降维,故需要规定 降维的下界)
        :param L:  论文中规定特征Z的下界,默认为32
        采用分组卷积: groups = 32,所以输入channel的数值必须是group的整数倍
        """
        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

Zusammenfassen

SKNet ist eine innovative tiefe neuronale Netzwerkarchitektur, die die Funktionen zur Merkmalsextraktion durch die Einführung selektiver Multiskalen-Faltungskerne und Aufmerksamkeitsmechanismen verbessert. Seine Kernstruktur umfasst ein Auswahlmodul und eine SK-Faltungsschicht, die Multiskaleninformationen effektiv zusammenführen, die Skalierung des Faltungskerns adaptiv anpassen und die Rechenkosten senken können. Dadurch kann SKNet eine überlegene Leistung bei Aufgaben wie der Bildklassifizierung und Objekterkennung erzielen.

おすすめ

転載: blog.csdn.net/qq_43456016/article/details/132185778