Pytorch Chapter 1.1
“Zero To Hero” konsept kapsamında ilk düzenli blog yazıma Pytorch ile başlamayı uygun gördüm. Öğrendiklerimi aktarabilmek ve dijital dünyada özellikle Türkçe içerik bırakabilmek gibi bir amaca hizmet etmesini istediğim yazılarımın ilk serisine Pytorch ile başlayarak haftalık öğrenme notları paylaşıyor olacağım. Kodları daha rahat bir şekilde çalıştırmak için Google Colab’tan faydalanabilirsiniz.
Bu başlık altına geldiyseniz, “Neden Pytorch?” veya “Pytorch vs Tensorflow” gibi soruların bir kısmını kendi içinizde cevaplamış olduğunuzu düşünerek devam edeceğim. Bu konuda internette binlerce kaynaktan bilgi alabilir ve dilediğiniz frameworkü seçerek yapay zeka kariyerinize devam edebilirsiniz. Şunu belirtmek isterim ki yazı boyunca Pytorch övgüsü yapılmayacak, Tensorflow yergisi yapılmayacak (?) :) veya bu frameworklerin tarihçeleri hakkında bilgiler verilmeyecektir. Şimdi hazırsanız ilk konumuza başlayalım. “Tensors”.
Introduction to Tensors
Tensör tanım olarak çok boyutlu matematiksel verileri ifade edebilen geometrik bir nesnedir. Tensorlar, özellikle matematiksel hesaplamalar ve makine öğrenimi gibi alanlarda yaygın olarak kullanılır. Özellikle yapay sinir ağları gibi derin öğrenme modelleri, verileri temsil etmek ve işlemek için tensorları kullanır. Aşağıdaki görsele bakarsak daha önce görmeye alışık olduğumuz matrix , vector kavramları üzerinden Tensor konseptinin ne olduğuna dair aklımızda daha somut bir şeyler canlanacaktır.
Creating Tensors
Yukarıdaki görselde scalar, vector, matrix, tensor gibi kavramları görsel olarak görerek anlamış olduk. Gelin bu yapıları Pytorch kullanarak nasıl oluşturacağımıza göz atalım.
PyTorch ile bu yapıları oluşturmak için ‘torch.Tensor()’ methodunu kullanırız.
Scalar
import torch
scalar = torch.tensor(7)
Vector
import torch
vector = torch.tensor([7,7])
Matrix
import torch
MATRIX = torch.tensor([[7,8],
[9,10]])
Introduction to Tensors başlığında yer alan görselden faydalanarak scalar, vector, matrix gibi veri yapılarının PyTorch kütüphanesini kullanarak nasıl oluşturulduğunu öğrendik. Peki bu yapıların dimesion ve shape’leri hakkında bilgi alarak birbirleri arasındaki farkları daha iyi anlasak nasıl olur?
print(f"Shape of Scalar: {scalar.shape}, Ndim of Scalar: {scalar.ndim} ")
print(f"Shape of Vector: {vector.shape}, Ndim of Vector: {vector.ndim} ")
print(f"Shape of Matrix: {MATRIX.shape}, Ndim of Scalar: {MATRIX.ndim} ")
Scalar’ın bir dimension’ı ve shape’inin olmaması bize onun sadece sıradan bir sayı olduğunun bilgisini veriyor. Bunun yanı sıra bir vector’ün bir dimension’a sahip olduğunu görebiliyoruz. Shape’inin de 2 olduğunu doğrulayabiliyoruz çünkü biz gerçekten tek boyutlu ve içinde 2 tane sayıdan oluşan bir vector yarattık. Matrix ise bu vectorlerin bir araya gelmesiyle oluşan bir yapı. Biz 2 vectorden oluşan ve bu 2 vector’ün içinde 2 scalar değer oluşan bir matrix kurduk. Bundan dolayı shape’imiz [2,2] olmuş oldu.
Vektör’ü bir evin oda ve banyo sayısını belirten matematiksel bir terim olarak ele alalım. Yukarıdaki örneğimizde 7 oda ve 7 banyo dedik. Buradan 1 vektörün 1 evinde oda ve banyo sayısını belirttiğini anladıktan sonra, Matrix örneğimize geçelim. Yukarıda oluşturduğumuz matrix bize 2 farklı evin oda ve banyo sayısını vermiş olacaktır. Shape’in [2,2] olma sebebini uygulamalı olarak bu şekilde ifade edebiliriz, veya lise matematik bilgilerimizden içine 2x2 bir matrix verdiğimizi de doğrudan kestirebiliriz. Peki tensörler?
Tensör
import torch
TENSOR = torch.tensor([[[1,2,3],
[4,5,6],
[7,8,9]]])
Tensör konseptine geçtiğimizde boyutları arttırdığımız için işlerin biraz daha kızıştığını hissedebiliriz. Halbuki ilk başlık altındaki görselde gördüğümüz yapıyı kurmaktan başka bir şey yapmadık. Yukarıdaki örneklerden yola çıkarak bu oluşturduğumuz tensörün shape’i ve ndim’i hakkında tahminde bulunmak ister misiniz?
print(f"Shape of Tensor: {TENSOR.shape}, Ndim of Scalar: {TENSOR.ndim} ")
3 Scalar elemandan oluşan, 3 farklı vektörü içeren, 1 Matrix’i oluşturduğu bir tensör oluşturmuş olduk :) Biraz işler karıştı mı? Aşağıdaki görsel üzerinden durumu daha net anlamaya çalışalım.
Kabaca 3x3'lük bir matrixden oluşan 1 tensör oluşturmuş olduk. Bu konuyu daha iyi anlayabilmek için yukarıda oluşturduğumuz veri yapılarını değiştirip boyutlarını tahmin etmeye çalışabiliriz. Şimdi yolumuza random tensor oluşturmak ile devam edelim.
Random Tensors
Derin sinir ağları gibi makine öğrenme modelleri ile çalışırken zaman zaman random tensörler yaratmamız gerekebilir. Bir random tensor’ü yaratmak için ‘torch.rand()’ methodunu kullanırız.
import torch
random_tensor = torch.rand(3,4)
print(random_tensor)
Yukarıda random bir tensör oluşturduk. Sizce bu tensörün shape’i ve ndim’i nedir tahmin edebilir miyiz?
Bir önceki bölümdeki çıktıları incelediğimizde, köşeli parantez sayısından da tahmin edebileceğimiz üzere buradaki tensör aslında 3x4 boyutlu bir matrix’dir. Çünkü biz torch.rand() methodunun içine 3,4 değişkenlerini vererek 3x4 boyutlu bir tensör yaratmasını istedik. Peki bu boyutu biraz daha arttırmak istersek? Mesela 224*224 boyutlu bir görsel hayal edelim. Bu görselin 3 farklı kanalı R-G-B olduğu için 3*224*224 boyutlu olduğunu biliyoruz. Pytorch ile bunu nasıl oluşturabiliriz?
random_image_size_tensor = torch.rand(size=(3,224,224)) # Color, Height, Width
Burada 3 renk kanalını temsil ediyor. R-G-B kanallarının her birini. Her bir kanal için 224*224 uzunluğunda bir pixel matriximiz yer alıyor. Bundan dolayı yukarıdaki kod örneğimiz bize 3 kanallı 224*224 bir tensör oluşturacaktır.
İlk yazımı daha fazla karmaşık bir hale getirmeden burada bitirmek istiyorum. Bir sonraki yazımda Tensor’ler konusuna devam ediyor olacağım. Umarım başlangıç konsepti için faydalı olmuştur. Bu eğitim serime aşağıda vereceğim kaynak üzerinden devam ediyorum. Daha fazlası için göz atabilirsiniz: https://github.com/mrdbourke/pytorch-deep-learning#course-materialsoutline
Bir sonraki yazıda görüşmek üzere :)