این صفحه به‌وسیله ‏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 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))
571e31 ادامه

هر 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

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

این بخش با استفاده از tf.data.Dataset API خط لوله ای برای تغذیه داده های مدل شما ایجاد می کند. 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)