Sobes.tech
Junior — Senior
40

Что такое global average pooling и зачем он заменяет fully-connected слой?

Компании, где спрашивали
1221 Systems
ПлатформаОФД
Rubbles

Ответ от нейросети

sobes.tech AI

Global Average Pooling (GAP) — это операция, которая вычисляет среднее значение по каждому каналу входного тензора, обычно после сверточных слоев в нейронной сети. Вместо того, чтобы использовать полностью связанный (fully-connected) слой, который преобразует многомерный тензор в вектор фиксированной длины, GAP сводит каждый канал к одному числу — среднему значению по пространственным измерениям (высота и ширина).

Зачем заменяют fully-connected слой на GAP:

  • Уменьшение количества параметров: Fully-connected слои имеют много параметров, что увеличивает риск переобучения и требует больше вычислительных ресурсов.
  • Инвариантность к пространственным сдвигам: GAP агрегирует информацию по всему пространству, что делает модель менее чувствительной к расположению признаков.
  • Упрощение архитектуры: GAP позволяет использовать переменный размер входного изображения, так как не зависит от фиксированного размера входа, в отличие от fully-connected слоев.

Пример использования GAP в PyTorch:

import torch
import torch.nn as nn

class SimpleCNN(nn.Module):
    def __init__(self, num_classes=10):
        super().__init__()
        self.features = nn.Sequential(
            nn.Conv2d(3, 16, kernel_size=3, padding=1),
            nn.ReLU(),
            nn.Conv2d(16, 32, kernel_size=3, padding=1),
            nn.ReLU()
        )
        self.global_avg_pool = nn.AdaptiveAvgPool2d(1)  # GAP
        self.classifier = nn.Linear(32, num_classes)  # заменяет fully-connected слой

    def forward(self, x):
        x = self.features(x)
        x = self.global_avg_pool(x)  # размер [batch, 32, 1, 1]
        x = x.view(x.size(0), -1)    # размер [batch, 32]
        x = self.classifier(x)
        return x

Таким образом, GAP упрощает модель и снижает количество параметров, сохраняя при этом важную информацию для классификации.