مشاهده در 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 عبارتند از:
- تانسورها را می توان توسط حافظه شتاب دهنده (مانند GPU، TPU) پشتیبانی کرد.
- تانسورها تغییر ناپذیر هستند.
سازگاری 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)