أساسيات التخصيص: الموترات والعمليات

عرض على TensorFlow.org تشغيل في Google Colab عرض المصدر على جيثب تحميل دفتر

هذا برنامج تعليمي TensorFlow تمهيدي يوضح كيفية:

  • قم باستيراد الحزمة المطلوبة
  • إنشاء واستخدام موتر
  • استخدم تسريع GPU
  • أظهر tf.data.Dataset

استيراد TensorFlow

للبدء ، قم باستيراد وحدة tensorflow . اعتبارًا من TensorFlow 2 ، يتم تشغيل التنفيذ الحثيث افتراضيًا. يتيح ذلك واجهة أمامية أكثر تفاعلية لـ TensorFlow ، والتي سنناقش تفاصيلها لاحقًا.

import tensorflow as tf

موتر

الموتر هو مصفوفة متعددة الأبعاد. على غرار كائنات ndarray ، تحتوي كائنات tf.Tensor على نوع بيانات وشكل. بالإضافة إلى ذلك ، يمكن أن tf.Tensor s في ذاكرة التسريع (مثل وحدة معالجة الرسومات). تقدم TensorFlow مكتبة غنية من العمليات ( tf.add ، tf.matmul ، tf.linalg.inv وما إلى ذلك) التي تستهلك وتنتج tf.Tensor s. تقوم هذه العمليات تلقائيًا بتحويل أنواع Python الأصلية ، على سبيل المثال:

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 ndarrays إلى Tensors.
  • تقوم عمليات NumPy تلقائيًا بتحويل Tensors إلى NumPy ndarrays.

يتم تحويل الموترات بشكل صريح إلى NumPy ndarrays باستخدام طريقة .numpy() الخاصة بهم. عادة ما تكون هذه التحويلات رخيصة لأن المصفوفة و tf يشترك 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.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> إذا تم وضع الموتر على N -th GPU على المضيف.

وضع جهاز صريح

في 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 لمزيد من المعلومات.

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)