Garfield
YZF Admin
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.
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.
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.
Aşağıdaki kod eğitim yapar, ayrılmış test verisindeki yeniden oluşturma hatasını hesaplar ve şekilleri gösterir:
Girdi ve yeniden oluşturma şekli
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.
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.
Ö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örevi | Kontrol edilecek nokta |
|---|---|---|
| Encoder | Dö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. |
| Decoder | Dört özelliği yeniden tahmin eder. | Çıktı ve hedef şekilleri aynı olmalı. |
| Kayıp | Girdi 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
Katmanların ve kaybın sözleşmeleri için Linear, MSELoss ve inference_mode resmî belgelerine bakabilirsiniz.
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.