কাস্টমাইজেশন বেসিকস: টেনসর এবং অপারেশন

TensorFlow.org এ দেখুন Google Colab-এ চালান GitHub-এ উৎস দেখুন নোটবুক ডাউনলোড করুন

এটি একটি পরিচায়ক TensorFlow টিউটোরিয়াল যা দেখায় কিভাবে:

  • প্রয়োজনীয় প্যাকেজ আমদানি করুন
  • টেনসর তৈরি করুন এবং ব্যবহার করুন
  • GPU ত্বরণ ব্যবহার করুন
  • tf.data.Dataset প্রদর্শন করুন

টেনসরফ্লো আমদানি করুন

শুরু করতে, tensorflow মডিউল আমদানি করুন। TensorFlow 2-এর হিসাবে, ডিফল্টরূপে উদগ্রীব সম্পাদন চালু করা হয়েছে। এটি TensorFlow-এ আরও ইন্টারেক্টিভ ফ্রন্টএন্ড সক্ষম করে, যার বিস্তারিত আমরা অনেক পরে আলোচনা করব।

import tensorflow as tf

টেনসর

একটি টেনসর একটি বহুমাত্রিক অ্যারে। NumPy ndarray অবজেক্টের মতো, 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. tf.Tensor মধ্যে সবচেয়ে স্পষ্ট পার্থক্য হল:

  1. টেনসরগুলিকে এক্সিলারেটর মেমরি (যেমন GPU, TPU) দ্বারা ব্যাক করা যেতে পারে।
  2. টেনসর অপরিবর্তনীয়।

NumPy সামঞ্জস্য

একটি tf.Tensor s এবং NumPy ndarray এর মধ্যে রূপান্তর করা সহজ:

  • TensorFlow অপারেশন স্বয়ংক্রিয়ভাবে NumPy ndarrayগুলিকে Tensors এ রূপান্তর করে।
  • NumPy অপারেশন স্বয়ংক্রিয়ভাবে টেনসরকে NumPy ndarray-এ রূপান্তর করে।

টেনসরগুলি তাদের .numpy() পদ্ধতি ব্যবহার করে স্পষ্টভাবে NumPy ndarray-এ রূপান্তরিত হয়। এই রূপান্তরগুলি সাধারণত সস্তা কারণ অ্যারে এবং tf. tf.Tensor যদি সম্ভব হয় তবে অন্তর্নিহিত মেমরি উপস্থাপনা শেয়ার করে। যাইহোক, অন্তর্নিহিত উপস্থাপনা ভাগ করা সবসময় সম্ভব নয় যেহেতু tf. 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 ত্বরণ

গণনার জন্য GPU ব্যবহার করে অনেক TensorFlow অপারেশন ত্বরান্বিত হয়। কোনো টীকা ছাড়াই, 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)