Mecanismo de atención SENet (red de compresión y excitación)

  SENet (Squeeze-and-Excitation Network) es un mecanismo de atención para redes neuronales convolucionales profundas (CNN), diseñado para mejorar la capacidad de representación de la red en canales de funciones. Mejora la representación de información útil y suprime la información irrelevante al aprender las ponderaciones de importancia de cada canal y luego usar estas ponderaciones para volver a ponderar los mapas de características.
Diagrama de estructura del mecanismo de atención SENet
  Los siguientes son los pasos para presentar el mecanismo de atención SENet en detalle:
  1. Etapa de compresión (compresión) :
en esta etapa, la agrupación promedio global se realiza en el mapa de características de entrada para comprimir la dimensión del canal. Supongamos que el mapa de características de entrada es Xy la forma es (C, H, W), donde Ces el número de canales Hy Wla altura y el ancho respectivamente. La agrupación promedio global dará como resultado un (C, 1, 1)tensor de tamaño.
  2. Etapa de excitación :
  en esta etapa, el peso de importancia del canal se aprende a través de una red de dos capas completamente conectada. Esta red totalmente conectada consta de una operación de compresión y una operación de excitación.
  a.Operación de compresión: ingrese (C, 1, 1)el tensor obtenido en el paso anterior en una capa completamente conectada y comprima el número de canales a un valor menor, llamado middle_channels.
  B. Operación de excitación: ingrese las características comprimidas a una función de activación ReLU para obtener un (middle_channels,)vector de.
  3. Etapa de recalibración :
  expanda el vector de excitación obtenido en el paso anterior a (C, 1, 1)un tensor y compárelo con el mapa de características original.XMultiplique por elementos para obtener un mapa de características ponderado en cada canal.
  El siguiente es un código de muestra implementado con PyTorch:

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)

  Este código define un SEBlockmódulo llamado para aplicar el mecanismo de atención SENet en un mapa de características de entrada determinado. Al crear un modelo, puede insertar este módulo en su red neuronal convolucional para mejorar las capacidades de representación de características.

Supongo que te gusta

Origin blog.csdn.net/qq_50993557/article/details/132462505
Recomendado
Clasificación