Pooling Layers
Lớp gộp
Bạn có tấm ảnh 1000×1000 pixel. Sau 3 lớp convolution, bạn có 256 feature maps, mỗi cái 1000×1000. Tổng cộng 256 triệu số! Làm sao giảm tải tính toán mà không mất thông tin quan trọng?
Hình minh họa
Hãy tưởng tượng bạn tóm tắt đánh giá món phở trên Shopee Food. Thay vì đọc 100 review, bạn chỉ lấy điểm cao nhất (max pooling — "quán này có review 5 sao!") hoặc điểm trung bình (average pooling — "trung bình 4.2 sao").
Chọn kiểu pooling và nhấn vào từng vùng 2×2 trên input để xem kết quả.
Vùng (0, 0) → [6, 2, 1, 5]:
max(6, 2, 1, 5) = 6 ← giá trị nổi bật nhất
Bạn vừa thấy ảnh 4×4 giảm xuống 2×2 — kích thước giảm 4 lần mà thông tin quan trọng vẫn được giữ lại. Đây là lý do CNN có thể xử lý ảnh hàng triệu pixel.
Pooling là "bộ tóm tắt" — giảm kích thước dữ liệu nhưng giữ bản chất. Giống bạn đọc tóm tắt sách thay vì đọc hết 500 trang — nhanh hơn mà vẫn nắm được nội dung chính!
Bonus: pooling tạo tính bất biến dịch chuyển nhỏ — dù con mèo dịch sang trái/phải vài pixel, max value trong vùng 2×2 vẫn giống nhau.
Max Pooling
Lấy giá trị lớn nhất. Phổ biến nhất trong CNN phân loại.
Average Pooling
Lấy trung bình. Giữ thông tin tổng quát hơn.
Global Avg Pooling
Lấy TB toàn bộ feature map → 1 số/channel. Thay FC layer.
Nhiều kiến trúc mới dùng strided convolution (conv với stride=2) thay cho pooling — giảm kích thước nhưng vẫn có tham số học được. ResNet và EfficientNet đều dùng cách này. Global Average Pooling thay thế Flatten + FC ở cuối mạng.
Feature map 224×224 qua 4 lớp Max Pooling 2×2. Kích thước cuối cùng là?
Giải thích
Pooling giảm kích thước không gian (spatial dimensions) của feature map, giữ lại thông tin quan trọng. Không có tham số học được — chỉ là phép toán cố định.
Max Pooling:
Average Pooling:
Trong đó là vùng pooling tại vị trí (i, j).
Kích thước output:
Pooling thường dùng K=2, S=2 → mỗi chiều giảm một nửa. Hoặc K=3, S=2 với padding=1 (overlapping pooling).
Pooling giảm số lượng tham số ở các lớp sau (vì feature map nhỏ hơn → FC layer ít neuron hơn). Ít tham số hơn = ít khả năng "nhớ" dữ liệu huấn luyện = ít overfitting. Ngoài ra, tính bất biến nhỏ giúp mô hình tổng quát hóa tốt hơn.
import torch.nn as nn
# Max Pooling 2x2, stride 2 (mặc định)
pool = nn.MaxPool2d(kernel_size=2, stride=2)
# Input: (batch, channels, 224, 224)
# Output: (batch, channels, 112, 112)
# Average Pooling
avg_pool = nn.AvgPool2d(kernel_size=2, stride=2)
# Global Average Pooling — thay thế Flatten + FC
gap = nn.AdaptiveAvgPool2d(1)
# Input: (batch, 512, 7, 7)
# Output: (batch, 512, 1, 1) → squeeze → (batch, 512)
# Ví dụ trong kiến trúc hiện đại
class ModernCNN(nn.Module):
def __init__(self, num_classes=10):
super().__init__()
self.features = nn.Sequential(
nn.Conv2d(3, 64, 3, padding=1), nn.ReLU(),
nn.MaxPool2d(2), # 224→112
nn.Conv2d(64, 128, 3, padding=1), nn.ReLU(),
nn.MaxPool2d(2), # 112→56
nn.Conv2d(128, 256, 3, padding=1), nn.ReLU(),
)
self.classifier = nn.Sequential(
nn.AdaptiveAvgPool2d(1), # 56×56→1×1 (GAP!)
nn.Flatten(),
nn.Linear(256, num_classes),
)- Pooling giảm kích thước feature map: 2×2 pooling giảm mỗi chiều một nửa → tổng giảm 4 lần.
- Max Pooling giữ đặc trưng nổi bật nhất — phổ biến nhất cho phân loại ảnh.
- Average Pooling giữ thông tin tổng quát — Global Average Pooling thay thế FC layer ở cuối CNN hiện đại.
- Pooling không có tham số học được — chỉ là phép toán cố định (max hoặc trung bình).
- Lợi ích: giảm tính toán, tạo bất biến dịch chuyển nhỏ, chống overfitting.
Kiểm tra hiểu biết
Feature map 16×16 qua Max Pooling 2×2 (stride 2). Output kích thước bao nhiêu?