CodeBlanks Logo Icon CodeBlanks

forward

forward metodu, verinin modelden nasıl geçeceğini tanımlar.

forward

forward, girdinin modülden nasıl geçeceğini tanımlar. Sıradan Python kodudur: koşullar, döngüler, birden çok girdi ve çıktı kullanılabilir. Geri yayılım yazılmaz; autograd onu ileri yayılımdan kendisi çıkarır:

class Kalinti(nn.Module):
    def __init__(self, d):
        super().__init__()
        self.l1 = nn.Linear(d, d)
        self.l2 = nn.Linear(d, d)

    def forward(self, x):
        return x + self.l2(torch.relu(self.l1(x)))   # kalıntı bağlantısı

Girdiye kendi dönüşümünü eklemek (kalıntı bağlantısı) çok derin ağların eğitilebilmesini sağlayan temel fikirdir.

İşlevsel arayüz

Parametresi olmayan işlemler (aktivasyon, havuzlama) torch.nn.functional ile fonksiyon olarak da çağrılabilir. Parametreli katmanlar ise __init__'te modül olarak oluşturulmalıdır:

import torch.nn.functional as F
def forward(self, x):
    x = F.relu(self.l1(x))       # nn.ReLU() modülüyle aynı
    x = F.dropout(x, 0.2, training=self.training)
    return self.l2(x)

forward içinde nn.Linear oluşturmak her çağrıda yeni rastgele ağırlıklar üretir; model hiçbir şey öğrenemez.

Uygulama Kalıntı bloğu

Verilen Kalinti bloğunda l2'nin ağırlık ve sapmasını sıfırla (torch.no_grad() içinde zero_()). Bu durumda blok girdiyi değiştirmeden geçirmelidir; torch.equal(blok(x), x) sonucunu ve çıktı şeklini aynı satırda yazdır.

Başlangıç kodu

model.py
import torch
from torch import nn

class Kalinti(nn.Module):
    def __init__(self, d):
        super().__init__()
        self.l1 = nn.Linear(d, d)
        self.l2 = nn.Linear(d, d)

    def forward(self, x):
        return x + self.l2(torch.relu(self.l1(x)))

blok = Kalinti(6)
x = torch.randn(4, 6)

# buraya yaz

Örnek çözüm

model.py
import torch
from torch import nn

class Kalinti(nn.Module):
    def __init__(self, d):
        super().__init__()
        self.l1 = nn.Linear(d, d)
        self.l2 = nn.Linear(d, d)

    def forward(self, x):
        return x + self.l2(torch.relu(self.l1(x)))

blok = Kalinti(6)
x = torch.randn(4, 6)

with torch.no_grad():
    blok.l2.weight.zero_()
    blok.l2.bias.zero_()
    sonuc = blok(x)
print(torch.equal(sonuc, x), sonuc.shape)

Beklenen çıktı

True torch.Size([4, 6])

Soru ve cevaplar

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

1 Bir modülde geri yayılım nasıl tanımlanır?

  • Türevler elle girilir
  • optimize edici tanımlar
  • Tanımlanmaz; autograd forward'dan çıkarır Doğru cevap
  • backward yöntemi yazılır

Açıklama: forward'daki her tensör işlemi grafiğe kaydedilir.

2 İşlevsel ReLU uygula.

Soru
x = F.____(self.l1(x))
Cevap
x = F.relu(self.l1(x))

Açıklama: F.relu parametresiz bir fonksiyondur.

3 Kavramları eşleştir.

Kavram Anlamı
forward İleri hesap
F.relu İşlevsel aktivasyon
kalıntı x + f(x)
__init__ Parametreli katmanlar

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