Garfield
YZF Admin
Girdi ve çıktı boyutlarını ayırın
Conv2d katmanında çıktı boyutunu hesaplamak için girdi tensörünü (N, C_in, H_in, W_in) biçiminde düşünün. N parti sayısını, C_in giriş kanalını, H_in yüksekliği ve W_in genişliği belirtir. Çıktı ise (N, C_out, H_out, W_out) biçimindedir. Parti sayısı değişmez; kanal sayısını out_channels, uzamsal boyutları ise çekirdek, doldurma, adım ve genişleme belirler.Yükseklik ve genişlik için temel formül şöyledir:
H_out = floor((H_in + 2P_h - D_h(K_h - 1) - 1) / S_h + 1)W_out = floor((W_in + 2P_w - D_w(K_w - 1) - 1) / S_w + 1)Burada
K çekirdek boyutu, P padding, S stride, D dilation değeridir. floor, küsurat varsa aşağı yuvarlama anlamına gelir. Tek bir sayı kullanıldığında değer genellikle hem yükseklik hem genişlik için uygulanır; ikili demet kullanıldığında sıralama (yükseklik, genişlik) şeklindedir.Parametrelerin boyuta etkisi
Aşağıdaki ayrım, hangi boyutun neden değiştiğini hızlıca gösterir.
| Parametre | Çıktıya etkisi |
|---|---|
| in_channels | Giriş kanal sayısıdır; yükseklik ve genişliği değiştirmez. |
| out_channels | Çıktı kanal sayısını doğrudan belirler. |
| kernel_size | Çekirdeğin kapladığı alanı belirler; padding yoksa genellikle çıktıyı küçültür. |
| stride | Birden büyükse katman görüntüyü örnekleyerek uzamsal boyutu küçültür. |
| padding | Kenar çevresine hücre ekler; çıktı boyutunu koruyabilir veya büyütebilir. |
| dilation | Çekirdekteki aralığı artırır; etkin çekirdek alanını büyütür. |
kernel_size=3, stride=1, padding=1 ve dilation=1 ise yükseklik formülü floor((H_in + 2 - 2 - 1) / 1 + 1) olur ve sonuç H_in çıkar. Aynı durum genişlik için de geçerlidir. Bu nedenle bu ayar, kanal sayısını değiştirse de uzamsal boyutu korur.Somut hesaplama örneği
Varsayımsal olarak giriş tensörünüz
(8, 3, 32, 32) olsun. Bu değer 8 görüntüden, 3 giriş kanalından ve 32×32 uzamsal boyuttan oluşur. Aşağıdaki katman 16 çıkış kanalı üretir:
Python:
import torch
from torch import nn
x = torch.randn(8, 3, 32, 32)
layer = nn.Conv2d(
in_channels=3,
out_channels=16,
kernel_size=3,
stride=2,
padding=1
)
y = layer(x)
print(y.shape)
Yükseklik hesabı:
H_out = floor((32 + 2×1 - 1×(3-1) - 1) / 2 + 1)H_out = floor(31 / 2 + 1) = 16Genişlik de aynı olduğundan beklenen çıktı şekli
(8, 16, 16, 16) olur. İlk 8 parti sayısının korunduğunu, 16 ikinci değer çıkış kanalının out_channels=16 olduğunu, son iki 16 ise stride=2 nedeniyle uzamsal boyutun yarıya indiğini gösterir.Hızlı kontrol için izlenecek sıra
Gerçek bir modelde boyut hesabını şu sırayla yapın:
- Girdi şeklini yazın. Tensörün
(N, C_in, H_in, W_in)sırasını doğrulayın; PyTorchConv2diçin kanal boyutu ikinci sıradadır. - Çıkış kanalını belirleyin. Sonraki tensörün kanal boyutunu doğrudan
out_channelsolarak yazın. - Yükseklik ve genişlik parametrelerini ayırın. Tek değer kullanılıyorsa aynı değeri iki boyuta uygulayın; demet kullanılıyorsa
(yükseklik, genişlik)sırasını koruyun. - Formülü iki uzamsal boyuta uygulayın. Önce
H_out, sonraW_outhesaplayın ve küsuratı aşağı yuvarlayın. - Sonucu çalışma zamanında doğrulayın.
print(x.shape)veprint(y.shape)çıktılarında parti, kanal, yükseklik ve genişlik değerlerini hesapla karşılaştırın.
Sık karıştırılan durumlar
PyTorch
Conv2d katmanında padding='same' yalnız stride=1 ile desteklenir ve girişin uzamsal boyutlarını korur. stride>1 ile birlikte kullanılırsa katman oluşturulurken hata alınır. Ayrıca padding='valid' padding uygulanmadığı anlamına gelir ve çekirdek ile stride değerine göre çıktı küçülür.groups parametresi kanal bağlantılarını sınırlar ve katmanın ağırlık yapısını değiştirir; tek başına H_out veya W_out hesabını değiştirmez. Ancak in_channels ve out_channels değerlerinin groups ile uyumlu olması gerekir. Boyut hatası alırsanız önce girişin ikinci boyutunu, katmanın in_channels değerini ve modeldeki önceki katmanın gerçek çıktısını karşılaştırın.
Son düzenleme: