این صفحه به‌وسیله ‏Cloud Translation API‏ ترجمه شده است.
Switch to English

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

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

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

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

وارد کردن TensorFlow

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

import tensorflow as tf

تنسورها

Tensor یک آرایه چند بعدی است. مشابه اشیا ndarray NumPy ، اشیا tf.Tensor دارای یک نوع داده و شکل هستند. علاوه بر این ، tf.Tensor می تواند در حافظه شتاب دهنده (مانند 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 عبارتند از:

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

سازگاری با NumPy

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

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

سنسورها با استفاده از روش .numpy() صریحاً به تقسیم بندی های NumPy تبدیل می شوند. این تبدیل ها از آرایه و tf.Tensor معمولاً ارزان هستند. در صورت امکان ، 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.]]

شتاب GPU

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

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

print("Is there a GPU available: "),
print(tf.config.experimental.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 لازم است. رشته با GPU:<N> به پایان می رسد GPU:<N> اگر تانسور روی GPU N -th روی میزبان قرار گیرد.

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

در 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.experimental.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: 102.06ms
On GPU:
10 loops: 231.87ms

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

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

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

با استفاده از یکی از عملکردهای کارخانه مانند Dataset.from_tensors ، Dataset.from_tensor_slices یا استفاده از اشیایی که از پرونده هایی مانند TextLineDataset یا TFRecordDataset خوانده می Dataset.from_tensor_slices ، یک مجموعه داده منبع ایجاد کنید. برای اطلاعات بیشتر به راهنمای 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 4], shape=(2,), dtype=int32)
tf.Tensor([16  9], 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)