SENet (сеть сжатия и возбуждения) — это механизм внимания для глубоких сверточных нейронных сетей (CNN), предназначенный для улучшения способности представления сети в функциональных каналах. Он улучшает представление полезной информации и подавляет ненужную информацию, изучая веса важности каждого канала, а затем используя эти веса для повторного взвешивания карт объектов.
Ниже приведены шаги для подробного представления механизма внимания 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 к заданной входной карте объектов. При создании модели вы можете вставить этот модуль в свою сверточную нейронную сеть, чтобы расширить возможности представления объектов.