Sobes.tech
Junior — Senior

Wat is CBAM (Convolutional Block Attention Module)?

sobes.tech AI

Antwoord van AI

CBAM (Convolutional Block Attention Module) is een attentie-module voor convolutionele neurale netwerken die het model helpt zich te richten op de belangrijkste kenmerken in ruimtelijke en kanaaldimensies. Het bestaat uit twee opeenvolgende submodules:

  1. Kanaalatentiemodule — berekent de belangrijkheid van elk kanaal, versterkt significante kanalen en onderdrukt minder belangrijke.
  2. Ruimtelijke attentie-module — berekent de belangrijkheid van elke ruimtelijke positie (pixel) in de feature map, en markeert belangrijke gebieden.

CBAM kan gemakkelijk worden geïntegreerd in bestaande convolutionele netwerken en verbetert hun kwaliteit door efficiëntere kenmerkextractie.

Voorbeeld van gebruik in PyTorch:

import torch
import torch.nn as nn

class CBAM(nn.Module):
    def __init__(self, channels, reduction=16, kernel_size=7):
        super().__init__()
        # Kanaalatentiemodule
        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()

        # Ruimtelijke attentie
        self.conv_spatial = nn.Conv2d(2, 1, kernel_size, padding=kernel_size//2, bias=False)
        self.sigmoid_spatial = nn.Sigmoid()

    def forward(self, x):
        # Kanaalatentiemodule
        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

        # Ruimtelijke attentie
        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