CodeBlanks Logo Icon CodeBlanks

Conv2d

Conv2d, görüntüde desen taramak için çekirdek (kernel) kullanır.

nn.Conv2d

nn.Conv2d(giriş_kanal, çıkış_kanal, kernel_size, stride=1, padding=0) girdiyi (N, C, H, W) şeklinde ister. Her çıkış kanalı ayrı bir filtredir ve tüm giriş kanallarına bakar:

conv = nn.Conv2d(3, 16, kernel_size=3, padding=1)
x = torch.zeros(8, 3, 32, 32)
print(conv(x).shape)          # torch.Size([8, 16, 32, 32])
print(conv.weight.shape)      # torch.Size([16, 3, 3, 3])

Çıktı boyutu: ⌊(H + 2·padding - kernel) / stride⌋ + 1. padding=1 ile 3×3 çekirdek boyutu korur.

Parametre sayısı ve stride

Bir Conv2d katmanının parametre sayısı çıkış · giriş · k · k + çıkış'tır; görüntü boyutuna bağlı değildir. stride=2 filtreyi ikişer piksel kaydırır ve çıktıyı yarıya indirir:

conv = nn.Conv2d(3, 16, 3)
print(sum(p.numel() for p in conv.parameters()))   # 16·3·3·3 + 16 = 448
s2 = nn.Conv2d(16, 32, 3, stride=2, padding=1)
print(s2(torch.zeros(1, 16, 32, 32)).shape)        # torch.Size([1, 32, 16, 16])

Aynı katman 32×32 ya da 1024×1024 görüntüde aynı 448 parametreyi kullanır.

Uygulama Evrişim şekilleri

nn.Conv2d(1, 8, 5), nn.Conv2d(1, 8, 3, padding=1) ve nn.Conv2d(1, 8, 3, stride=2, padding=1) katmanlarını (1, 1, 28, 28) girdiye uygula; üç çıktı şeklini alt alta yazdır. Ardından ilk katmanın parametre sayısını yazdır.

Başlangıç kodu

model.py
import torch
from torch import nn

x = torch.zeros(1, 1, 28, 28)

# buraya yaz

Örnek çözüm

model.py
import torch
from torch import nn

x = torch.zeros(1, 1, 28, 28)

katmanlar = [nn.Conv2d(1, 8, 5), nn.Conv2d(1, 8, 3, padding=1), nn.Conv2d(1, 8, 3, stride=2, padding=1)]
for k in katmanlar:
    print(k(x).shape)
print(sum(p.numel() for p in katmanlar[0].parameters()))

Beklenen çıktı

torch.Size([1, 8, 24, 24])
torch.Size([1, 8, 28, 28])
torch.Size([1, 8, 14, 14])
208

Soru ve cevaplar

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

1 32×32 girdi, kernel 5, stride 1, padding 0 ile çıktı kaç piksel olur?

  • 28×28 Doğru cevap
  • 32×32
  • 27×27
  • 30×30

Açıklama: (32 + 0 - 5) / 1 + 1 = 28.

2 Boyutu koruyan 3×3 evrişim kur.

Soru
conv = nn.Conv2d(3, 16, kernel_size=3, ____=1)
Cevap
conv = nn.Conv2d(3, 16, kernel_size=3, padding=1)

Açıklama: padding=1 kenarlara bir piksel sıfır ekler.

3 Ayarları etkileriyle eşleştir.

Kavram Anlamı
kernel_size Filtre boyutu
stride=2 Çıktıyı yarıya indirir
padding=1 Boyutu korur (3×3)
out_channels Filtre sayısı

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