Ana içeriğe atla

TensorFlow Dersleri-1


Bu yazıda TensorFlow hakkında genel bilgi ve TensorFlow’daki sabitler, yertutucular ve değişkenler anlatılmaktadır.

TensorFlow Nedir?

TensorFlow, makine öğrenmesi ve derin sinir ağlarında kullanılmak üzere Google’s Machine Intelligence araştırma organizasyonu tarafından geliştirilmiş açık kaynak yazılım kütüphanesidir.
Tensorflow, birçok API sunmaktadır. En alt seviyeli API, TensorFlow Core olarak isimlendirilmektedir. Daha üst seviyedeki API’ler, TensorFlow Core’un üzerine kurulmaktadır.
Birçok derin öğrenme kütüphanesi olmasına rağmen TensorFlow’u diğerlerinden ayıran bazı özellikler şöyle sıralanabilir:  
  •  Google gibi büyük bir şirket tarafından geliştirilmeye devam edilmektedir.
  • GPU ve CPU üzerinde işlem yapabilme kabiliyetine sahiptir.
  • GPU destekli olması işlemlerin daha hızlı yapılmasını sağlamaktadır.
  • Daha iyi görselleştirilme kabiliyetine sahiptir.

Tensor Nedir?

Tensor, TensorFlow’daki en temel veri birimidir. Tensor, herhangi bir boyuta sahip dizi şeklindedir. Bir tensorun boyutu rank olarak adlandırılmaktadır. Aşağıda tensor ile ilgili örnekler görülmektedir.

3 # a rank 0 tensor; this is a scalar with shape []
[1., 2., 3.] # a rank 1 tensor; this is a vector with shape [3]
[[1., 2., 3.], [4., 5., 6.]] # a rank 2 tensor; a matrix with shape [2, 3]
[[[1., 2., 3.]], [[7., 8., 9.]]] # a rank 3 tensor with shape [2, 1, 3]

TensorFlow Core Nedir?

Bilgisayımsal Graf (The Computational Graph)

Computational kelimesi, bilgisayarlı hesaplama anlamına gelmektedir. Bu kelimenin karşılığı olarak Türkçede bilgisayımsal kelimesi kullanılmaktadır.
TensorFlow Core programları, iki ayrı bölümden oluşuyormuş gibi düşünülebilir:    
  • Bilgisayımsal grafın kurulması
  • Bilgisayımsal grafın çalıştırılması
Bilgisayımsal graf, bir graf düğümünde düzenlenmiş bir dizi TensorFlow işlemidir. Her düğüm, hiçbir tensor almayacağı gibi bir veya daha fazla sayıda tensor alabilir ve çıktı olarak bir tensor üretir.
Olabilecek düğüm türlerinden biri sabitlerdir (constant). Sabitler, program içerisinde değişmez bir değere sahiptir. TensorFlow’da yer alan sabitler, hiçbir girdi almazlar ve çıktı olarak içerisindeki değeri verirler. Aşağıdaki örnekte node1 ve node2 isimli iki adet float türünde düğüm oluşturulmaktadır.

node1 = tf.constant(3.0, dtype=tf.float32)
node2 = tf.constant(4.0) # also tf.float32 implicitly
print(node1, node2)

Yukarıdaki kodun çıktısı şöyle olacaktır:

Tensor("Const:0", shape=(), dtype=float32) Tensor("Const_1:0", shape=(), dtype=float32)
 
Bu graflar içeriği itibariyle 3.0 ve 4.0 çıktısı üretme yeteneğine sahiptir ancak bunun için bilgisayımsal grafın bir oturum (session) üzerinde çalıştırılması gerekmektedir. Bir oturum, TensorFlow’un çalışma zamanındaki denetimini ve durumunu sarmalar (encapsulate).
Aşağıdaki kodda bir oturum nesnesi oluşturulup node1 ve node2 düğümlerini çalıştırmak için run metodu çağrılmaktadır.



sess = tf.Session()
print(sess.run([node1, node2]))
 
Bu koddan elde edilen çıktı şu şekildedir.

[3.0, 4.0]

İki sabit düğümün toplamını içeren bir örnek yapılacak olursa:

node3 = tf.add(node1, node2)
print("node3:", node3)
print("sess.run(node3):", sess.run(node3))

Elde edilecek çıktı şu şekilde olacaktır:

node3: Tensor("Add:0", shape=(), dtype=float32)
sess.run(node3): 7.0

Sabitlerin içerdikleri değer değiştirilemez olduğundan yetenekleri sınırlıdır. TensorFlow’daki bazı graflar harici girdi alabilirler ve bu tür graflar yertutucu (placeholder) olarak isimlendirilirler. 

a = tf.placeholder(tf.float32)
b = tf.placeholder(tf.float32)
adder_node = a + b  # + provides a shortcut for tf.add(a, b)

Yukarıdaki kodun ilk iki satırındaki a ve b girdi parametreleridir ve son satırında bu iki parametre üzerinde operasyon gerçekleştirilmektedir. Bu graflara parametre vererek nasıl çalıştığı görülebilir:

print(sess.run(adder_node, {a: 3, b: 4.5}))
print(sess.run(adder_node, {a: [1, 3], b: [2, 4]}))

Yukarıdaki gibi değerler girilirse elde edilecek çıktı şöyle olacaktır:

7.5
[ 3.  7.]

Farklı bir operasyon daha eklenerek işlem daha karmaşık hale getirilebilir:

add_and_triple = adder_node * 3.
print(sess.run(add_and_triple, {a: 3, b: 4.5}))

Elde edilecek çıktı şu şekilde olacaktır.

22.5

Makine öğrenmesi uygulamaları rastgele girdi alabilmelidir. Öğrenme kabiliyeti olan bir model sabit girdiye karşılık farklı çıktılar üretilebilmelidir. Bundan dolayı grafın değiştirilebilir olması gerekmektedir. Değişkenler (Variables), grafa eğitilebilir parametreler eklenmesine olanak sağlar. Değişkenler, tipi ve ilk değeri ile birlikte oluşturulurlar.

W = tf.Variable([.3], dtype=tf.float32)
b = tf.Variable([-.3], dtype=tf.float32)
x = tf.placeholder(tf.float32)
linear_model = W * x + b



Değişkenler, tf.Variables ile çağrıldığında ilk değer ataması yapılmamıştır. Değişkenlerin ilk değer atamasını yapmak için aşağıdaki özel operasyonun çağrılması gerekmektedir:

init = tf.global_variables_initializer()
sess.run(init)


x, bir yertutucudur ve linear_model ile x’in değerlerini şu şekilde verebiliriz:

print(sess.run(linear_model, {x: [1, 2, 3, 4]}))


elde edilen çıktı şöyle olacaktır:

[ 0.          0.30000001  0.60000002  0.90000004]

Makine öğrenmesi açısından bakılacak olursa: şu ana kadar basitte olsa bir model (linear_model = W * x + b ifadesi, linear_model: çıktı, w:ağırlık katsayısı, x:girdi, b:bias değeri olmak üzere en basit sinir ağı olan bir nöron olarak düşünülebilir.) tasarlandı. Bu modelin performans değerlendirmesi için bir kayıp (loss) fonksiyonu olmalıdır. Kayıp fonksiyonu, sistemden elde edilen çıktı ile olması gereken çıktının ne kadar farklı olduğunu ölçer. Kayıp fonksiyonu sıfır değerine ne kadar yakınsa sistem o kadar başarılıdır. Bu durumda modelin olması gereken çıktı değerleri y yertutucusu ile gösterildiği varsayılırsa linear_model – y vektörü her element için hata değerini verir ve bu hatanın karesi tr.square ile hesaplanabilir. tf.reduce_sum ile elde edilen tüm hata kareleri toplanarak hatanın özeti olan tek bir sayısal değer elde edilir:

y = tf.placeholder(tf.float32)
squared_deltas = tf.square(linear_model - y)
loss = tf.reduce_sum(squared_deltas)
print(sess.run(loss, {x: [1, 2, 3, 4], y: [0, -1, -2, -3]}))

elde edilen kayıp değeri:

23.66

tf.Variable ile ilk değeri verilmiş olan değişkenin değeri, tf.assign operasyonu ile değiştirilebilir. Elde edilmesi gereken y çıktısına için modelde w=-1 ve b=1 olmalıdır. Bunu yapmak için:

fixW = tf.assign(W, [-1.])
fixb = tf.assign(b, [1.])
sess.run([fixW, fixb])
print(sess.run(loss, {x: [1, 2, 3, 4], y: [0, -1, -2, -3]}))

kodları yazılır. Bu durumda hata değeri 0 olacaktır.




Yorumlar

Bu blogdaki popüler yayınlar

Windows 10 üzerine GPU-Destekli TensorFlow Kurulumu

TensorFlow, makine öğrenmesi ve derin sinir ağlarında kullanılmak üzere Google’s Machine Intelligence araştırma organizasyonu tarafından geliştirilmiş açık kaynak yazılım kütüphanesidir. GPU destekli TensorFlow kurulumu için aşağıdaki adımların izlenmesi gerekmektedir: 1.      Python kurulması: Python kurulumu için Anaconda paket yöneticini tercih ettim. Burada dikkat edilmesi gereken husus günümüzde TensorFlow’un desteklediği son sürüm olan Python 3.5’den daha yüksek bir versiyonun kurulmamasıdır. https://www.anaconda.com/download/ linkinden Anaconda’nın son versiyonu indirilebilir ancak güncel Anaconda versiyonu ile birlikte gelen Python 3.5’den yüksek bir Python versiyonu içermektedir. Google’da “anaconda archive” anahtar kelimelerini girerek buradan istediğiniz sürümü indirebilirsiniz. (Yüklediğim versiyon: https://repo.continuum.io/archive/Anaconda3-4.4.0-Windows-x86_64.exe ) 2.      Daha sonra bilgisayarımıza NVIDIA CUDA Toolkit kurulmalı. Kurulum detaylarını şu l

Merhaba Dünya

Merhaba Dünya. Şu an okumakta olduğunuz yazı benim ilk blog yazım. Bu blog sitesinde, daha çok bilgisayar bilimleri olmak üzere edinmiş olduğum deneyimleri aktarmaya çalışacağım. Programlama ile uğraşanlar az çok “Merhaba Dünya (Hello World)” nın ne ifade ettiğini bilirler. “Merhaba Dünya”, yeni bir programlama dili öğrenmeye başlayanların yazdığı ilk programdır. C programlama dilinin geliştiricisi Dennis Ritchie, C programlama ile ilgili kitabında aşağıdaki kodları yazmıştır. Yıllar içinde kodlamaya başlamak için gelenek haline gelmiştir. Bende bu geleneği uyarak ilk blog yazımızda dünyaya merhaba diyerek başlamayı uygun gördük.    #include <stdio.h>    int main()    {      printf("Hello World\n");      return 0;    }