CodeBlanks Logo Icon CodeBlanks

Transfer öğrenme nedir?

Transfer öğrenme, önceden eğitilmiş bir modeli yeni göreve uyarlar.

Transfer öğrenme nedir?

Transfer öğrenme, büyük bir veri setinde (ImageNet'in 1.2 milyon görüntüsü gibi) eğitilmiş bir modelin öğrendiklerini yeni ve genellikle küçük bir probleme taşımaktır. Alt katmanlar kenar, doku, şekil gibi genel özellikleri öğrendiği için bu bilgi başka görevlerde de işe yarar.

import torchvision
model = torchvision.models.resnet18(weights="IMAGENET1K_V1")   # önceden eğitilmiş
model.fc = nn.Linear(model.fc.in_features, 5)                  # 5 sınıflı yeni görev

Birkaç yüz görüntüyle sıfırdan eğitilen bir CNN zayıf kalırken, önceden eğitilmiş bir modelden başlamak çoğu zaman yüksek doğruluk verir.

Gövde ve baş

Bir sınıflandırma ağı iki parçadan oluşur: özellik çıkaran gövde (backbone) ve bu özelliklerden sınıf skorları üreten baş (head). Transfer öğrenmede gövde korunur, baş yeni görevin sınıf sayısına göre değiştirilir:

# önceden eğitilmiş: govde -> Linear(512, 1000)  (ImageNet'in 1000 sınıfı)
# yeni görev:        govde -> Linear(512, 5)     (yeni baş, rastgele başlar)

Gövdenin son katmanı sınıfa özgüyken alt katmanlar daha geneldir; ne kadarının yeniden eğitileceği veri miktarına göre seçilir.

Uygulama Başı değiştir

"Önceden eğitilmiş" bir modeli taklit eden onceden (gövde + 1000 sınıflı baş) verildi. Yeni bir model kur: aynı govde ve nn.Linear(bas.in_features, 5). (4, 3, 32, 32) girdinin eski ve yeni çıktı şekillerini alt alta 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.zeros(4, 3, 32, 32)

# 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.zeros(4, 3, 32, 32)

yeni = nn.Sequential(govde, nn.Linear(bas.in_features, 5))
print(onceden(x).shape)
print(yeni(x).shape)

Beklenen çıktı

torch.Size([4, 1000])
torch.Size([4, 5])

Soru ve cevaplar

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

1 Transfer öğrenme en çok hangi durumda fark yaratır?

  • Yeni görevde az etiketli veri varken Doğru cevap
  • Milyonlarca etiketli örnek varken
  • Veri tablo biçimindeyken
  • Hiçbir zaman

Açıklama: Önceden öğrenilmiş genel özellikler, az veriyle öğrenilemeyecek bilgiyi sağlar.

2 Yeni görev için baş katmanını değiştir.

Soru
model.fc = nn.Linear(model.fc.____, 5)
Cevap
model.fc = nn.Linear(model.fc.in_features, 5)

Açıklama: in_features eski başın girdi boyutudur; gövdenin çıktısıdır.

3 Kavramları eşleştir.

Kavram Anlamı
gövde Genel özellikler
baş Göreve özgü sınıflandırıcı
önceden eğitilmiş Büyük veride öğrenilmiş
in_features Gövde çıktı boyutu

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