SENet-Aufmerksamkeitsmechanismus (Squeeze-and-Excitation Network).

  SENet (Squeeze-and-Excitation Network) ist ein Aufmerksamkeitsmechanismus für Deep Convolutional Neural Networks (CNN), der darauf ausgelegt ist, die Darstellungsfähigkeit des Netzwerks auf Feature-Kanälen zu verbessern. Es verbessert die Darstellung nützlicher Informationen und unterdrückt irrelevante Informationen, indem es die Wichtigkeitsgewichte jedes Kanals lernt und diese Gewichte dann zur Neugewichtung der Feature-Maps verwendet.
Strukturdiagramm des SENet-Aufmerksamkeitsmechanismus
  Im Folgenden sind die Schritte zur detaillierten Einführung des SENet-Aufmerksamkeitsmechanismus aufgeführt:
  1. Squeeze-Stufe (Komprimierung) :
In dieser Stufe wird ein globales Durchschnittspooling für die Eingabe-Feature-Map durchgeführt, um die Kanaldimension zu komprimieren. Angenommen, die Eingabe-Feature-Map ist X, die Form ist (C, H, W), wobei Cdie Anzahl der Kanäle Hund Wdie Höhe bzw. Breite angegeben sind. Das globale Durchschnittspooling führt zu einem (C, 1, 1)Tensor der Größe .
  2. Anregungsphase :
  In dieser Phase wird die Wichtigkeit des Kanals durch ein zweischichtiges, vollständig verbundenes Netzwerk gelernt. Dieses vollständig verbundene Netzwerk besteht aus einer Kompressionsoperation und einer Anregungsoperation.
  a. Komprimierungsvorgang: Geben Sie (C, 1, 1)den im vorherigen Schritt erhaltenen Tensor in eine vollständig verbundene Schicht ein und komprimieren Sie die Anzahl der Kanäle auf einen kleineren Wert, genannt middle_channels.
  b. Anregungsoperation: Geben Sie die komprimierten Merkmale in eine ReLU-Aktivierungsfunktion ein, um einen (middle_channels,)Vektor von zu erhalten.
  3. Neukalibrierungsphase :
  Erweitern Sie den im vorherigen Schritt erhaltenen Anregungsvektor zu (C, 1, 1)einem Tensor und vergleichen Sie ihn mit der ursprünglichen MerkmalskarteXElementweise multiplizieren, um eine gewichtete Feature-Map für jeden Kanal zu erhalten.
  Das Folgende ist ein Beispielcode, der mit PyTorch implementiert wurde:

import torch
import torch.nn as nn

class SEBlock(nn.Module):
    def __init__(self,in_channels,ratio):
        super(SEBlock, self).__init__()
        middle_channels=in_channels//ratio
        self.squeeze=nn.AdaptiveAvgPool2d(1)
        self.excitation = nn.Sequential(
            nn.Conv2d(in_channels, middle_channels, kernel_size=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(middle_channels, in_channels, kernel_size=1),
            nn.Sigmoid()
        )

    def forward(self, x):
        # Squeeze phase
        squeezed = self.squeeze(x)
        print("Squeezed shape:", squeezed.shape)
        # Excitation phase
        weights = self.excitation(squeezed)
        print("Excitation weights shape:", weights.shape)
        # Re-calibration phase
        output = x * weights
        print("Output shape:", output.shape)
        return output

if __name__ == '__main__':
    model=SEBlock(64,8)
    device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
    model.to(device)
    input_tensor=torch.randn(1,64,224,224).to(device)
    output_tensor=model(input_tensor)

  Dieser Code definiert ein SEBlockModul mit dem Namen zum Anwenden des SENet-Aufmerksamkeitsmechanismus auf eine bestimmte Eingabe-Feature-Map. Beim Erstellen eines Modells können Sie dieses Modul in Ihr Faltungs-Neuronales Netzwerk einfügen, um die Funktionen zur Merkmalsdarstellung zu verbessern.

Ich denke du magst

Origin blog.csdn.net/qq_50993557/article/details/132462505
Empfohlen
Rangfolge