Sobes.tech
Junior — Senior

CBAM nədir (Konvolyutsiya Bloku Diqqət Modulu)?

sobes.tech Süni İntellekt

AI-dan cavab

CBAM (Konvolyutsion Blok Diqqat Modulu) — bu konvolyutsion neyron tarmoqlari uchun diqqat moduli bo‘lib, modelga fazoviy va kanal o‘lchamlardagi eng muhim xususiyatlarga e’tibor qaratishga yordam beradi. U ketma-ket ikki kichik moduldan iborat:

  1. Kanal Diqqat Moduli — har bir kanalning ahamiyatini hisoblaydi, muhim kanallarni kuchaytiradi va kamroq muhimlarini kamaytiradi.
  2. Fazoviy Diqqat Moduli — xususiyat xaritasidagi har bir fazoviy pozitsiyaning (pikselning) ahamiyatini hisoblaydi va muhim hududlarni ajratib ko‘rsatadi.

CBAM mavjud konvolyutsion tarmoqlarga osongina qo‘shiladi va ularning sifatini yaxshilash uchun xususiyatlarni samarali chiqarib olish imkonini beradi.

PyTorchda foydalanish misoli:

import torch
import torch.nn as nn

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

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

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

        # Fazoviy Diqqat
        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