• Yapay zeka soru ve sorunlarınızı uygun olan kategorilere açıp yanıt alabilirsiniz...

PyTorch ile otokodlayıcı nasıl kurulur?

Garfield

YZF Admin
Yaş
40
Konum
YurtDışı
Katılım
27 Eki 2026
Konular
664
Mesajlar
689
AI Seviyesi
Yeni
PyTorch ile otokodlayıcı kurarken bir encoder, dar bir temsil katmanı ve decoder tanımlayın; modeli girdisini yeniden üretmesi için eğitin. Encoder veriyi daha küçük bir temsile dönüştürür, decoder bu temsilden başlangıçtaki özellikleri tahmin eder. Bu rehberde dört sayısal özelliği iki boyutlu bir darboğazdan geçirip yeniden dört özellik üreten küçük bir ağ kuracağız.

Örnek CPU üzerinde, PyTorch'un kurulu olduğu Python ortamında tek dosya olarak çalışır; veri veya model indirmez. Dört sentetik özellik iki rastgele değişkenden türetilir. Bu deney gerçek veride başarı veya dosya sıkıştırma oranı göstermez.

Girdi, hedef ve darboğaz nasıl seçilir?​


Her örnek dört kayan noktalı sayı içerir. Ağın encoder bölümü bu dört değeri iki sayıya indirir; decoder bölümü tekrar dört sayı üretir. Eğitimde sınıf etiketi kullanmayacağız: hedef, ağa verilen örneğin kendisidir. MSELoss ile tahmin ve hedef arasındaki karesel farkların ortalamasını küçülteceğiz.

Veriyi önce eğitim ve test olarak ayıracağız. Ortalama ve standart sapmayı yalnız eğitim bölümünden hesaplayıp iki bölüme de aynı dönüşümü uygulayacağız. Test verisini ölçekleme kurallarını öğrenmek için kullanmak değerlendirmeye bilgi sızdırır. Gerçek veride aynı kişiye ait kayıtlar veya zaman bağımlılığı varsa bu örnekteki rastgele ayırmayı doğrudan kopyalamayın; kayıtların ilişkisini koruyan bir ayırma seçin.

Çalışan PyTorch otokodlayıcı örneği​


Aşağıdaki kod eğitim yapar, ayrılmış test verisindeki yeniden oluşturma hatasını hesaplar ve şekilleri gösterir:

Python:
import torch
from torch import nn
from torch.utils.data import DataLoader, TensorDataset

torch.manual_seed(42)

# Iki bagimsiz degiskenden dort iliskili ozellik uret.
z = torch.randn(320, 2, dtype=torch.float32)
x = torch.stack((z[:, 0], z[:, 1],
                 z[:, 0] + z[:, 1], z[:, 0] - z[:, 1]), dim=1)
order = torch.randperm(len(x))
train_raw = x[order[:256]]
test_raw = x[order[256:]]

mean = train_raw.mean(dim=0)
scale = train_raw.std(dim=0, correction=0).clamp_min(1e-6)
train_x = (train_raw - mean) / scale
test_x = (test_raw - mean) / scale
loader = DataLoader(TensorDataset(train_x), batch_size=64,
                    shuffle=True, num_workers=0)

class Autoencoder(nn.Module):
    def __init__(self):
        super().__init__()
        self.encoder = nn.Sequential(
            nn.Linear(4, 8), nn.ReLU(), nn.Linear(8, 2))
        self.decoder = nn.Sequential(
            nn.Linear(2, 8), nn.ReLU(), nn.Linear(8, 4))

    def forward(self, inputs):
        return self.decoder(self.encoder(inputs))

model = Autoencoder().cpu()
criterion = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)

model.train()
for epoch in range(200):
    for (batch,) in loader:
        optimizer.zero_grad(set_to_none=True)
        reconstructed = model(batch)
        assert reconstructed.shape == batch.shape
        loss = criterion(reconstructed, batch)
        loss.backward()
        optimizer.step()

model.eval()
with torch.inference_mode():
    encoded = model.encoder(test_x)
    reconstructed = model(test_x)
    test_mse = criterion(reconstructed, test_x).item()
    restored = reconstructed * scale + mean

print("Girdi:", tuple(test_x.shape))
print("Temsil:", tuple(encoded.shape))
print("Yeniden olusturma:", tuple(reconstructed.shape))
print("Test MSE (standart olcek):", round(test_mse, 6))
print("Ilk orijinal:", test_raw[0])
print("Ilk tahmin:", restored[0])

Girdi ve yeniden oluşturma şekli (64, 4), ara temsilin şekli (64, 2) olmalıdır. Son iki satır aynı örneğin orijinal ölçekteki gerçek ve tahmin edilen değerlerini karşılaştırır. MSE ise standartlaştırılmış ölçekte hesaplanır; orijinal birimdeki hata gibi yorumlamayın. Kayıp sayısının birebir aynı çıkmasını sürüm ve ortamlar arasında garanti etmeyin.

Ağın parçaları hangi işi yapıyor?​

ParçaÖrnekteki göreviKontrol edilecek nokta
EncoderDört özelliği iki değerle temsil eder.Girdi özellik sayısı ilk Linear katmanıyla eşleşmeli.
DarboğazÖrnek başına iki sayı tutar.Çok dar temsil bilgi kaybını artırabilir.
DecoderDört özelliği yeniden tahmin eder.Çıktı ve hedef şekilleri aynı olmalı.
KayıpGirdi ile yeniden oluşturmayı karşılaştırır.Büyük ölçekli özelliklerin baskınlığını inceleyin.

Neden son katmanda sigmoid yok?​


Standartlaştırılmış girdiler negatif olabilir ve sıfır ile bir arasına sınırlandırılmaz. Son katmana sigmoid eklemek çıktıyı bu aralıkla kısıtlayarak bu hedeflerin bir bölümünü temsil etmeyi engeller. Bu nedenle decoder doğrusal çıktıyla biter. Gerçekten sıfır ile bir arasında hedefleriniz varsa uygun çıktı aktivasyonunu ayrıca değerlendirin; otokodlayıcı olduğu için her veri türüne otomatik sigmoid eklemeyin.

Kaybı düşürmek tek başına yeterli mi?​


Eğitim hatasının düşmesi modelin yeni örnekleri iyi temsil ettiğini kanıtlamaz. Bu örnekte eğitim turu sayısı baştan sabittir ve test yalnız eğitim sonunda kullanılır. Katman sayısını, öğrenme hızını veya tur sayısını seçerken ayrıca doğrulama kümesi ayırın; test sonucuna bakıp tekrar tekrar ayar seçmeyin. Boyut indirgemede PCA ile de karşılaştırın.

Girdi ve hedef şekillerinin eşitliğini koruyun; bazı uyumsuz şekiller yayınlama nedeniyle hata yerine istenmeyen bir karşılaştırma üretebilir. Kayıp NaN olursa önce eksik veya sonsuz değerleri, ölçeklemeyi ve öğrenme hızını kontrol edin. Bu kodun standartlaştırması eksik değer temizliği yapmaz. Modeli saklarken eğitimden hesaplanan ortalama ve ölçeği de koruyun; yeni örneklerde aynı dönüşüm gerekir.

Sık sorulan sorular​

Etiket yoksa model neyi öğrenir?​

Girdinin yapısını yeniden oluşturma hedefi üzerinden öğrenir. Bu düzende hedef sınıf numarası değil girdinin kendisidir. İki sayılık temsilin insan tarafından adlandırılabilir özellikler taşıması garanti değildir.

Bu kod görüntülerde de kullanılabilir mi?​

Görüntüye geçerken giriş ve çıkış boyutları, piksel ölçeği ve çoğunlukla ağ mimarisi değişir. Dört girişli bu katmana doğrudan görüntü veremezsiniz.

eval çağrısı gradyan hesabını kapatır mı?​

Hayır. Değerlendirme davranışını seçmek için model.eval(), değerlendirme sırasında gradyan kaydını kapatmak için burada torch.inference_mode() kullanılır. Bu ağda Dropout veya BatchNorm olmasa da iki görev ayrıdır.

Katmanların ve kaybın sözleşmeleri için Linear, MSELoss ve inference_mode resmî belgelerine bakabilirsiniz.
 

Sen de şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic
Geri
Üst