Feature extraction
- Makine Öğrenmesi kursu
- İleri seviye
- Ders 66/78
- 5 dk
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
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
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.
opt = torch.optim.Adam(____(lambda p: p.requires_grad, model.parameters()), lr=1e-3)
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ç |