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]
[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)
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.
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:
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:
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
Yorum Gönder