Garfield
YZF Admin
PyTorch’ta katmanları sırayla birleştirmek için
Aşağıdaki varsayımsal model, 4 özellikli bir girdiyi önce 8 boyuta, ardından 2 sınıflı çıktıya dönüştürür:
Burada
İki veya daha fazla katmanı birleştirmenin temel yolu şöyledir:
İsim vermek hesaplamanın sırasını değiştirmez; yalnızca katmanlara erişmeyi ve model çıktısını okumayı kolaylaştırır. Katman adlarının benzersiz olması gerekir.
Girişin son boyutu 10 olmalı, son katmanın çıktısı ise 3 olmalıdır. Girdi
Örneğin artık bağlantı içeren bir modelde veri yalnızca sırayla ilerlemez:
Bu örnekte
torch.nn.Sequential kullanılır. Katmanları oluşturucuya verdikten sonra giriş tensörü ilk katmandan son katmana otomatik olarak aktarılır. Böylece basit, doğrusal bir ağın ileri yayılımını ayrıca forward() içinde tek tek yazmadan çalıştırabilirsiniz.En küçük çalışan örnek
Aşağıdaki varsayımsal model, 4 özellikli bir girdiyi önce 8 boyuta, ardından 2 sınıflı çıktıya dönüştürür:
Python:
import torch
from torch import nn
model = nn.Sequential(
nn.Linear(4, 8),
nn.ReLU(),
nn.Linear(8, 2)
)
x = torch.randn(3, 4) # 3 örnek, her örnekte 4 özellik
output = model(x)
print(output.shape) # torch.Size([3, 2])
Burada
x tensörünün biçimi (3, 4) olduğu için ilk Linear(4, 8) katmanı 4 giriş özelliğini kabul eder. ReLU() ara aktivasyonu uygular. Son Linear(8, 2) katmanı her örnek için 2 ham çıktı üretir. Çıktı biçiminin (3, 2) olması, üç örneğin her biri için iki değer üretildiğini gösterir; bu değerler henüz olasılık değildir.Katmanları Sequential içine yerleştirme
İki veya daha fazla katmanı birleştirmenin temel yolu şöyledir:
- Katmanları sırayla belirleyin. Bir katmanın çıktı boyutu, kendisinden sonraki katmanın giriş boyutuyla uyuşmalıdır. Örneğin
Linear(4, 8)sonrasındaLinear(8, 2)kullanılabilir. - Katmanları
nn.Sequentialiçine yazın. PyTorch bu katmanları eklenme sırasına göre kaydeder ve giriş tensörünü aynı sırayla iletir. - Modeli tensör üzerinde çağırın.
output = model(x)ifadesi katmanların ileri geçişini çalıştırır; modeli doğrudanmodel.forward(x)şeklinde çağırmak yerine bu kullanım tercih edilir. - Çıktı biçimini kontrol edin.
output.shapedeğerini beklediğiniz boyutla karşılaştırın. Boyut uyuşmazlığı varsa genellikle birLinearkatmanının giriş veya çıkış sayısı yanlış tanımlanmıştır.
OrderedDict kullanabilirsiniz:
Python:
from collections import OrderedDict
from torch import nn
model = nn.Sequential(OrderedDict([
("giris", nn.Linear(4, 8)),
("aktivasyon", nn.ReLU()),
("cikis", nn.Linear(8, 2))
]))
print(model)
print(model.giris)
İsim vermek hesaplamanın sırasını değiştirmez; yalnızca katmanlara erişmeyi ve model çıktısını okumayı kolaylaştırır. Katman adlarının benzersiz olması gerekir.
Giriş ve çıktı boyutlarını eşleştirme
Sequential katmanları otomatik olarak birbirine bağlar, ancak boyutları sizin doğru kurmanız gerekir. Örneğin aşağıdaki zincirde boyutlar uyumludur:
Python:
model = nn.Sequential(
nn.Linear(10, 32),
nn.ReLU(),
nn.Linear(32, 16),
nn.ReLU(),
nn.Linear(16, 3)
)
Girişin son boyutu 10 olmalı, son katmanın çıktısı ise 3 olmalıdır. Girdi
(batch_size, 10) biçimindeyse çıktı (batch_size, 3) biçiminde olur. Buradaki batch_size değeri kaç örneği aynı anda işlediğinizi belirtir ve model mimarisindeki sabit katman boyutlarıyla aynı olmak zorunda değildir.Sequential ne zaman yeterli değildir?
Sequential, verinin tek bir doğrusal akış izlediği modeller için uygundur. Bir katmanın çıktısını iki farklı dala vermek, iki tensörü birleştirmek, ara çıktıyı atlamak veya katmanlar arasında özel koşul kullanmak istediğinizde özel bir nn.Module sınıfı yazıp forward() metodunu tanımlamanız gerekir.Örneğin artık bağlantı içeren bir modelde veri yalnızca sırayla ilerlemez:
Python:
import torch
from torch import nn
class ResidualBlock(nn.Module):
def __init__(self, features):
super().__init__()
self.layers = nn.Sequential(
nn.Linear(features, features),
nn.ReLU(),
nn.Linear(features, features)
)
def forward(self, x):
return x + self.layers(x)
model = ResidualBlock(4)
x = torch.randn(2, 4)
y = model(x)
print(y.shape) # torch.Size([2, 4])
Bu örnekte
x hem doğrudan sonuca eklenir hem de Sequential içindeki katmanlardan geçirilir. Dolayısıyla yalnızca Sequential tanımıyla ifade edilemeyecek bağlantı forward() içinde açıkça kurulmuştur.Yaygın hataları ayırt etme
- Boyut uyuşmazlığı: Bir
Linearkatmanının ilk sayısı, kendisinden önceki katmanın çıktı sayısıyla aynı olmalıdır. - Yanlış çıktı yorumu: Son katmanda
Softmaxyoksa sınıflandırma çıktısı genellikle ham skorlar, yani logitlerdir. Kayıp fonksiyonunuzun beklediği çıktı türüne göre son katmanı ve kaybı birlikte seçin. - Aktivasyonun unutulması: Birden fazla doğrusal katmanı aktivasyonsuz arka arkaya eklemek, bunların tek bir doğrusal dönüşüm gibi davranmasına neden olabilir. Gizli katmanlar için aktivasyon gerekip gerekmediğini model amacınıza göre belirleyin.
- Dallanmış yapı kurmaya çalışma: Atlamalı bağlantı, birden fazla giriş veya özel tensör birleştirme varsa
Sequentialyerinenn.Modulekullanın.
output.shape değerini kontrol etmektir. Bu kontrol yalnızca katman boyutlarının uyumlu olduğunu gösterir; modelin doğru öğrendiğini veya tahmin doğruluğunun iyi olduğunu kanıtlamaz. Eğitim aşamasında uygun kayıp fonksiyonunu, veri biçimini ve hedef etiketlerin boyutunu ayrıca doğrulamanız gerekir.