PyTorch Kütüphanesi Nedir? Nasıl Kullanılır?

Yapay zekanın alt dallarından biri olan derin öğrenme üzerine yapılan araştırmalar gün geçtikçe artmakta. Çoğu alanda klasik makine öğrenmesi algoritmalarına kıyasla çok daha iyi performans ve doğruluk oranı sergileyen bu algoritmalar ses tanıma, görüntü sınıflandırma, nesne tanıma, doğal dil işleme gibi alanlarda aktif şekilde kullanılmaya devam etmekte. Bu derin öğrenme modellerini oluşturmak için de açık kaynak olarak geliştirilen birçok Python kütüphanesi mevcut. Daha önce Keras nedir? yazımızda bahsettiğimiz Keras kütüphanesi bunlara örnek olarak verilebilmekte. Keras dışında sıklıkla kullanılan, bizim için derin öğrenme modellerinde arkadaki matematiksel işlemleri yapan kütüphaneler mevcut. Bunların en meşhurları ise Tensorflow ve PyTorch. Bu yazımızda ise PyTorch üzerinde duracağız. PyTorch nedir ve PyTorch ile bir derin öğrenmesi modeli nasıl oluşturulur?

PyTorch Nedir?

PyTorch, derin öğrenme modelleri oluştururken geliştiricilerin işlerini oldukça kolaylaştıran bir Python kütüphanesidir. Grafik işlem birimlerini kullanan PyTorch sağladığı esneklik ve hız ile de günümüzde oldukça popüler konumdadır.

PyTorch’un başarısının arkasındaki en önemli nedenlerden biri, tamamen Pythonic olması ve sinir ağı modellerini zahmetsizce oluşturabilmesidir. PyTorch, diğer rakiplerine göre piyasada daha genç bir oyuncu olsa da mükemmel bir ivmeyle gelişmekte.

Neden PyTorch?

Derin öğrenme ve yapay zekada en fazla kullanılan kütüphaneler belki de Tensorflow ve PyTorch’tur. PyTorch, Tensorflow’un bugüne kadar ki en büyük rakibi. Peki neden PyTorch’u tercih etmeliyiz?

Dinamik Hesaplamalı Grafikler: PyTorch, Tensorflow gibi  çerçevelerde kullanılan statik grafiklerden kaçınır, böylece geliştiricilerin ve araştırmacıların ağın anında nasıl davrandığını değiştirmesine izin verir. İlk benimseyenler PyTorch’u tercih ediyor çünkü TensorFlow’a kıyasla öğrenmek biraz daha rahat.

Farklı Back-End Desteği: PyTorch, tek bir backend kullanmak yerine CPU, GPU ve çeşitli işlevsel özellikler için farklı backendler kullanır. 

Genişletilebilir: PyTorch, C ++ koduyla derinlemesine entegredir ve derin öğrenme çerçevesi Torch ile bazı C ++ backendlerini paylaşır. Böylece, kullanıcıların Python için cFFI’ye dayalı ve GPU işlemi için CPU için derlenmiş bir uzantı API’si kullanarak C / C ++ ‘da programlama yapmalarına izin verilir.

Numpy Dostu:  PyTorch , tümü GPU uyumlu olan hesaplamalar için NumPy benzeri tensör yapıları ile çalışır.

PyTorch ile Model Oluşturma

PyTorch ile model oluşturmaya başlamadan önce pip ile kurulum yapmamız gerekir. Bunun için terminale bu komutu girmeniz gerekmekte.

pip install torch torchvision

Model oluşturma kısmı Keras’a göre biraz daha karışık gelebilir. Fakat biraz derine inince aslında olayın çok da zor olmadığı anlaşılacak. İlk olarak gerekli kütüphanelerimizi projemize dahil ediyoruz.

import torch.nn as nn
import torch.nn.functional as F

Ağ Sınıfını Tanımlama

PyTorch’da bir sinir ağı oluşturmak için projeye dahil ettiğimiz nn modülünü kullanmamız gerekir. Gerekli kütüphanelerin projeye dahil edilmesinin ardından şimdi sinir ağı için sınıfı oluşturabiliriz.

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(28 * 28, 200)
        self.fc2 = nn.Linear(200, 200)
        self.fc3 = nn.Linear(200, 10)

Sinir ağı sınıfının tanımında görüldüğü üzere ana sınıf nn.Module’den miras aldık. Ardından sınıfı başlatmak için kullandığımız init fonksiyonun ilk satırında nn.Module sınıfının bir örneğini oluşturan gerekli super() fonksiyonuna sahibiz. Ardından gelen nn.Linear fonksiyonları ise sinir ağında birbirine bağlı katmanlar oluşturmak için kullanılır. İlk parametre girecek değerin sayısını ikinci parametre ise katmanda bulunan node (düğüm) sayısını temsil eder. Görüldüğü üzere oluşturduğumuz sinir ağı 28×28 boyutundaki verileri girdi olarak alır ve ilk katmanda 200 node’a sahiptir.

Şimdi ağ mimarimizin iskeletini oluşturduk. Ağı ayağa kaldırmak için bu verilerin ağ üzerinde nasıl akacağını tanımlamalıyız. Bunu Net sınıfımız içinde bir forward() fonksiyonu tanımlayarak yapacağız.

def forward(self,x):
    x = F.relu(self.fc1(x))
    x = F.relu(self.fc2(x))
    x = self.fc1(x)
    return F.log_softmax(x)

Oluşturduğumuz forward() metotu için x girdi değerini ana parametre olarak ayarladık. Ardından bu veriyle fc1 katmanımızı besledik ve F.relu() aktivasyon fonksiyonu ile aktif olacak kıvama getirdik. Ardından bu elde ettiğimiz sonuçla ikinci katmanı besledik ve ReLU aktivasyon fonksiyonunu uyguladık. Bu sonuçla da çıktı katmanımızı besledik fakat bu sefer ReLU yerine multi-class bir tahmin modeli için Softmax uyguladık. Artık sinir ağımızı oluşturduk ve bu sınıftan bir obje oluşturabiliriz.

net = Net()
print(net)

Yukarıdaki kod parçası şu şekilde bir çıktı verecektir.

pytorch-model

Bu aşamadan sonra ise bir optimizer ve loss criterion atamalıyız.

optimizer = optim.SGD(net.parameters(), lr = 0.001, momentum=0.9)
criterion = nn.NLLLoss()

İlk satırda bir SGD optimizer oluşturuyoruz ve öğrenme oranını 0.001, momentumu 0.9 olarak belirliyoruz. Optimizerımıza sağlamamız gereken diğer bileşen ise ağımızın parametreleri bunları da veriyoruz. Ardından loss fonksiyonumuzu negative log likelihood loss olarak belirliyoruz.

Modeli Eğitme

Bunların ardından modeli eğitme aşamasına geliyoruz. Şu aşamada bir veriye sahip olmadığımız için bir dataloader kullandığımızı varsayacağız. Kodun tam halini görmek için bu repoya bakabilirsiniz.

for epoch in range(epochs):
        optimizer.zero_grad()
        net_out = net(data)
        loss = criterion(net_out, target)
        loss.backward()
        optimizer.step()
        print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
                    epoch, batch_idx * len(data), len(train_loader.dataset),
                           100. * batch_idx / len(train_loader), loss.data[0]))

İlk olarak modelimizi epoch sayısı kadar eğitiyoruz. Ardından optimizer.zero_grad() fonksiyonu ile modeldeki tüm gradyanları sıfırlıyoruz ve bununla birlikte bir sonraki back propogation’a (geri yayılım) hazır oluyoruz. Model her epochta gerekli değerleri printliyor ve modelimiz hazır hale geliyor.

Yüzeysel olarak PyTorch nedir sorusunu cevaplamaya çalıştık. Eğer daha detaylı olarak PyTorch kütüphanesi hakkında bilgi almak istiyorsanız dokümantasyonları inceleyebilirsiniz.

Teknoloji'den geri kalmamak için e-posta listemize abone olun!

Özgür Doğan (Okunuşu: Özgür Do:an) : Teknoloji içerikleri yazmayı ve okumayı seven kişi, kimse, topluluk.