এমএল কমিউনিটি দিবস 9 নভেম্বর! TensorFlow, Jax থেকে আপডেটের জন্য আমাদের সাথে যোগ দিন, এবং আরও আরও জানুন

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

টেনসরফ্লো.আর.জে দেখুন গিটহাবের উত্স দেখুন নোটবুক ডাউনলোড করুন

এটি একটি প্রবর্তক টেনসরফ্লো টিউটোরিয়াল যা দেখায় যে:

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

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

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

import tensorflow as tf

টেনার্স

একটি টেনসর একটি বহুমাত্রিক অ্যারে। NumPy ndarray অবজেক্টের মতো, tf.Tensor অবজেক্টগুলির একটি ডেটা টাইপ এবং একটি আকার রয়েছে। tf.Tensor , tf.Tensor গুলি এক্সিলারেটর মেমোরিতে (GPU এর মতো) থাকতে পারে। টেনসরফ্লো অপারেশনগুলির একটি সমৃদ্ধ লাইব্রেরি সরবরাহ করে ( tf.add , tf.matmul , tf.linalg.inv ইত্যাদি) যা ব্যবহার করে tf.Tensor গুলি উত্পাদন করে। এই ক্রিয়াকলাপগুলি স্বয়ংক্রিয়ভাবে স্থানীয় পাইথনের ধরণের রূপান্তর করে, উদাহরণস্বরূপ:

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. টেনারগুলি এক্সিলারেটর মেমোরি (যেমন জিপিইউ, টিপিইউ) সমর্থন করে।
  2. টেনার্স অপরিবর্তনীয়।

NumPy সামঞ্জস্য

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

  • টেনসরফ্লো অপারেশন স্বয়ংক্রিয়ভাবে NumPy ndarrays কে টেনেসরে রূপান্তর করে।
  • NumPy অপারেশন স্বয়ংক্রিয়ভাবে টেনারগুলি NumPy ndarrays এ রূপান্তর করে।

টেনারগুলি স্পষ্টভাবে তাদের .numpy() পদ্ধতিটি ব্যবহার করে NumPy ndarrays এ রূপান্তরিত হয়। এই রূপান্তরগুলি সাধারণত অ্যারে এবং 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.]]

জিপিইউ ত্বরণ

গণনার জন্য জিপিইউ ব্যবহার করে অনেক টেনসরফ্লো অপারেশন ত্বরান্বিত হয়। কোনও টিকা ছাড়াই টেনসরফ্লো স্বয়ংক্রিয়ভাবে সিদ্ধান্ত নিয়েছে যে কোনও অপারেশনের জন্য জিপিইউ বা সিপিইউ ব্যবহার করবেন কিনা CP প্রয়োজনে সিপিইউ এবং জিপিইউ মেমরির মধ্যে টেন্সরটি অনুলিপি করুন। কোনও অপারেশন দ্বারা উত্পাদিত টেনারগুলি সাধারণত ডিভাইসটির মেমরি দ্বারা সমর্থন করা হয় যার উপর অপারেশন চালানো হয়েছিল, উদাহরণস্বরূপ:

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 বৈশিষ্ট্যটি টেন্সরের সামগ্রীগুলি হোস্ট করার জন্য ডিভাইসের সম্পূর্ণরূপে যোগ্যতাসম্পন্ন স্ট্রিংয়ের নাম সরবরাহ করে। এই নামটি অনেক বিশদ এনকোড করে, যেমন এই প্রোগ্রামটি চালাচ্ছে এমন হোস্টের নেটওয়ার্ক ঠিকানা এবং সেই হোস্টের মধ্যে থাকা ডিভাইসটির সনাক্তকারী। এটি একটি টেনসরফ্লো প্রোগ্রাম বিতরণ সম্পাদনের জন্য প্রয়োজনীয়। স্ট্রিংটি GPU:<N> দিয়ে শেষ হয় GPU:<N> যদি টেনসরটি হোস্টের N -th GPU- এ রাখা হয়।

সুস্পষ্ট ডিভাইস প্লেসমেন্ট

টেনসরফ্লোতে, প্লেসমেন্ট বলতে বোঝায় যে কীভাবে পৃথক ক্রিয়াকলাপগুলি কার্যকর করার জন্য কোনও ডিভাইস নির্ধারিত হয় (রাখা হয়)। উল্লিখিত হিসাবে, যখন কোনও সুস্পষ্ট নির্দেশিকা সরবরাহ করা হয় না তখন টেনসরফ্লো স্বয়ংক্রিয়ভাবে কোন ডিভাইসটি কোনও ক্রিয়াকলাপ সম্পাদন করে তা সিদ্ধান্ত নেয় এবং প্রয়োজনে সেই ডিভাইসে টেনারগুলি অনুলিপি করে। তবে টেনসরফ্লো অপারেশনগুলি স্পষ্টভাবে 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: 93.77ms
On GPU:
10 loops: 397.49ms

ডেটাসেটস

এই বিভাগটি আপনার মডেলটিতে ডেটা tf.data.Dataset করার জন্য পাইপলাইন তৈরি করতে tf.data.Dataset API ব্যবহার করে।tf.data.Dataset এপিআই সহজ, পুনরায় ব্যবহারযোগ্য টুকরা থেকে পারফরম্যান্স, জটিল ইনপুট পাইপলাইনগুলি তৈরি করতে ব্যবহৃত হয় যা আপনার মডেলের প্রশিক্ষণ বা মূল্যায়নtf.data.Dataset খাওয়ান।

একটি উত্স Dataset তৈরি করুন

Dataset.from_tensors , Dataset.from_tensor_slices , বা TextLineDataset বা TFRecordDataset মতো ফাইলগুলি থেকে পড়া Dataset.from_tensor_slices ব্যবহার করে একটি উত্স ডেটাসেট তৈরি করুন। আরও তথ্যের জন্য টেনসরফ্লো ডেটাসেট গাইড দেখুন।

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)

Iterate

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([4 9], shape=(2,), dtype=int32)
tf.Tensor([ 1 16], 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)