اصول سفارشی سازی: تانسورها و عملیات

مشاهده در TensorFlow.org در Google Colab اجرا شود مشاهده منبع در GitHub دانلود دفترچه یادداشت

این یک آموزش مقدماتی TensorFlow است که نشان می دهد چگونه:

  • بسته مورد نیاز را وارد کنید
  • ایجاد و استفاده از تانسورها
  • از شتاب GPU استفاده کنید
  • tf.data.Dataset نشان دهید

وارد کردن TensorFlow

برای شروع، ماژول tensorflow را وارد کنید. از TensorFlow 2، اجرای مشتاق به طور پیش فرض روشن است. این یک frontend تعاملی تر برای TensorFlow را امکان پذیر می کند، که جزئیات آن را بعداً مورد بحث قرار خواهیم داد.

import tensorflow as tf

تانسورها

تانسور یک آرایه چند بعدی است. مانند اشیاء ndarray NumPy، اشیاء tf.Tensor یک نوع داده و یک شکل دارند. علاوه بر این، tf.Tensor s می تواند در حافظه شتاب دهنده (مانند یک GPU) قرار گیرد. TensorFlow یک کتابخانه غنی از عملیات ( tf.add ، tf.matmul ، tf.linalg.inv و غیره) ارائه می دهد که tf.Tensor s را مصرف و تولید می کند. این عملیات به طور خودکار انواع پایتون بومی را تبدیل می کند، به عنوان مثال:

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))
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)

هر tf.Tensor یک شکل و یک نوع داده دارد:

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

واضح ترین تفاوت بین آرایه های NumPy و tf.Tensor s عبارتند از:

  1. تانسورها را می توان توسط حافظه شتاب دهنده (مانند GPU، TPU) پشتیبانی کرد.
  2. تانسورها تغییر ناپذیر هستند.

سازگاری NumPy

تبدیل بین یک tf.Tensor s و یک ndarray NumPy آسان است:

  • عملیات TensorFlow به طور خودکار ndarray های NumPy را به Tensor تبدیل می کند.
  • عملیات NumPy به طور خودکار تنسورها را به درای NumPy تبدیل می کند.

تانسورها به صراحت با استفاده از روش .numpy() به درایه های NumPy تبدیل می شوند. این تبدیل‌ها معمولاً ارزان هستند زیرا آرایه و tf.Tensor در صورت امکان، نمایش حافظه اساسی را به اشتراک می‌گذارند. با این حال، اشتراک‌گذاری نمایش اصلی همیشه امکان‌پذیر نیست، زیرا tf.Tensor ممکن است در حافظه GPU میزبانی شود در حالی که آرایه‌های NumPy همیشه توسط حافظه میزبان پشتیبانی می‌شوند، و تبدیل شامل یک کپی از GPU به حافظه میزبان است.

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())
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.]]

شتاب پردازنده گرافیکی

بسیاری از عملیات TensorFlow با استفاده از GPU برای محاسبات تسریع می شوند. بدون هیچ حاشیه نویسی، TensorFlow به طور خودکار تصمیم می گیرد که از GPU یا CPU برای یک عملیات استفاده کند یا در صورت لزوم، تانسور را بین حافظه CPU و GPU کپی می کند. تانسورهای تولید شده توسط یک عملیات معمولاً توسط حافظه دستگاهی که عملیات بر روی آن اجرا شده است پشتیبانی می شود، به عنوان مثال:

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'))
Is there a GPU available: 
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
Is the Tensor on GPU #0:  
True

نام دستگاه ها

ویژگی Tensor.device یک نام رشته کاملا واجد شرایط از دستگاهی که محتویات تانسور را میزبانی می کند، ارائه می دهد. این نام بسیاری از جزئیات را رمزگذاری می کند، مانند شناسه آدرس شبکه میزبانی که این برنامه روی آن اجرا می شود و دستگاه موجود در آن میزبان. این برای اجرای توزیع شده یک برنامه TensorFlow مورد نیاز است. اگر تانسور روی N امین GPU میزبان قرار گیرد، رشته با GPU:<N> .

قرار دادن صریح دستگاه

در TensorFlow، قرار دادن به نحوه تخصیص (قرار دادن روی) یک دستگاه برای اجرای عملیات فردی اشاره دارد. همانطور که گفته شد، هنگامی که هیچ راهنمایی صریح ارائه نمی شود، TensorFlow به طور خودکار تصمیم می گیرد که کدام دستگاه عملیاتی را اجرا کند و در صورت نیاز، تانسورها را در آن دستگاه کپی می کند. با این حال، عملیات TensorFlow را می توان به صراحت در دستگاه های خاصی با استفاده از مدیر زمینه tf.device قرار داد، به عنوان مثال:

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)
On CPU:
10 loops: 91.47ms
On GPU:
10 loops: 388.16ms

مجموعه داده ها

این بخش از tf.data.Dataset API برای ایجاد خط لوله برای تغذیه داده ها به مدل شما استفاده می کند. tf.data.Dataset API برای ساخت خطوط ورودی پیچیده و کارآمد از قطعات ساده و قابل استفاده مجدد استفاده می شود که حلقه های آموزشی یا ارزیابی مدل شما را تغذیه می کند.

یک Dataset منبع ایجاد کنید

با استفاده از یکی از توابع کارخانه مانند Dataset.from_tensors ، Dataset.from_tensor_slices ، یا با استفاده از اشیایی که از فایل‌هایی مانند TextLineDataset یا TFRecordDataset خوانده می‌شوند، یک مجموعه داده منبع ایجاد کنید. برای اطلاعات بیشتر به راهنمای TensorFlow Dataset مراجعه کنید.

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)

تغییرات را اعمال کنید

از توابع تبدیل مانند map ، batch و shuffle برای اعمال تبدیل به رکوردهای مجموعه داده استفاده کنید.

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

ds_file = ds_file.batch(2)

تکرار کنید

اشیاء tf.data.Dataset از تکرار برای حلقه روی رکوردها پشتیبانی می کنند:

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

print('\nElements in ds_file:')
for x in ds_file:
  print(x)
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)