Pooling katmanları
Önkoşul:Filtre, stride, padding
Kanca
- derste stride’ın konvolüsyonun çıkış boyutunu küçülttüğünü gördük. Pooling, boyutu küçültmenin BAŞKA bir yolu — ama öğrenilebilir bir çekirdeği YOK. Sadece küçük bir pencereyi TEK bir sayıya indirger.
Sezgi
Pooling, küçük bir pencere içindeki değerleri (öğrenme olmadan, sabit bir kuralla) TEK bir sayıya indirger. En yaygın ikisi: MaxPool (pencerenin EN BÜYÜK değerini al) ve AvgPool (pencerenin ORTALAMASINI al). Bu, hem boyutu küçültür hem de küçük konum kaymalarına karşı bir miktar dayanıklılık kazandırır.
Mekanizma
MaxPool ve AvgPool’u aynı girdide karşılaştıralım:
MaxPool vs AvgPool
# Pooling, konvolüsyon DEĞİLDİR -- öğrenilebilir bir çekirdeği yoktur. Sadece küçük
# bir pencere içindeki değerleri TEK bir sayıya indirger (en çok kullanılanı: max).
girdi = torch.tensor([[
[1., 3, 2, 4],
[5, 6, 1, 2],
[1, 2, 8, 3],
[4, 1, 2, 9],
]]).unsqueeze(0)
maxpool = F.max_pool2d(girdi, kernel_size=2, stride=2)
avgpool = F.avg_pool2d(girdi, kernel_size=2, stride=2)
print("Girdi (4x4):")
print(girdi[0, 0].numpy())
print("\nMaxPool (2x2 pencere, her pencerenin EN BÜYÜK değeri):")
print(maxpool[0, 0].numpy())
print("\nAvgPool (2x2 pencere, her pencerenin ORTALAMASI):")
print(avgpool[0, 0].numpy())
print("\n4x4 girdi, 2x2 pooling ile 2x2'ye iniyor -- boyut YARIYA düşüyor, öğrenilebilir parametre YOK.")Girdi (4x4):
[[1. 3. 2. 4.]
[5. 6. 1. 2.]
[1. 2. 8. 3.]
[4. 1. 2. 9.]]
MaxPool (2x2 pencere, her pencerenin EN BÜYÜK değeri):
[[6. 4.]
[4. 9.]]
AvgPool (2x2 pencere, her pencerenin ORTALAMASI):
[[3.75 2.25]
[2. 5.5 ]]
4x4 girdi, 2x2 pooling ile 2x2'ye iniyor -- boyut YARIYA düşüyor, öğrenilebilir parametre YOK.4×4 girdi, 2×2 pooling ile 2×2’ye iniyor — konvolüsyonun aksine, HİÇBİR öğrenilebilir parametre yok. Şimdi ikisinin GÜRÜLTÜYE tepkisini karşılaştıralım:
Gürültüye farklı tepkiler
# MaxPool ve AvgPool, GÜRÜLTÜYE farklı tepki verir. Tek bir aykırı (çok büyük) pikseli deneyelim.
girdi_gurultulu = girdi.clone()
girdi_gurultulu[0, 0, 0, 0] = 100.0 # tek bir aşırı değer
print("\nTek bir aykırı piksel (100.0) eklendiğinde:")
print("MaxPool sonucu:", F.max_pool2d(girdi_gurultulu, 2, 2)[0, 0].numpy())
print("AvgPool sonucu:", F.avg_pool2d(girdi_gurultulu, 2, 2)[0, 0].numpy())
print("\nMaxPool, aykırı değeri DOĞRUDAN yansıtıyor (6 -> 100). AvgPool ortalamaya gizleyip daha AZ etkileniyor (3.75 -> 28.5).")
print("Bu yüzden MaxPool 'en belirgin özelliği' yakalar, AvgPool 'genel eğilimi' yansıtır.")
Tek bir aykırı piksel (100.0) eklendiğinde:
MaxPool sonucu: [[100. 4.]
[ 4. 9.]]
AvgPool sonucu: [[28.5 2.25]
[ 2. 5.5 ]]
MaxPool, aykırı değeri DOĞRUDAN yansıtıyor (6 -> 100). AvgPool ortalamaya gizleyip daha AZ etkileniyor (3.75 -> 28.5).
Bu yüzden MaxPool 'en belirgin özelliği' yakalar, AvgPool 'genel eğilimi' yansıtır.Tek bir aşırı piksel (100.0) eklendiğinde MaxPool sonucu 6’dan 100’e fırlıyor — aykırı değeri DOĞRUDAN yansıtıyor. AvgPool ise 3.75’ten 28.5’e çıkıyor — hâlâ etkileniyor ama ORTALAMANIN içinde “seyreltiliyor”. Çoğu kişi “MaxPool her zaman daha iyi, çünkü en belirgin özelliği yakalıyor” sanır. Bağlama bağlı, çünkü bu aynı zamanda MaxPool’u gürültüye daha DUYARLI yapıyor.
Matematik
MaxPool ve AvgPool
| Özellik | MaxPool | AvgPool |
|---|---|---|
| Yakaladığı bilgi | En BELİRGİN özellik (örn. bir kenarın en güçlü noktası) | Bölgenin GENEL eğilimi |
| Gürültüye tepki | Duyarlı (tek bir aşırı değer domine edebilir) | Daha az duyarlı (ortalamaya “seyrelir”) |
| Öğrenilebilir parametre | Yok | Yok |
Kod
Pooling’in ikinci gücü: KÜÇÜK konum kaymalarına karşı dayanıklılık.
Pooling, küçük kaymalara nasıl dayanıklı?
# Pooling'in asıl gücü: KÜÇÜK kaymalara karşı bir miktar dayanıklılık kazandırması.
def nokta_olustur(satir, sutun):
g = torch.zeros(1, 1, 6, 6)
g[0, 0, satir, sutun] = 5.0
return g
nokta_a = nokta_olustur(1, 1) # (1,1) konumunda
nokta_b = nokta_olustur(0, 0) # AYNI 2x2 havuzlama bölgesi içinde, kaydırılmış
nokta_c = nokta_olustur(2, 2) # FARKLI bir havuzlama bölgesine geçmiş
p_a = F.max_pool2d(nokta_a, 2, 2)
p_b = F.max_pool2d(nokta_b, 2, 2)
p_c = F.max_pool2d(nokta_c, 2, 2)
print(f"\nNokta (1,1)'de -> pooling sonucu birebir aynı mı (0,0)'daki ile? {torch.equal(p_a, p_b)}")
print(f"Nokta (2,2)'de (farklı pencere) -> pooling sonucu (1,1)'dekiyle aynı mı? {torch.equal(p_a, p_c)}")
print("\nAYNI pencere içindeki küçük kaymalar, pooling SONRASI FARK ETMİYOR -- 26. dersteki konum")
print("bağımlılığı sorununa, pooling KÜÇÜK ÖLÇEKTE bir çözüm daha sağlıyor.")
Nokta (1,1)'de -> pooling sonucu birebir aynı mı (0,0)'daki ile? True
Nokta (2,2)'de (farklı pencere) -> pooling sonucu (1,1)'dekiyle aynı mı? False
AYNI pencere içindeki küçük kaymalar, pooling SONRASI FARK ETMİYOR -- 26. dersteki konum
bağımlılığı sorununa, pooling KÜÇÜK ÖLÇEKTE bir çözüm daha sağlıyor.Aynı “nokta” deseni, AYNI 2×2 havuzlama penceresi içinde farklı konumlardayken (1,1) ve (0,0)) pooling sonrası BİREBİR AYNI sonucu veriyor. Ama pencere SINIRINI aşan bir kaymada (2,2)) sonuç değişiyor.
Nerede işe yarar
Pooling, klasik CNN mimarilerinde (31. ders) konvolüsyon katmanları arasına yerleştirilir:
- MaxPool, pratikte AvgPool’dan daha YAYGIN kullanılır — “bu özellik burada var mı” sorusuna cevap ararken en güçlü sinyali korumak genelde daha faydalıdır.
- Global Average Pooling (tüm özellik haritasını TEK sayıya indirgemek), modern mimarilerde (31. ders, ResNet gibi) tam bağlı katmanların yerini almak için kullanılır.
- Pooling katmanlarının ÖĞRENİLEBİLİR parametresi yoktur — bu, modelin toplam parametre sayısını ARTIRMADAN boyut küçültmesini sağlar.
Bu 3 hatayı yaparsın:
- Pooling’i konvolüsyonla karıştırmak — pooling’in öğrenilebilir bir çekirdeği YOKTUR, sabit bir kuralla çalışır.
- Her zaman MaxPool kullanmak, AvgPool’un gürültüye daha dayanıklı olabileceği durumları göz ardı etmek.
- Pooling’in TÜM konum değişikliklerine dayanıklı olduğunu sanmak — sadece AYNI pencere İÇİNDEKİ küçük kaymalara dayanıklıdır, büyük kaymalara değil.
Kendini test et
1. Notebook'ta tek bir aykırı piksel (100.0) eklendiğinde MaxPool ve AvgPool neden farklı tepki verdi?
- Kod hatalıydı
- MaxPool sadece pencerenin EN BÜYÜK değerini alır (aykırı değeri doğrudan yansıtır); AvgPool tüm değerlerin ORTALAMASINI alır (aykırı değer diğer değerlerin arasında "seyrelir") (doğru cevap)
- AvgPool aykırı değerleri otomatik olarak siler
- MaxPool ve AvgPool aynı sonucu vermeliydi
Neden: MaxPool'un tanımı gereği pencerenin en büyük değerini seçmesi, tek bir aşırı değerin doğrudan çıktıya yansımasına neden olur; AvgPool'un ortalama alması bu etkiyi diğer değerlerle 'seyreltir'.
2. Notebook'ta aynı 'nokta' deseni (1,1) ve (0,0) konumlarındayken pooling sonrası neden BİREBİR AYNI sonucu verdi?
- Rastgele bir sonuç
- İki konum da AYNI 2x2 havuzlama penceresinin içinde kaldığı için -- pooling, bir pencere içindeki KONUMU değil, sadece pencerenin İÇERİĞİNİ önemser (doğru cevap)
- Pooling hiçbir zaman konumu dikkate almaz
- Nokta değerleri farklıydı
Neden: Pooling, bir pencere içindeki değerleri (max veya ortalama ile) tek bir sayıya indirger; pencere İÇİNDEKİ hangi hücrede olduğu önemli değildir, bu yüzden aynı pencere içindeki küçük kaymalar sonucu değiştirmez.
3. Pooling katmanlarının konvolüsyon katmanlarından temel farkı nedir?
- İkisi de aynı şeyi yapar
- Pooling'in ÖĞRENİLEBİLİR bir çekirdeği yoktur -- sabit bir kuralla (max veya ortalama) çalışır; konvolüsyonun çekirdeği ise veriden öğrenilir (doğru cevap)
- Pooling sadece renkli görüntülerde çalışır
- Konvolüsyon hiçbir zaman boyut küçültmez
Neden: Konvolüsyonun çekirdek değerleri geri yayılımla öğrenilir (27. ders); pooling ise sabit bir işlem (max veya ortalama) uygular ve hiçbir öğrenilebilir parametresi yoktur.
Özet
Özet
- Pooling, bir pencere içindeki değerleri (öğrenilebilir parametre olmadan) tek bir sayıya indirger.
- MaxPool en belirgin özelliği yakalar ama gürültüye duyarlıdır; AvgPool genel eğilimi yansıtır ve daha dayanıklıdır.
- Pooling, boyutu küçültürken modelin toplam parametre sayısını artırmaz.
- Aynı havuzlama penceresi içindeki küçük konum kaymaları, pooling sonrası fark etmez -- yerel öteleme değişmezliği.
- MaxPool pratikte daha yaygın kullanılır; Global Average Pooling modern mimarilerde (31. ders) tam bağlı katmanların yerini alabilir.