Flatten
- Makine Öğrenmesi kursu
- İleri seviye
- Ders 45/78
- 5 dk
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 öğrenirKü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
import torch
from torch import nn
# buraya yazÖrnek çözüm
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.
nn.____()
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 |