Механизм внимания SENet (сеть сжатия и возбуждения)

  SENet (сеть сжатия и возбуждения) — это механизм внимания для глубоких сверточных нейронных сетей (CNN), предназначенный для улучшения способности представления сети в функциональных каналах. Он улучшает представление полезной информации и подавляет ненужную информацию, изучая веса важности каждого канала, а затем используя эти веса для повторного взвешивания карт объектов.
Структурная схема механизма внимания SENet
  Ниже приведены шаги для подробного представления механизма внимания SENet:
  1. Этап сжатия (сжатия) :
на этом этапе выполняется глобальное объединение средних значений на входной карте объектов для сжатия измерения канала. Предположим, что входная карта объектов равна X, а форма равна (C, H, W), где C– количество каналов, Hа W– высота и ширина соответственно. Объединение глобальных средних значений приведет к получению (C, 1, 1)тензора размера .
  2. Этап возбуждения :
  на этом этапе вес важности канала определяется через двухуровневую полностью подключенную сеть. Эта полностью связная сеть состоит из операции сжатия и операции возбуждения.
  А. Операция сжатия: введите (C, 1, 1)тензор, полученный на предыдущем шаге, в полностью связный слой и сожмите количество каналов до меньшего значения, называемого middle_channels.
  Б. Операция возбуждения: введите сжатые функции в функцию активации ReLU, чтобы получить (middle_channels,)вектор .
  3. Этап повторной калибровки :
  разверните вектор возбуждения, полученный на предыдущем этапе (C, 1, 1), в тензор и сравните его с исходной картой признаков.XУмножьте поэлементно, чтобы получить взвешенную карту признаков на каждом канале.
  Ниже приведен пример кода, реализованный с помощью 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)

  Этот код определяет SEBlockмодуль, названный для применения механизма внимания SENet к заданной входной карте объектов. При создании модели вы можете вставить этот модуль в свою сверточную нейронную сеть, чтобы расширить возможности представления объектов.

рекомендация

отblog.csdn.net/qq_50993557/article/details/132462505