Skip to content

Instantly share code, notes, and snippets.

@mzeyneloglu
Created April 25, 2022 20:21
Show Gist options
  • Save mzeyneloglu/9f0737f3396cb18d0c033697ec1703f2 to your computer and use it in GitHub Desktop.
Save mzeyneloglu/9f0737f3396cb18d0c033697ec1703f2 to your computer and use it in GitHub Desktop.

PyTorch ile Tensorler

Bugünkü yazımızda PyTorch derin öğrenme uygulamarına girmeden önce bilinmesi gereken tensorlere giriş yapıyor olacağız.Bundan öncesinde derin öğrenme kütüphaneleri arasında en popüler olan Tensorflow ve PyTorch hakkında kısa bir bilgi vermek istiyorum.Ardından tensorlerin içerisine giriyor olacağız.Acemi bir öğrenci yazarı olarak okuyan herkese şimdiden teşekkür ediyorum.

Tensorflow

  • Dünyada en çok kullanılan Yapay Zeka platformudur
  • Dahili kullanım için Google (Brain) tarafından oluşturuldu ve 2.0 Kasım 9 tarihinde Apache 2015 açık kaynak lisansı altında piyasaya sürüldü ve kapalı kaynak öncülü DistBelief'in yerini aldı.
  • Windows, Linux, MacOS ve Android ve iOS içeren mobil platformlar için de mevcut olan, derin öğrenmeyi amaçlayan açık kaynak bir kitaplık olarak uyumludur.
  • Amacı, insanlar tarafından kullanılan öğrenme ve akıl yürütmeye benzer şekilde, kalıpları ve korelasyonları tespit etmek ve deşifre etmek için sinir ağları kurup eğitebilen sistemlerin ihtiyaçlarını karşılamaktır.
  • Şu anda Google ürünlerinin hem araştırılması hem de üretimi için kullanılmaktadır ve kapalı kaynaklı selefi DistBelief'in rolünün yerini almaktadır.
  • Adı, bu sistemin sinir ağları tarafından genellikle Tensörler olarak adlandırılan çok boyutlu veri dizileri üzerinde gerçekleştirilen işlemlerden gelir.

PyTorch

  • Dünyada en çok kullanılan ikinci Yapay Zeka platformudur.
  • Facebook'un derin öğrenme uygulamaları için önde gelen kütüphanesi olarak bilinir.
  • Tensör programlamayı kullanarak sayısal hesaplamalar yapmak için tasarlanmış bir Python paketidir. Ek olarak, Numpy paketinin yerine geçer.
  • Yapılan hesaplamaları hızlandırmak için GPU üzerinde yürütülmesine izin verir. NVIDIA tarafından geliştirilen ve model eğitimi gibi geleneksel olarak yavaş süreçleri hızlandırmaya izin veren GPU ile CPU'yu birbirine bağlayan bir API olan CUDA'yı dahili olarak kullanır.
  • Derin öğrenme alanındaki araştırma ve geliştirme süreçlerinde, çok basit bir arayüz aracılığıyla esas olarak sinir ağlarının geliştirilmesine odaklanan yaygın olarak kullanılmaktadır.
  • PyTorch, statik grafikler yerine dinamik grafiklerle çalışır.

Bu iki büyük kütüphaneye genel özelliklerine baktığımıza göre ilk olarak PyTorch' a giriş gerçekleştireceğiz.

PyTorch Tensor

PyTorchda modellerimizi eğitebilmemiz için tensor dediğimiz yapılar bulunmaktadır.Peki tensorler nelerdir ve nasıl kullanılır öncelikle onlara bakalım.Tensorlere geçmeden önce tensorleri daha iyi anlamamızı sağlayacak olan Numpy kütüphanesini göstermek istiyorum.

  • Numpy, dizilerle çalışmak için kullanılan bir Python kütüphanesidir. Ayrıca doğrusal cebir, fourier dönüşümü ve matrisler alanında çalışmak için de gerekli işlevlere sahiptir. NumPy, 2005 yılında Travis Oliphant tarafından oluşturulmuştur. Açık kaynak kodlu bir projedir ve özgürce kullanabilirsiniz. NumPy, Numeriacal Python (Sayısal Python)’un kısaltmasıdır.
  • Python’da dizilerin amacına hizmet eden listelerimiz var, ancak işlenmesi yavaştır. NumPy, geleneksel Python listelerinden 50 kata kadar daha hızlı bir dizi nesnesi sağlamayı amaçlamaktadır. NumPy’deki dizi nesnesi (array) ndarray olarak adlandırılır ve ndarray, çalışmayı çok kolaylaştıran birçok destekleyici işlev sağlar. Diziler, hız ve kaynakların çok önemli olduğu veri biliminde çok sık kullanılır.Python ile kullandığımız listelerin çok daha kullanabilir ve gelişmiş olan bir kütüphanedir.Daha fazla bilgi için Numpy dökümantasyonuna bakabilirsiniz.Numpy Tutorial

*Tensorlere gelecek olursak numpy kütüphanesi gibi çalışırlar ve PyTorch ile derin öğrenme uygulamaları geliştirmek için şarttır.Bir resim düşünebilir bu resmimizi CNN mimarisi ile eğitmek istiyoruz.Resmimizin bir pikselini bir dizi temsil etmektedir.O diziler üzerinde evrişimli katman yada havuzlama katmanı gibi yapılar uygulabiliriz.İşte PyTorch'da bu yapıları tensor üzerinde uygulayarak gerçekleştiriyoruz.

import torch
import numpy as np

PyTorch ve Numpy kütüphanelerini import etme işlemi yukarıda gösterilen şeklindedir.Bundan öncesinde Numpy ve PyTorch kütüphanelerini bilgisayarımıza kurmamız gerekmektedir.Bu yazımızda hem çok fazla sıkmamak hemde internette kurulumlarını açıklayan çok fazla kaynak bulunduğundan yer vermeyeceğim fakat oldukça bir kaç adım ile kurulumu gerçekleştirebiliriz.

#Numpy Dizisi
array = [[1,2,3], [4,5,6]]
np_array = np.array(array)
print(np_array)
print(type(np_array)

# Output
[[1 2 3]
 [4 5 6]]
 <class 'numpy.ndarray'>

Numpy ile bir dizi oluşturmak oldukça basittir.Bunun için numpy.array kullanırız.İster python listesini oluşturup içerisine tanımlayabiliriz yada kendi içerisinde parametre olarak dizi tanımlayabiliriz.np.array([[1,2,3], [4,5,6]])

Yukarıda bir python listesi ve numpy dizileri gördük.PyTroch bunlar ile çalışmamaktadır kendi içerisinde bulundurduğu diziler vardır ve biz bunlara tensor deriz

  • Oluşturulan bir diziyi tensor haline getirmek için torch.tensor(array) şeklinde kullanıyoruz.
  • Numpy dizisi tensor haline getirmek için ise torch.from_numpy(np_array) şeklinde kullanıyoruz.
#Python Listesi ile Tensor Oluşturma
tensor = torch.tensor(array)
print(tensor)
print(type(tensor))

#Output
tensor([[1, 2, 3], 
[4, 5, 6]])
 <class 'torch.Tensor'>

En basit şekiliyle tensor oluşturmayı görmüş olduk.Peki elimizde bulunan bir numpy dizisini nasıl tensore dönüştürebiliriz onu görelim.

# Numpy dizisini tensore çevirme
tensor_np = torch.from_numpy(np_array)
print(tensor_np)
print(type(tensor_np))

#Output
tensor([[1, 2, 3],
 [4, 5, 6]])
  <class 'torch.Tensor'>

Numpy dizilerinde sadece birlerden oluşan matrix veya vektörler yada rand komutu ile 0-1 arasında matrixler oluşturabildiğimiz gibi pytorch ile bu şekilde tensorler oluşturabiliriz.

  • Sadece birlerden oluşan tensorler oluşturabilmek için torch.ones(size_data) kullanırız.
  • 0-1 arasında random sayılardan oluşan tensor oluşturmak için torch.rand(size_data) kullanırız.
  • 0'lardan oluşan bir matrix ve ya vektör oluşturabiliriz.Bu işlemi torch.zeros(size_data).

size_data: (m,n) şeklinde kullanılır ise mxn boyutunda bir matrix oluşur veya tek bir rakam kullanılır ise o a kadar elemana sahip bir vektör oluşacaktır.

Hazır bir datayı birlerden oluşan bir matrix veya vektör formuna çevirmek için ise torch.ones_like(data) aynı şekilde rand için de torch.rand_like(data) yapılarını kullanırız.

Not : rand_like kullanırken dtype türünü belirtmemiz gerekmektedir, parametre olarak almaktadır ve dtype = torch.float şeklinde çevirebiliriz.

#Veriler
ones_tensor = torch.ones((3,3)) # 3x3 Matrix
rand_tensor = torch.rand((9)) # Vektor
zeros_tensor = torch.zeros((4,3)) # 4x3 Matrix
data = torch.tensor([[111,22,33],[95,45,221]])
#ones_like
ones_like = torch.ones_like(data)
#rand_like
rand_like = torch.rand_like(data , dtype = torch.float)
#zeros_like
zeros_like = torch.zeros_like(data)

print("Ones Tensor", ones_tensor)
print("-"*30)
print("Random Tensors", rand_tensor)
print("-"*30)
print("Zeros Tensors", zeros_tensor)
print("-"*30)
print("Ones Like" , ones_like)
print("-"*30)
print("Rand Like" , rand_like)
print("-"*30)
print("Zeros Like" , zeros_like)

#Output
Ones Tensor tensor([
[1., 1., 1.], 
[1., 1., 1.],
 [1., 1., 1.]]) 
------------------------------ 
Random Tensors tensor([0.5862, 0.7423, 0.2852, 0.9602, 0.0425, 0.8962, 0.3861, 0.0419, 0.1960])
------------------------------ 
Zeros Tensors tensor([[0., 0., 0.], 
[0., 0., 0.],
 [0., 0., 0.], 
 [0., 0., 0.]])
------------------------------ 
Ones Like tensor([[1, 1, 1],
 [1, 1, 1]])
------------------------------ 
Rand Like tensor([[0.8398, 0.8613, 0.4060],
 [0.6934, 0.3086, 0.4112]])
------------------------------ 
Zeros Like tensor([[0, 0, 0], [0, 0, 0]])

Tensorlerin boyutunu(shape) , elemanların veri tipini(dtype) veya hangi cihazda(device) çalıştığını görebiliriz.

  • tensor.shape ile birlikte tensorun boyut bilgilerini alabiliriz.
  • tensor.dtpye ile birlikte tensorun içerisindeki verilerin tipini alabiliriz.
  • tensor.device ile birlikte hangi arka planda çalıştığını öğrenebiliriz.[GPU - CPU]
  • tensor.size() ile birlikte tensorun eleman ve boyut sayısı alabiliriz.
#Tensor Oluşturma
tensor = torch.tensor([[0.5,0.6,0.7], [1.2,1.2, 3.14]])
print("Tensor: ", tensor)
print("-"*30)
print("Tensor of shape:", tensor.shape)
print("-"*30)
print("Tensor of dtype:", tensor.dtype)
print("-"*30)
print("Tensor of device:", tensor.device)
 #Output
 Tensor: tensor([[0.5000, 0.6000, 0.7000],
  [1.2000, 1.2000, 3.1400]]) 
 ------------------------------ 
 Tensor of shape: torch.Size([2, 3])
 ------------------------------ 
 Tensor of dtype: torch.float32 
 ------------------------------ 
 Tensor of device: cpu

Numpy ve python listeleri üzerinde tensor işlemlerinin nasıl yapıldığını görmüş olduk daha fazla ayrıntılı bilgi için Pytorch Tensor Tutorial bölümünü inceleyebiliriz.

Elimizde bulunan bir resmi direk olarak tensor çevirme işlemi gerçekleştiremiyoruz fakat numpy arrayine çevirdikten sonra tensor haline getirebiliriz ve tensordeki işlemleri uygulayabiliriz.

Resim yüklemek için from PIL import image kütüphanesini kullanıyor olacağız.

from PIL import Image
image = Image.open("https://idsb.tmgrup.com.tr/ly/uploads/images/2021/11/04/156997.jpg")
image

Elimizdeki resmi yüklediğimize göre artık bunu tensore çevirme işlemi yapabiliriz.Fakat bundan önce kısa bir bilgi vermek istiyorum.Resimleri arraylere yada tensorlere çevirme işleminden kastımız bir resmin piksellerini matrix formuna çevirmek demektir.

#Resimi numpy array çevirme
image_array = np.array(image)
print("Image Shape: ", image_array.shape)
print("Image Size: ", image_array.size)

#Output
Image Shape: (1062, 1600, 3)
Image Size: 5097600

Shape formuna baktığımızda (1062, 1600 , 3) şeklinde olduğunu görüyoruz

  • 1062 resmin yükseklik değeridir.
  • 1600 yatay değeridir.
  • 3 değeri ise kanal sayısıdır.Kanal sayısı RGB(red- green- blue) şeklindedir.

Resimi numpy array çevirdiğimize göre artık tensore çevirme işlemi gerçekleştirebiliriz.

#Tensor Oluşturma
image_tensor = torch.from_numpy(image_array)
print("Image Tensor Size: ", image_tensor.size())

#Output
Image Tensor Size: torch.Size([1062, 1600, 3])

*Resimlerimizi nasıl tensore çevirdiğimizi ve tensorler oluşumlarını görmüş olduk.Tensorler ile yapabileceğimiz bazı önemli operatörler bulunmaktadır.

Tensor ile kullanabileceğimiz bazi önemli operatörlere göz atalım;

  • torch.argmax() , tensor içerisindeki maksimum elemanın index değerini döndürür.
  • torch.argmin() , tensor içerisindeki minimum elemanın index değerini döndürür.
  • torch.min() , tensor içerisindeki minimum elemanı döndürür.
  • torch.max() , tensor içerisindeki maksimum elemanı döndürür.
tensor = torch.tensor([1,2,3,4,5])
print("Tensor of argmax:", tensor.argmax())
print("-"*40)
print("Tensor of argmin:", tensor.argmin())
print("-"*40)
print("Tensor of max element:", tensor.max())
print("-"*40)
print("Tensor of min element:", tensor.min())

#Output
Tensor of argmax: tensor(4)
---------------------------------------- 
Tensor of argmin: tensor(0)
---------------------------------------- 
Tensor of max element: tensor(5)
----------------------------------------
Tensor of min element: tensor(1)

Sonuç

Bu yazımda pytorch ile derin öğrenme uygulamarına girmeden önce bilinmesi gereken tensorlere kısa bir giriş gerçekleştirmiş olduk.

  • Nasıl tensor oluşturulur
  • Tensorler üzerinde bazı operatör işlemleri
  • Resimleri tensorlere çevirme
  • Numpy arrayleri tensorlere çevirme

adımlarını görmüş olduk.Bir öğrenci olarak edindiğim bilgileri buraya aktarmak istedim eğer yanlış ve eksik yazdığım yerler var ise yorumlarda belirtirseniz çok sevinirim.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment