Derin öğrenme, yapay zekanın (AI) en heyecan verici ve hızla gelişen alanlarından biridir. Bu alanda, PyTorch, esnekliği, kullanım kolaylığı ve güçlü topluluğu sayesinde öne çıkan bir kütüphanedir. Bu kapsamlı rehber, PyTorch'un temellerinden başlayarak, ileri düzey konulara kadar derinlemesine bir yolculuk sunmayı amaçlamaktadır. Amacımız, okuyucunun PyTorch'u tam olarak anlaması ve derin öğrenme projelerinde etkin bir şekilde kullanabilmesi için gerekli tüm bilgileri sağlamaktır.
1. PyTorch'a Giriş
1.1. PyTorch Nedir?
PyTorch, Facebook'un Yapay Zeka Araştırma laboratuvarı (FAIR) tarafından geliştirilen açık kaynaklı bir makine öğrenimi kütüphanesidir. Temel olarak Python programlama dilinde yazılmıştır ve özellikle derin öğrenme uygulamaları için tasarlanmıştır. Dinamik hesaplama grafikleri, GPU hızlandırması ve geniş bir araç ve kütüphane ekosistemi sunarak, araştırmacılar ve geliştiriciler arasında popüler hale gelmiştir.
1.2. Neden PyTorch?
PyTorch'un diğer derin öğrenme kütüphanelerine (TensorFlow, Keras vb.) göre birçok avantajı vardır:
- Dinamik Hesaplama Grafikleri: PyTorch, dinamik hesaplama grafiklerini destekler, bu da modelin çalışma zamanında tanımlanabileceği ve değiştirilebileceği anlamına gelir. Bu özellik, karmaşık ve değişken yapılı modellerin oluşturulmasını kolaylaştırır.
- Pythonic Yapı: PyTorch, Python dilinin doğal yapısına çok yakındır. Bu, Python ile deneyimli geliştiricilerin PyTorch'u hızlı bir şekilde öğrenmesini ve kullanmasını sağlar.
- GPU Hızlandırması: PyTorch, NVIDIA CUDA desteği sayesinde GPU'lar üzerinde yüksek performanslı hesaplama yapabilir. Bu, büyük veri kümeleri ve karmaşık modellerle çalışırken önemli bir avantaj sağlar.
- Geniş Topluluk ve Ekosistem: PyTorch, aktif bir topluluğa sahiptir ve çeşitli araçlar, kütüphaneler ve önceden eğitilmiş modeller sunar. Bu, geliştirme sürecini hızlandırır ve projelerde kolaylık sağlar.
- Araştırma Dostu: PyTorch, esnekliği ve özelleştirilebilirliği sayesinde araştırmacılar arasında popülerdir. Yeni algoritmaların ve modellerin prototiplenmesi ve denenmesi için ideal bir platformdur.
1.3. PyTorch'un Temel Bileşenleri
PyTorch'un temel bileşenleri şunlardır:
- Tensor'lar: PyTorch'un temel veri yapısıdır. Çok boyutlu dizileri temsil eder ve NumPy dizilerine benzer. Tensor'lar, GPU üzerinde hesaplama yapabilir ve otomatik türevlendirme için kullanılabilir.
- Autograd: PyTorch'un otomatik türevlendirme motorudur. Modelin parametrelerini optimize etmek için gradyanları otomatik olarak hesaplar.
- nn Modülü: Sinir ağlarını oluşturmak için kullanılan bir modüldür. Katmanlar, aktivasyon fonksiyonları ve kayıp fonksiyonları gibi temel yapı taşlarını içerir.
- Optim Modülü: Modelin parametrelerini optimize etmek için kullanılan bir modüldür. Çeşitli optimizasyon algoritmalarını (SGD, Adam, RMSprop vb.) içerir.
- DataLoader: Veri kümelerini yüklemek ve işlemek için kullanılan bir araçtır. Verileri mini-batch'lere böler ve paralel olarak yükler.
2. PyTorch ile Derin Öğrenmeye Başlangıç
2.1. Kurulum ve Ortam Hazırlığı
PyTorch'u kurmak için aşağıdaki adımları izleyebilirsiniz:
- Python ve pip'in kurulu olduğundan emin olun.
- PyTorch'u pip ile yükleyin:
pip install torch torchvision torchaudio
CUDA desteği istiyorsanız, NVIDIA sürücülerinin ve CUDA Toolkit'in kurulu olduğundan emin olun ve aşağıdaki komutu kullanın:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
Buradaki "cu118" CUDA sürümünü temsil eder. Sisteminizde kurulu olan CUDA sürümüne göre bu değeri değiştirebilirsiniz.
- Kurulumu doğrulayın:
import torch print(torch.__version__) print(torch.cuda.is_available())
Bu kod, PyTorch sürümünü ve CUDA'nın kullanılabilir olup olmadığını yazdırır.
2.2. Temel Tensor İşlemleri
Tensor'lar, PyTorch'un temel veri yapısıdır. İşte bazı temel tensor işlemleri:
- Tensor oluşturma:
import torch # Boş bir tensor oluşturma x = torch.empty(5, 3) print(x) # Rastgele sayılarla dolu bir tensor oluşturma x = torch.rand(5, 3) print(x) # Sıfırlarla dolu bir tensor oluşturma x = torch.zeros(5, 3, dtype=torch.long) print(x) # Doğrudan veriden bir tensor oluşturma x = torch.tensor([5.5, 3]) print(x)
- Tensor boyutunu değiştirme:
x = torch.randn(4, 4) y = x.view(16) z = x.view(-1, 8) # -1, boyutun otomatik olarak çıkarılmasını sağlar print(x.size(), y.size(), z.size())
- Tensor aritmetik işlemleri:
x = torch.rand(5, 3) y = torch.rand(5, 3) # Toplama z = x + y print(z) # Çıkarma z = x - y print(z) # Çarpma z = x * y print(z) # Bölme z = x / y print(z)
2.3. Otomatik Türevlendirme (Autograd)
PyTorch'un otomatik türevlendirme motoru (Autograd), gradyanları otomatik olarak hesaplar. Bu, modelin parametrelerini optimize etmek için gereklidir.
import torch
x = torch.ones(2, 2, requires_grad=True)
print(x)
y = x + 2
print(y)
z = y * y * 3
out = z.mean()
print(z, out)
out.backward()
print(x.grad)
Bu kod, x
tensor'unun gradyanını hesaplar. requires_grad=True
, tensor'un gradyanının takip edilmesini sağlar. out.backward()
, gradyanları hesaplar ve x.grad
, x
tensor'unun gradyanını içerir.
3. Sinir Ağları Oluşturma
3.1. nn Modülü
PyTorch'un nn
modülü, sinir ağlarını oluşturmak için kullanılan bir modüldür. Katmanlar, aktivasyon fonksiyonları ve kayıp fonksiyonları gibi temel yapı taşlarını içerir.
3.2. Basit Bir Sinir Ağı Örneği
İşte basit bir sinir ağı örneği:
import torch
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
# 1 giriş kanalı, 6 çıkış kanalı, 3x3 konvolüsyon çekirdeği
self.conv1 = nn.Conv2d(1, 6, 3)
self.conv2 = nn.Conv2d(6, 16, 3)
# Tam bağlantılı katman: 6*6 resim boyutundan 120 nörona
self.fc1 = nn.Linear(16 * 6 * 6, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
# (2, 2) boyutunda bir maksimum havuz üzerinde havuzlama
x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
# Boyut kare ise sadece bir sayı belirtebilirsiniz
x = F.max_pool2d(F.relu(self.conv2(x)), 2)
x = torch.flatten(x, 1) # tüm boyutları 'düzleştir' (batch boyutunun haricinde)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
net = Net()
print(net)
Bu kod, iki konvolüsyon katmanı ve üç tam bağlantılı katmanı olan bir sinir ağı tanımlar.
3.3. Kayıp Fonksiyonları ve Optimizasyon
Modelin performansını değerlendirmek için kayıp fonksiyonları kullanılır. PyTorch, çeşitli kayıp fonksiyonları sunar:
- nn.MSELoss: Ortalama karesel hata
- nn.CrossEntropyLoss: Çapraz entropi kaybı
- nn.L1Loss: Mutlak hata
Modelin parametrelerini optimize etmek için optimizasyon algoritmaları kullanılır. PyTorch, çeşitli optimizasyon algoritmaları sunar:
- torch.optim.SGD: Stokastik gradyan inişi
- torch.optim.Adam: Adam optimizasyonu
- torch.optim.RMSprop: RMSprop optimizasyonu
import torch.optim as optim
# Optimizasyon algoritması oluşturma
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
# Kayıp fonksiyonu oluşturma
criterion = nn.CrossEntropyLoss()
4. Veri Yükleme ve İşleme
4.1. DataLoader
PyTorch'un DataLoader
sınıfı, veri kümelerini yüklemek ve işlemek için kullanılan bir araçtır. Verileri mini-batch'lere böler ve paralel olarak yükler.
4.2. Özel Veri Kümeleri Oluşturma
Kendi veri kümelerinizi oluşturmak için torch.utils.data.Dataset
sınıfını kullanabilirsiniz. Bu sınıf, __len__
ve __getitem__
metodlarını içermelidir.
import torch
from torch.utils.data import Dataset, DataLoader
class CustomDataset(Dataset):
def __init__(self, data, labels):
self.data = data
self.labels = labels
def __len__(self):
return len(self.data)
def __getitem__(self, idx):
return self.data[idx], self.labels[idx]
# Veri oluşturma
data = torch.randn(100, 10)
labels = torch.randint(0, 2, (100,))
# Veri kümesi oluşturma
dataset = CustomDataset(data, labels)
# Veri yükleyici oluşturma
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)
# Verileri yineleme
for batch in dataloader:
inputs, targets = batch
print(inputs.size(), targets.size())
5. Model Eğitimi ve Değerlendirme
5.1. Eğitim Döngüsü
Modeli eğitmek için aşağıdaki adımları içeren bir eğitim döngüsü oluşturulur:
- Verileri yükleyin.
- Modelin tahminlerini yapın.
- Kayıp fonksiyonunu hesaplayın.
- Gradyanları hesaplayın.
- Parametreleri güncelleyin.
for epoch in range(2): # Veri kümesi üzerinde birden fazla geçiş yapın
running_loss = 0.0
for i, data in enumerate(dataloader, 0):
# Girişleri ve etiketleri alın
inputs, labels = data
# Parametre gradyanlarını sıfırlayın
optimizer.zero_grad()
# İleri geçiş + geri geçiş + optimize etme
outputs = net(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
# İstatistikleri yazdırın
running_loss += loss.item()
if i % 2000 == 1999: # Her 2000 mini-batch'te bir yazdırın
print(f'[{epoch + 1}, {i + 1:5d}] loss: {running_loss / 2000:.3f}')
running_loss = 0.0
print('Eğitim Tamamlandı')
5.2. Model Değerlendirme
Modeli eğitildikten sonra, performansını değerlendirmek için bir test veri kümesi kullanılır.
correct = 0
total = 0
# gradyanları hesaplamaya gerek yok
with torch.no_grad():
for data in testloader:
images, labels = data
# ağdaki görüntüleri hesaplayarak çıktıları elde edin
outputs = net(images)
# tahmin edilen sınıfı elde etmek için en yüksek enerjiye sahip sınıfı seçin
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
print(f'Ağın test görüntülerindeki doğruluğu: {100 * correct // total} %')
6. İleri Düzey Konular
6.1. Transfer Öğrenimi
Transfer öğrenimi, önceden eğitilmiş bir modeli yeni bir görev için kullanma işlemidir. Bu, daha az veriyle daha iyi sonuçlar elde etmenizi sağlar.
6.2. GPU Kullanımı
PyTorch, GPU'lar üzerinde yüksek performanslı hesaplama yapabilir. Modeli ve verileri GPU'ya taşımak için .to()
metodunu kullanabilirsiniz.
device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
# Modeli GPU'ya taşıma
net.to(device)
# Verileri GPU'ya taşıma
inputs, labels = inputs.to(device), labels.to(device)
6.3. Model Kaydetme ve Yükleme
Modeli kaydetmek ve yüklemek için torch.save()
ve torch.load()
fonksiyonlarını kullanabilirsiniz.
# Modeli kaydetme
torch.save(net.state_dict(), 'model.pth')
# Modeli yükleme
net = Net()
net.load_state_dict(torch.load('model.pth'))
net.eval()
7. Gerçek Hayattan Örnekler ve Vaka Çalışmaları
7.1. Görüntü Sınıflandırma
PyTorch, görüntü sınıflandırma görevleri için yaygın olarak kullanılır. Örneğin, CIFAR-10 veri kümesi üzerinde bir görüntü sınıflandırma modeli eğitilebilir.
7.2. Doğal Dil İşleme (NLP)
PyTorch, doğal dil işleme görevleri için de kullanılır. Örneğin, metin sınıflandırma, makine çevirisi ve metin oluşturma gibi görevler için modeller eğitilebilir.
7.3. Nesne Tespiti
PyTorch, nesne tespiti görevleri için de kullanılır. Örneğin, YOLO ve Faster R-CNN gibi nesne tespiti modelleri PyTorch ile uygulanabilir.
8. Görsel Açıklamalar
Şema: Basit bir sinir ağının yapısı
Bir sinir ağı, giriş katmanı, gizli katmanlar ve çıkış katmanından oluşur. Her katman, nöron adı verilen düğümlerden oluşur. Nöronlar, ağırlıklar ve bias'lar aracılığıyla birbirine bağlanır. Giriş verileri, giriş katmanına verilir ve katmanlar arasında işlenerek çıkış katmanında tahminler üretilir.
Grafik: Eğitim sırasında kayıp fonksiyonunun değişimi
Eğitim sırasında, modelin performansı kayıp fonksiyonu ile ölçülür. Kayıp fonksiyonu, modelin tahminleri ile gerçek değerler arasındaki farkı gösterir. Eğitim sırasında kayıp fonksiyonu azalır, bu da modelin performansının arttığını gösterir.
9. Sık Sorulan Sorular
- PyTorch hangi programlama dilinde yazılmıştır?
PyTorch, temel olarak Python programlama dilinde yazılmıştır.
- PyTorch, TensorFlow'dan daha mı iyi?
PyTorch ve TensorFlow, her ikisi de güçlü derin öğrenme kütüphaneleridir. Hangi kütüphanenin daha iyi olduğu, projenin gereksinimlerine ve geliştiricinin tercihlerine bağlıdır. PyTorch, dinamik hesaplama grafikleri ve Pythonic yapısı nedeniyle araştırmacılar arasında popülerdir. TensorFlow ise, daha geniş bir dağıtım ve üretim ortamı desteği sunar.
- PyTorch'u öğrenmek ne kadar sürer?
PyTorch'u öğrenmek, kişinin önceden makine öğrenimi ve Python bilgisine bağlıdır. Temel Python bilgisi olan biri, PyTorch'un temellerini birkaç hafta içinde öğrenebilir. Ancak, ileri düzey konuları ve karmaşık modelleri öğrenmek daha uzun sürebilir.
- PyTorch ile neler yapılabilir?
PyTorch ile görüntü sınıflandırma, nesne tespiti, doğal dil işleme, makine çevirisi, metin oluşturma, ses işleme ve daha birçok derin öğrenme uygulaması geliştirilebilir.
- CUDA nedir ve neden PyTorch'ta önemlidir?
CUDA, NVIDIA tarafından geliştirilen paralel hesaplama platformu ve API modelidir. PyTorch, CUDA desteği sayesinde NVIDIA GPU'lar üzerinde yüksek performanslı hesaplama yapabilir. Bu, özellikle büyük veri kümeleri ve karmaşık modellerle çalışırken önemlidir, çünkü GPU'lar CPU'lara göre çok daha hızlı hesaplama yapabilir.
10. Sonuç ve Özet
PyTorch, esnekliği, kullanım kolaylığı ve güçlü topluluğu sayesinde derin öğrenme alanında öne çıkan bir kütüphanedir. Bu rehberde, PyTorch'un temellerinden başlayarak, ileri düzey konulara kadar derinlemesine bir yolculuk yaptık. Amacımız, okuyucunun PyTorch'u tam olarak anlaması ve derin öğrenme projelerinde etkin bir şekilde kullanabilmesi için gerekli tüm bilgileri sağlamaktı. Umarım bu rehber, PyTorch ile derin öğrenmeye başlamak için size bir başlangıç noktası olmuştur ve gelecekteki projelerinizde size yardımcı olacaktır.
Önemli Noktalar:
- PyTorch, dinamik hesaplama grafiklerini destekler.
- PyTorch, Pythonic bir yapıya sahiptir.
- PyTorch, GPU hızlandırmasını destekler.
- PyTorch, geniş bir topluluğa ve ekosisteme sahiptir.
- PyTorch, araştırma dostu bir kütüphanedir.
Tablo 1: PyTorch ve TensorFlow Karşılaştırması
Özellik | PyTorch | TensorFlow |
---|---|---|
Hesaplama Grafiği | Dinamik | Statik (TensorFlow 1.x), Dinamik (TensorFlow 2.x) |
Kullanım Kolaylığı | Daha Pythonic, daha kolay öğrenilebilir | Daha karmaşık, daha dik öğrenme eğrisi |
Topluluk | Aktif ve büyüyen | Daha büyük ve köklü |
Dağıtım | Daha esnek, daha kolay dağıtılabilir | Daha geniş dağıtım seçenekleri |
Araştırma | Araştırmacılar arasında daha popüler | Endüstriyel uygulamalarda daha yaygın |
Tablo 2: PyTorch Temel Bileşenleri
Bileşen | Açıklama |
---|---|
Tensor | Çok boyutlu dizileri temsil eden temel veri yapısı |
Autograd | Otomatik türevlendirme motoru |
nn Modülü | Sinir ağlarını oluşturmak için kullanılan modül |
Optim Modülü | Modelin parametrelerini optimize etmek için kullanılan modül |
DataLoader | Veri kümelerini yüklemek ve işlemek için kullanılan araç |