Özelleştirme temelleri: tensörler ve işlemler

TensorFlow.org'da görüntüleyin Google Colab'da çalıştırın Kaynağı GitHub'da görüntüleyin Not defterini indir

Bu, aşağıdakilerin nasıl yapılacağını gösteren giriş niteliğinde bir TensorFlow öğreticisidir:

  • Gerekli paketi içe aktarın
  • Tensörler oluşturun ve kullanın
  • GPU hızlandırmayı kullan
  • tf.data.Dataset

TensorFlow'u İçe Aktar

Başlamak için tensorflow modülünü içe aktarın. TensorFlow 2'den itibaren, istekli yürütme varsayılan olarak açıktır. Bu, ayrıntılarını daha sonra tartışacağımız TensorFlow için daha etkileşimli bir önyüz sağlar.

import tensorflow as tf

Tensörler

Tensör, çok boyutlu bir dizidir. NumPy ndarray nesnelerine benzer şekilde, tf.Tensor nesnelerinin bir veri türü ve şekli vardır. Ek olarak, tf.Tensor s hızlandırıcı belleğinde (GPU gibi) bulunabilir. TensorFlow, tf.Tensor s tüketen ve üreten zengin bir işlem kitaplığı ( tf.add , tf.matmul , tf.linalg.inv vb.) sunar. Bu işlemler, yerel Python türlerini otomatik olarak dönüştürür, örneğin:

print(tf.add(1, 2))
print(tf.add([1, 2], [3, 4]))
print(tf.square(5))
print(tf.reduce_sum([1, 2, 3]))

# Operator overloading is also supported
print(tf.square(2) + tf.square(3))
tutucu2 l10n-yer
tf.Tensor(3, shape=(), dtype=int32)
tf.Tensor([4 6], shape=(2,), dtype=int32)
tf.Tensor(25, shape=(), dtype=int32)
tf.Tensor(6, shape=(), dtype=int32)
tf.Tensor(13, shape=(), dtype=int32)

Her tf.Tensor bir şekli ve bir veri tipi vardır:

x = tf.matmul([[1]], [[2, 3]])
print(x)
print(x.shape)
print(x.dtype)
tutucu4 l10n-yer
tf.Tensor([[2 3]], shape=(1, 2), dtype=int32)
(1, 2)
<dtype: 'int32'>

NumPy dizileri ve tf.Tensor s arasındaki en belirgin farklar şunlardır:

  1. Tensörler, hızlandırıcı bellek (GPU, TPU gibi) tarafından desteklenebilir.
  2. Tensörler değişmezdir.

NumPy Uyumluluğu

TensorFlow tf.Tensor s ve NumPy ndarray arasında dönüştürme yapmak kolaydır:

  • TensorFlow işlemleri, NumPy ndarray'lerini otomatik olarak Tensörlere dönüştürür.
  • NumPy işlemleri, Tensörleri otomatik olarak NumPy ndarray'lerine dönüştürür.

Tensörler, .numpy() yöntemleri kullanılarak açıkça NumPy ndarray'lerine dönüştürülür. Dizi ve tf.Tensor , mümkünse, temel bellek temsilini paylaştığından, bu dönüştürmeler genellikle ucuzdur. Ancak, tf.Tensor GPU belleğinde barındırılabilirken, NumPy dizileri her zaman ana bilgisayar belleği tarafından desteklendiğinden ve dönüştürme GPU'dan ana bilgisayar belleğine bir kopya içerdiğinden, temel temsili paylaşmak her zaman mümkün değildir.

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())
tutucu6 l10n-yer
TensorFlow operations convert numpy arrays to Tensors automatically
tf.Tensor(
[[42. 42. 42.]
 [42. 42. 42.]
 [42. 42. 42.]], shape=(3, 3), dtype=float64)
And NumPy operations convert Tensors to numpy arrays automatically
[[43. 43. 43.]
 [43. 43. 43.]
 [43. 43. 43.]]
The .numpy() method explicitly converts a Tensor to a numpy array
[[42. 42. 42.]
 [42. 42. 42.]
 [42. 42. 42.]]

GPU hızlandırma

Birçok TensorFlow işlemi, hesaplama için GPU kullanılarak hızlandırılır. Herhangi bir açıklama olmadan, TensorFlow otomatik olarak bir işlem için GPU mu yoksa CPU mu kullanılacağına karar verir; gerekirse tensörü CPU ve GPU belleği arasında kopyalar. Bir işlem tarafından üretilen tensörler tipik olarak işlemin yürütüldüğü cihazın belleği tarafından desteklenir, örneğin:

x = tf.random.uniform([3, 3])

print("Is there a GPU available: "),
print(tf.config.list_physical_devices("GPU"))

print("Is the Tensor on GPU #0:  "),
print(x.device.endswith('GPU:0'))
tutucu8 l10n-yer
Is there a GPU available: 
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
Is the Tensor on GPU #0:  
True

Cihaz Adları

Tensor.device özelliği, tensörün içeriğini barındıran cihazın tam nitelikli bir dize adını sağlar. Bu ad, bu programın yürütüldüğü ana bilgisayarın ağ adresinin tanımlayıcısı ve bu ana bilgisayardaki aygıt gibi birçok ayrıntıyı kodlar. Bu, bir TensorFlow programının dağıtılmış yürütülmesi için gereklidir. Dize GPU:<N> ile biter, eğer tensör ana bilgisayardaki N -inci GPU'ya yerleştirilirse.

Açık Cihaz Yerleştirme

TensorFlow'da yerleştirme , bireysel işlemlerin yürütme için bir cihaza nasıl atandığını (yerleştirildiğini) ifade eder. Belirtildiği gibi, sağlanan açık bir kılavuz olmadığında, TensorFlow hangi cihazın bir işlemi gerçekleştireceğine otomatik olarak karar verir ve gerekirse tensörleri bu cihaza kopyalar. Ancak, TensorFlow işlemleri, tf.device bağlam yöneticisi kullanılarak belirli cihazlara açıkça yerleştirilebilir, örneğ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))

# Force execution on CPU
print("On CPU:")
with tf.device("CPU:0"):
  x = tf.random.uniform([1000, 1000])
  assert x.device.endswith("CPU:0")
  time_matmul(x)

# Force execution on GPU #0 if available
if tf.config.list_physical_devices("GPU"):
  print("On GPU:")
  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)
tutucu10 l10n-yer
On CPU:
10 loops: 91.47ms
On GPU:
10 loops: 388.16ms

veri kümeleri

Bu bölüm, modelinize veri beslemek için bir ardışık düzen oluşturmak için tf.data.Dataset API'sini kullanır. tf.data.Dataset API, modelinizin eğitim veya değerlendirme döngülerini besleyecek, basit, yeniden kullanılabilir parçalardan performanslı, karmaşık girdi ardışık düzenleri oluşturmak için kullanılır.

Kaynak Dataset oluşturun

Dataset.from_tensors , Dataset.from_tensor_slices gibi fabrika işlevlerinden birini veya TextLineDataset veya TFRecordDataset gibi dosyalardan okuyan nesneleri kullanarak bir kaynak veri kümesi oluşturun. Daha fazla bilgi için TensorFlow Veri Kümesi kılavuzuna bakın.

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

# Create a CSV file
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)

Dönüşümleri uygula

Dönüşümleri veri kümesi kayıtlarına uygulamak için map , batch ve shuffle gibi dönüştürme işlevlerini kullanın.

ds_tensors = ds_tensors.map(tf.square).shuffle(2).batch(2)

ds_file = ds_file.batch(2)

yinele

tf.data.Dataset nesneleri, kayıtlar üzerinde döngü oluşturmak için yinelemeyi destekler:

print('Elements of ds_tensors:')
for x in ds_tensors:
  print(x)

print('\nElements in ds_file:')
for x in ds_file:
  print(x)
tutucu14 l10n-yer
Elements of ds_tensors:
tf.Tensor([1 9], shape=(2,), dtype=int32)
tf.Tensor([16  4], shape=(2,), dtype=int32)
tf.Tensor([25 36], shape=(2,), dtype=int32)

Elements in ds_file:
tf.Tensor([b'Line 1' b'Line 2'], shape=(2,), dtype=string)
tf.Tensor([b'Line 3' b'  '], shape=(2,), dtype=string)