Sobes.tech
Junior — Senior

CBAM (Модулии диққати блоки конволютсия) чист?

sobes.tech AI

Ҷавоб аз AI

CBAM (Конволюцион Блок Аҳамияти Модул) — конволюцион нейрон тармоқлар учун аҳамият модулидир, у моделга ҳудудий ва канал ўлчамларида энг муҳим хусусиятларга диққат қаратишга ёрдам беради. У икки қатордаги кичик модулдан иборат:

  1. Канал Аҳамияти Модул — ҳар бир каналнинг аҳамиятини ҳисоблайди, муҳим каналларни кучайтиради ва кам аҳамиятлиларни пасайтиради.
  2. Ҳудудий Аҳамият Модул — хусусият харитасидаги ҳар бир ҳудудий позициянинг (пикселнинг) аҳамиятини ҳисоблайди ва муҳим ҳудудларни ажратиб кўрсатади.

CBAM мавжуд конволюцион тармоқларга осонлик билан қўшилади ва уларнинг сифатини яхшилаш учун самарали хусусият чиқариш имконини беради.

PyTorchда қўлланиш мисоли:

import torch
import torch.nn as nn

class CBAM(nn.Module):
    def __init__(self, channels, reduction=16, kernel_size=7):
        super().__init__()
        # Канал Аҳамияти
        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()

        # Ҳудудий Аҳамият
        self.conv_spatial = nn.Conv2d(2, 1, kernel_size, padding=kernel_size//2, bias=False)
        self.sigmoid_spatial = nn.Sigmoid()

    def forward(self, x):
        # Канал Аҳамияти
        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

        # Ҳудудий Аҳамият
        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