CodeBlanks Logo Icon CodeBlanks

Feature extraction

Feature extraction, pre-trained modelin özellik çıkarımı katmanlarını döndürür.

Özellik çıkarımı

En basit transfer yöntemi: gövdeyi tamamen dondurup yalnızca yeni başı eğitmek. Gövde sabit bir özellik çıkarıcıya dönüşür; eğitim hızlıdır ve çok az veriyle bile çalışır:

for p in govde.parameters():
    p.requires_grad = False
model = nn.Sequential(govde, nn.Linear(32, 5))
opt = torch.optim.Adam(filter(lambda p: p.requires_grad, model.parameters()), lr=1e-3)

Daha da hızlı bir yol: tüm görüntülerin özelliklerini bir kez çıkarıp kaydetmek, sonra bu özelliklerde lojistik regresyon gibi basit bir model eğitmek.

Özellikleri önceden hesaplamak

Gövde donuk olduğundan her epoch'ta aynı özellikleri yeniden hesaplamak gereksizdir. Özellikler bir kez çıkarılır ve küçük bir model onlarla eğitilir:

govde.eval()
with torch.no_grad():
    F_train = govde(X_train)        # (N, 32)
    F_test = govde(X_test)
from sklearn.linear_model import LogisticRegression
clf = LogisticRegression(max_iter=1000).fit(F_train.numpy(), y_train.numpy())

Bu yöntem binlerce görüntüde bile birkaç saniye sürer; veri artırma kullanılamaması tek dezavantajıdır.

Uygulama Gövdeyi dondur

govde'yi dondur ve nn.Sequential(govde, nn.Linear(32, 5)) kur. Toplam ve eğitilebilir parametre sayılarını aynı satırda yazdır. Rastgele bir girdiyle kaybı (model(x).sum()) geri yay; ilk evrişimin ağırlık gradyanının None olduğunu ve başın gradyanının None olmadığını aynı satırda yazdır.

Başlangıç kodu

model.py
import torch
from torch import nn

torch.manual_seed(0)
govde = nn.Sequential(
    nn.Conv2d(3, 16, 3, padding=1), nn.ReLU(), nn.MaxPool2d(2),
    nn.Conv2d(16, 32, 3, padding=1), nn.ReLU(),
    nn.AdaptiveAvgPool2d(1), nn.Flatten())
bas = nn.Linear(32, 1000)
onceden = nn.Sequential(govde, bas)

x = torch.randn(2, 3, 16, 16)

# buraya yaz

Örnek çözüm

model.py
import torch
from torch import nn

torch.manual_seed(0)
govde = nn.Sequential(
    nn.Conv2d(3, 16, 3, padding=1), nn.ReLU(), nn.MaxPool2d(2),
    nn.Conv2d(16, 32, 3, padding=1), nn.ReLU(),
    nn.AdaptiveAvgPool2d(1), nn.Flatten())
bas = nn.Linear(32, 1000)
onceden = nn.Sequential(govde, bas)

x = torch.randn(2, 3, 16, 16)

for p in govde.parameters():
    p.requires_grad = False
model = nn.Sequential(govde, nn.Linear(32, 5))
print(sum(p.numel() for p in model.parameters()), sum(p.numel() for p in model.parameters() if p.requires_grad))
model(x).sum().backward()
print(govde[0].weight.grad is None, model[1].weight.grad is not None)

Beklenen çıktı

5253 165
True True

Soru ve cevaplar

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

1 Dondurulmuş gövdede geri yayılım sonrası gövde parametrelerinin <code>.grad</code> değeri nedir?

  • Hata
  • None Doğru cevap
  • Sıfır tensörü
  • Normal gradyan

Açıklama: requires_grad=False parametreler için gradyan hesaplanmaz.

2 Yalnızca eğitilebilir parametreleri optimize ediciye ver.

Soru
opt = torch.optim.Adam(____(lambda p: p.requires_grad, model.parameters()), lr=1e-3)
Cevap
opt = torch.optim.Adam(filter(lambda p: p.requires_grad, model.parameters()), lr=1e-3)

Açıklama: filter donuk parametreleri ayıklar.

3 Yöntemleri eşleştir.

Kavram Anlamı
özellik çıkarımı Gövde tamamen donuk
ince ayar Gövde de eğitilir
önceden hesaplama Özellikler bir kez çıkarılır
filter(requires_grad) Eğitilebilirleri seç

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