Sobes.tech
Junior — Senior

Čo je CBAM (Modul pozornosti konvolučného bloku)?

sobes.tech AI

Odpoveď od AI

CBAM (Konvolučný blok pozornosti) je modul pozornosti pre konvolučné neurónové siete, ktorý pomáha modelu zamerať sa na najdôležitejšie vlastnosti v priestorových a kanálových rozmeroch. Skladá sa zo dvoch po sebe idúcich podsystémov:

  1. Modul pozornosti kanálov — vypočíta dôležitosť každého kanála, posilňuje významné kanály a potláča menej dôležité.
  2. Modul pozornosti priestoru — vypočíta dôležitosť každej priestorovej pozície (pixela) v mape vlastností, zvýrazňuje kľúčové oblasti.

CBAM sa ľahko integruje do existujúcich konvolučných sietí a zlepšuje ich kvalitu efektívnejším extrahovaním vlastností.

Príklad použitia v PyTorch:

import torch
import torch.nn as nn

class CBAM(nn.Module):
    def __init__(self, channels, reduction=16, kernel_size=7):
        super().__init__()
        # Pozornosť kanálov
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.max_pool = nn.AdaptiveMaxPool2d(1)
        self.fc = nn.Sequential(
            nn.Conv2d(channels, channels // reduction, 1, bias=False),
            nn.ReLU(),
            nn.Conv2d(channels // reduction, channels, 1, bias=False)
        )
        self.sigmoid_channel = nn.Sigmoid()

        # Pozornosť priestoru
        self.conv_spatial = nn.Conv2d(2, 1, kernel_size, padding=kernel_size//2, bias=False)
        self.sigmoid_spatial = nn.Sigmoid()

    def forward(self, x):
        # Pozornosť kanálov
        avg_out = self.fc(self.avg_pool(x))
        max_out = self.fc(self.max_pool(x))
        channel_att = self.sigmoid_channel(avg_out + max_out)
        x = x * channel_att

        # Pozornosť priestoru
        avg_out = torch.mean(x, dim=1, keepdim=True)
        max_out, _ = torch.max(x, dim=1, keepdim=True)
        spatial_att = self.sigmoid_spatial(self.conv_spatial(torch.cat([avg_out, max_out], dim=1)))
        x = x * spatial_att

        return x