Makine Öğrenmesi
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.
Örnek çözümü göster
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)
Kendini test et
-
Dondurulmuş gövdede geri yayılım sonrası gövde parametrelerinin <code>.grad</code> değeri nedir?
- Hata
- None
- Sıfır tensörü
- Normal gradyan
Cevabı göster
None — requires_grad=False parametreler için gradyan hesaplanmaz.
-
Yalnızca eğitilebilir parametreleri optimize ediciye ver.
opt = torch.optim.Adam(____(lambda p: p.requires_grad, model.parameters()), lr=1e-3)
Cevabı göster
opt = torch.optim.Adam(filter(lambda p: p.requires_grad, model.parameters()), lr=1e-3)
-
Yöntemleri eşleştir.
- ö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ç
Sıradaki ders: Avantajlar