In [ ]:
#@title Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

Eager modunun ana hatlari

Bu kitapcikta TensorFlow kullanarak konuya giris yapacagiz. Asagidaki konulari isleyecegiz:

  • Gerekli paketleri iceri aktarma
  • Tensorlari olusturma ve kullanma
  • GPU hizlandirmayi kullanmak
  • Veri setleri

TensorFlow'u iceri alalim

'tensorflow' modulunu iceri alalim ver eager modunu secelim. Eager modu, TensorFlow'a detaylarini daha sonra aciklayacagimiz etkilesimli bir arayuz saglar.


In [ ]:
import tensorflow.compat.v1 as tf

Tensorlar

Tensor kisaca cok boyutlu bir dizidir. NumPy'deki 'ndarray' nesneleri gibi, Tensor nesnesinin de bir veri turu ve sekli vardir. Ayrica Tensorlar GPU gibi hizlandirilmis hafizada bulunabilirler. TensorFlow, Tensorlari olusturmak ve kullanmak icin zengin islemlere sahiptir (tf.add, tf.matmul, tf.linalg.inv etc.). Bu islemler Python tiplerini otomatik olarak degistirirler. Ornegin:


In [ ]:
print(tf.add(1, 2))
print(tf.add([1, 2], [3, 4]))
print(tf.square(5))
print(tf.reduce_sum([1, 2, 3]))
print(tf.encode_base64("hello world"))

# Islec asiri yuklenmesi de desteklenir
print(tf.square(2) + tf.square(3))

Her Tensor'un bir sekli ve veri turu vardir


In [ ]:
x = tf.matmul([[1]], [[2, 3]])
print(x.shape)
print(x.dtype)

NumPy dizileri ve TensorFlow Tensorlari arasindaki en belirgin farklar sunlardir:

  1. Tensorlar hizlandirilmis hafizalar tarafindan desteklenebilr (GPU, TPU gibi).
  2. Tensorlar degistirilemez.

NumPy Uyumlulugu

TensorFlow Tensorlari ile NumPy 'ndarray'leri arasindaki donusum cok basittir:

  • TensorFlow islemleri otomatik olarak NumPy ndarray'lerini Tensorlara donusturur.
  • NumPy islemleri de otomatik olarak Tensorlari NumPy ndarray'lerine donusturur.

'.numpy()' metodunu kullanarak Tensorlari belirgin sekilde NumPy ndarray'lerine donusturebilirsiniz. Tensorlar ve 'ndarray'ler temelde mumkun oldugunca ayni sekilde tanimlandigi icin bu donusturmeler ucuzdur. Fakat, NumPy dizileri her zaman ana hafizada calisirken Tensorlar GPU hafizasini da kullanabildigi icin her zaman benzer sekilde tanimlanamazlar ve donusturme isleminde GPU'dan ana hafizaya kopyalama da bulunur.


In [ ]:
import numpy as np

ndarray = np.ones([3, 3])

print("TensorFlow operations convert numpy arrays to Tensors automatically")
tensor = tf.multiply(ndarray, 42)
print(tensor)


print("And NumPy operations convert Tensors to numpy arrays automatically")
print(np.add(tensor, 1))

print("The .numpy() method explicitly converts a Tensor to a numpy array")
print(tensor.numpy())

GPU hizlandirmasi

Hesaplamalar icin GPU kullanarak bircok TensorFlow islemleri hizlandirilabilir. TensorFlow bir islem icin, ek aciklamaya gerek duymadan, otomatik olarak GPU ya da CPU kullanimina karar verir (ve gerektiginde tensorlari GPU ve CPU hafizalarina kopyalar). Bir islem sonucu olusan tensorlar o islem hangi hafizada yurutulduyse o hafizaya kopyalanir. Ornegin:


In [ ]:
x = tf.random_uniform([3, 3])

print("Is there a GPU available: "),
print(tf.test.is_gpu_available())

print("Is the Tensor on GPU #0:  "),
print(x.device.endswith('GPU:0'))

Aygit Isimleri

Tensor.device ozelligi tensorlarin bulundugu aygitin tam adini dizgi olarak temin eder. Bu dizgide bircok detay bulunmaktadir: programin calistigi anasistemin bulundugu agin taniticisi ve anasistemdeki aygit. Bunlar TensorFlow programlarinin dagitiminda gerekli olan bilgilerdir. Eger tensor sistemdeki 'N'inci GPU'ya yerlestirilmisse bu dizgi GPU:<N> ile biter.

Belirtilmis Aygit Yerlestirilmesi

TensorFlow'da "yerlestirme" terimi islemlerin uygulama sirasinda sistemde tek tek nasil atandigi (yerlestirildigi) anlaminda kullanilmistir. Yukarida da bahsettigimiz gibi, eger ozellikle belirtilmemisse TensorFlow bir islemi nerde calistiracagina otomatik olarak karar verir ve gerekirse tensorlari oraya kopyalar. Fakat, TensorFlow islemleri 'tf.device' baglam yoneticisi kullanilarak belirli aygitlara yerlestirilebilir. Ornegin:


In [ ]:
import time

def time_matmul(x):
  start = time.time()
  for loop in range(10):
    tf.matmul(x, x)

  result = time.time()-start

  print("10 loops: {:0.2f}ms".format(1000*result))


# CPU ustunde zorla calistirma
print("On CPU:")
with tf.device("CPU:0"):
  x = tf.random_uniform([1000, 1000])
  assert x.device.endswith("CPU:0")
  time_matmul(x)

# Eger mumkunse GPU ustunde zorla calistirma #0
if tf.test.is_gpu_available():
  with tf.device("GPU:0"): # Or GPU:1 for the 2nd GPU, GPU:2 for the 3rd etc.
    x = tf.random_uniform([1000, 1000])
    assert x.device.endswith("GPU:0")
    time_matmul(x)

Veri setleri

Simdi modelimize veri akimini saglamak icin tf.data.Dataset API'sini nasil kullanacagimizi gorecegiz:

  • Dataseti olusturalim.
  • Eager modunda Datasetin yinelenmesi.

Modelimizin egitim ve degerlendirme dongulerine verilen kompleks girdi hatlarini 'Dataset' API'si ile basit ve tekrar kullanilabilir parcalardan olusturmanizi tavsiye ederiz.

'Dataset' nesnesi olusturma API'si eager modunda iken TensorFlow graph'taki ile aynidir, fakat veri setindeki elemanlarin yinelenmesi islemi biraz daha basittir. 'tf.data.Dataset' nesnesi ustunde direk olarak Python yinelemesi yapabildiginiz icin tf.data.Iterator nesnesi olusturmaniza gerek yoktur. Sonuc olarak, eger eager modunu kullaniyorsaniz, TensorFlow Rehberi'nde anlatilan yineleme gereksizdir.

Dataset kaynagi olusturalim

Buradaki fonksiyonlardan birini Dataset.from_tensors, Dataset.from_tensor_slices ya da kutuklerden okunan nesneleri TextLineDataset veya TFRecordDataset kullanarak source dataset olusturabiliriz. TensorFlow Rehberi'nde daha detayli bilgi bulabilirsiniz.


In [ ]:
ds_tensors = tf.data.Dataset.from_tensor_slices([1, 2, 3, 4, 5, 6])

# CSV kutugunu olusturalim
import tempfile
_, filename = tempfile.mkstemp()

with open(filename, 'w') as f:
  f.write("""Line 1
Line 2
Line 3
  """)

ds_file = tf.data.TextLineDataset(filename)

Transformations (donusumler) uygulayalim

Veri seti kayitlarini donusturmek icin transformations (donusumler) fonksiyonlarini kullanabiliriz: ornegin map, batch, shuffle. tf.data.Dataset API dokumanlari hakkinda daha fazla bilgi icin buraya bakiniz.


In [ ]:
ds_tensors = ds_tensors.map(tf.square).shuffle(2).batch(2)

ds_file = ds_file.batch(2)

Yineleme

Eager modunda 'Dataset' nesneleri yinelemeleri destekler. Eger TensorFlow 'graphs'taki 'Dataset' kullanimina asina iseniz, Dataset.make_one_shot_iterator() ya da get_next() kullanimina gerek olmadigina lutfen dikkat ediniz.


In [ ]:
print('Elements of ds_tensors:')
for x in ds_tensors:
  print(x)

print('\nElements in ds_file:')
for x in ds_file:
  print(x)