CodeBlanks Logo Icon CodeBlanks

Flatten

Flatten, çok boyutlu feature map'i tek boyuta indirir.

Flatten

Evrişim gövdesinin çıktısı (N, C, H, W) şeklindedir; sınıflandırıcı katman ise (N, özellik) ister. nn.Flatten() toplu veri boyutu dışındaki tüm eksenleri birleştirir:

model = nn.Sequential(
    nn.Conv2d(1, 8, 3, padding=1), nn.ReLU(), nn.MaxPool2d(2),   # 28 -> 14
    nn.Conv2d(8, 16, 3, padding=1), nn.ReLU(), nn.MaxPool2d(2),  # 14 -> 7
    nn.Flatten(),                                                # 16·7·7 = 784
    nn.Linear(16 * 7 * 7, 10))

Doğrusal katmanın girdi boyutunu hesaplamak için gövdeye sahte bir girdi vermek pratik bir yoldur.

Boyutu otomatik bulmak

Girdi boyutu değişince doğrusal katmanın boyutunu elle hesaplamak hataya açıktır. İki yaygın çözüm: sahte girdiyle ölçmek ya da nn.LazyLinear kullanmak:

govde = nn.Sequential(nn.Conv2d(1, 8, 3), nn.ReLU(), nn.MaxPool2d(2), nn.Flatten())
with torch.no_grad():
    n = govde(torch.zeros(1, 1, 28, 28)).shape[1]
print(n)                         # 8·13·13 = 1352
bas = nn.LazyLinear(10)          # girdi boyutunu ilk çağrıda öğrenir

Küresel ortalama havuzlama kullanan ağlarda bu sorun hiç çıkmaz: doğrusal katmanın girdisi her zaman kanal sayısıdır.

Uygulama Küçük CNN

Yukarıdaki iki bloklu modeli kur (1→8→16 kanal, padding 1, her blokta MaxPool2d(2), sonra Flatten ve nn.Linear(16 * 7 * 7, 10)). (4, 1, 28, 28) girdinin çıktı şeklini ve toplam parametre sayısını aynı satırda yazdır.

Başlangıç kodu

model.py
import torch
from torch import nn

# buraya yaz

Örnek çözüm

model.py
import torch
from torch import nn

model = nn.Sequential(
    nn.Conv2d(1, 8, 3, padding=1), nn.ReLU(), nn.MaxPool2d(2),
    nn.Conv2d(8, 16, 3, padding=1), nn.ReLU(), nn.MaxPool2d(2),
    nn.Flatten(),
    nn.Linear(16 * 7 * 7, 10))
print(model(torch.zeros(4, 1, 28, 28)).shape, sum(p.numel() for p in model.parameters()))

Beklenen çıktı

torch.Size([4, 10]) 9098

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 (32, 64, 5, 5) şekilli çıktı <code>nn.Flatten()</code> sonrası hangi şekli alır?

  • (32, 320)
  • (32, 1600) Doğru cevap
  • (51200,)
  • (32, 64)

Açıklama: 64 · 5 · 5 = 1600; toplu boyut korunur.

2 Toplu veri dışındaki eksenleri düzleştir.

Soru
nn.____()
Cevap
nn.Flatten()

Açıklama: nn.Flatten varsayılan olarak start_dim=1 kullanır.

3 Boyutları eşleştir.

Kavram Anlamı
(N, 16, 7, 7) 784 özellik
(N, 8, 13, 13) 1352 özellik
nn.LazyLinear Boyutu kendi bulur
AdaptiveAvgPool2d(1) Özellik = kanal

İleri seviye bölümündeki tüm dersler