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.
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 C
die Anzahl der Kanäle H
und W
die 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 MerkmalskarteX
Elementweise 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 SEBlock
Modul 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.