টেনসরফ্লো হাবের মাধ্যমে শেখার স্থানান্তর করুন

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

টেনসরফ্লো হাব হল প্রাক-প্রশিক্ষিত টেনসরফ্লো মডেলের একটি ভান্ডার।

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

  1. Tf.keras সহ tf.keras Hub থেকে মডেলগুলি ব্যবহার করুন।
  2. TensorFlow Hub থেকে একটি ইমেজ ক্লাসিফিকেশন মডেল ব্যবহার করুন।
  3. আপনার নিজের ইমেজ ক্লাসের জন্য একটি মডেল ফাইন-টিউন করতে সহজ ট্রান্সফার লার্নিং করুন।

সেটআপ

import numpy as np
import time

import PIL.Image as Image
import matplotlib.pylab as plt

import tensorflow as tf
import tensorflow_hub as hub

import datetime

%load_ext tensorboard

একটি ইমেজনেট ক্লাসিফায়ার

আপনি ImageNet বেঞ্চমার্ক ডেটাসেটে প্রাক-প্রশিক্ষিত একটি ক্লাসিফায়ার মডেল ব্যবহার করে শুরু করবেন—কোন প্রাথমিক প্রশিক্ষণের প্রয়োজন নেই!

ক্লাসিফায়ার ডাউনলোড করুন

TensorFlow Hub থেকে একটি MobileNetV2 প্রাক-প্রশিক্ষিত মডেল নির্বাচন করুন এবং কেরাস লেয়ার হিসেবে hub.KerasLayer দিয়ে মুড়ে দিন। নীচের ড্রপ-ডাউনে দেওয়া উদাহরণগুলি সহ টেনসরফ্লো হাবের যেকোনো সামঞ্জস্যপূর্ণ ইমেজ ক্লাসিফায়ার মডেল এখানে কাজ করবে।

mobilenet_v2 ="https://tfhub.dev/google/tf2-preview/mobilenet_v2/classification/4"
inception_v3 = "https://tfhub.dev/google/imagenet/inception_v3/classification/5"

classifier_model = mobilenet_v2
IMAGE_SHAPE = (224, 224)

classifier = tf.keras.Sequential([
    hub.KerasLayer(classifier_model, input_shape=IMAGE_SHAPE+(3,))
])

এটি একটি একক ছবিতে চালান

মডেলটি চেষ্টা করতে একটি একক চিত্র ডাউনলোড করুন:

grace_hopper = tf.keras.utils.get_file('image.jpg','https://storage.googleapis.com/download.tensorflow.org/example_images/grace_hopper.jpg')
grace_hopper = Image.open(grace_hopper).resize(IMAGE_SHAPE)
grace_hopper
Downloading data from https://storage.googleapis.com/download.tensorflow.org/example_images/grace_hopper.jpg
65536/61306 [================================] - 0s 0us/step
73728/61306 [====================================] - 0s 0us/step

png

grace_hopper = np.array(grace_hopper)/255.0
grace_hopper.shape
(224, 224, 3)

একটি ব্যাচের মাত্রা যোগ করুন ( np.newaxis সহ) এবং চিত্রটিকে মডেলে পাস করুন:

result = classifier.predict(grace_hopper[np.newaxis, ...])
result.shape
(1, 1001)

ফলাফল হল লজিটের একটি 1001-উপাদান ভেক্টর, চিত্রের জন্য প্রতিটি শ্রেণীর সম্ভাব্যতা রেটিং করে।

টপ ক্লাস আইডি পাওয়া যাবে tf.math.argmax সাথে:

predicted_class = tf.math.argmax(result[0], axis=-1)
predicted_class
<tf.Tensor: shape=(), dtype=int64, numpy=653>

ভবিষ্যদ্বাণীগুলি ডিকোড করুন

predicted_class আইডি নিন (যেমন 653 ) এবং ভবিষ্যদ্বাণীগুলি ডিকোড করতে ImageNet ডেটাসেট লেবেলগুলি আনুন:

labels_path = tf.keras.utils.get_file('ImageNetLabels.txt','https://storage.googleapis.com/download.tensorflow.org/data/ImageNetLabels.txt')
imagenet_labels = np.array(open(labels_path).read().splitlines())
Downloading data from https://storage.googleapis.com/download.tensorflow.org/data/ImageNetLabels.txt
16384/10484 [==============================================] - 0s 0us/step
24576/10484 [======================================================================] - 0s 0us/step
plt.imshow(grace_hopper)
plt.axis('off')
predicted_class_name = imagenet_labels[predicted_class]
_ = plt.title("Prediction: " + predicted_class_name.title())

png

সহজ স্থানান্তর শেখার

কিন্তু আপনি যদি আপনার নিজস্ব ডেটাসেট ব্যবহার করে একটি কাস্টম ক্লাসিফায়ার তৈরি করতে চান যাতে এমন ক্লাস রয়েছে যা মূল ইমেজনেট ডেটাসেটে অন্তর্ভুক্ত নয় (যেটি প্রাক-প্রশিক্ষিত মডেলটি প্রশিক্ষিত ছিল)?

এটি করতে, আপনি করতে পারেন:

  1. টেনসরফ্লো হাব থেকে একটি প্রাক-প্রশিক্ষিত মডেল নির্বাচন করুন; এবং
  2. আপনার কাস্টম ডেটাসেট থেকে ক্লাস চিনতে উপরের (শেষ) স্তরটিকে পুনরায় প্রশিক্ষণ দিন।

ডেটাসেট

এই উদাহরণে, আপনি TensorFlow ফুলের ডেটাসেট ব্যবহার করবেন:

data_root = tf.keras.utils.get_file(
  'flower_photos',
  'https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz',
   untar=True)
Downloading data from https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz
228818944/228813984 [==============================] - 7s 0us/step
228827136/228813984 [==============================] - 7s 0us/step

প্রথমে, tf.keras.utils.image_dataset_from_directory দিয়ে ইমেজ ডেটা অফ ডিস্ক ব্যবহার করে মডেলে এই ডেটা লোড করুন, যা একটি tf.data.Dataset তৈরি করবে :

batch_size = 32
img_height = 224
img_width = 224

train_ds = tf.keras.utils.image_dataset_from_directory(
  str(data_root),
  validation_split=0.2,
  subset="training",
  seed=123,
  image_size=(img_height, img_width),
  batch_size=batch_size
)

val_ds = tf.keras.utils.image_dataset_from_directory(
  str(data_root),
  validation_split=0.2,
  subset="validation",
  seed=123,
  image_size=(img_height, img_width),
  batch_size=batch_size
)
Found 3670 files belonging to 5 classes.
Using 2936 files for training.
Found 3670 files belonging to 5 classes.
Using 734 files for validation.

ফুলের ডেটাসেটের পাঁচটি শ্রেণী রয়েছে:

class_names = np.array(train_ds.class_names)
print(class_names)
['daisy' 'dandelion' 'roses' 'sunflowers' 'tulips']

দ্বিতীয়ত, যেহেতু ইমেজ মডেলের জন্য TensorFlow Hub-এর কনভেনশন হল [0, 1] পরিসরে ফ্লোট ইনপুট আশা করা, এটি অর্জন করতে tf.keras.layers.Rescaling প্রিপ্রসেসিং লেয়ার ব্যবহার করুন।

normalization_layer = tf.keras.layers.Rescaling(1./255)
train_ds = train_ds.map(lambda x, y: (normalization_layer(x), y)) # Where x—images, y—labels.
val_ds = val_ds.map(lambda x, y: (normalization_layer(x), y)) # Where x—images, y—labels.

তৃতীয়ত, Dataset.prefetch সাথে বাফার করা প্রিফেচিং ব্যবহার করে ইনপুট পাইপলাইন শেষ করুন, যাতে আপনি I/O ব্লকিং সমস্যা ছাড়াই ডিস্ক থেকে ডেটা পেতে পারেন।

এগুলি হল কিছু গুরুত্বপূর্ণ tf.data পদ্ধতি যা ডেটা লোড করার সময় আপনার ব্যবহার করা উচিত। আগ্রহী পাঠকরা tf.data API গাইডের সাথে আরও ভাল পারফরম্যান্সে তাদের সম্পর্কে আরও শিখতে পারেন, সেইসাথে কীভাবে ডিস্কে ডেটা ক্যাশ করতে হয় এবং অন্যান্য কৌশলগুলি শিখতে পারেন।

AUTOTUNE = tf.data.AUTOTUNE
train_ds = train_ds.cache().prefetch(buffer_size=AUTOTUNE)
val_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE)
for image_batch, labels_batch in train_ds:
  print(image_batch.shape)
  print(labels_batch.shape)
  break
(32, 224, 224, 3)
(32,)
2022-01-26 05:06:19.465331: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.

চিত্রের একটি ব্যাচে শ্রেণীবদ্ধকারী চালান

এখন, একটি ইমেজ ব্যাচে ক্লাসিফায়ার চালান:

result_batch = classifier.predict(train_ds)
predicted_class_names = imagenet_labels[tf.math.argmax(result_batch, axis=-1)]
predicted_class_names
array(['daisy', 'coral fungus', 'rapeseed', ..., 'daisy', 'daisy',
       'birdhouse'], dtype='<U30')

এই ভবিষ্যদ্বাণীগুলি কীভাবে চিত্রগুলির সাথে সামঞ্জস্যপূর্ণ তা পরীক্ষা করুন:

plt.figure(figsize=(10,9))
plt.subplots_adjust(hspace=0.5)
for n in range(30):
  plt.subplot(6,5,n+1)
  plt.imshow(image_batch[n])
  plt.title(predicted_class_names[n])
  plt.axis('off')
_ = plt.suptitle("ImageNet predictions")

png

ফলাফলগুলি নিখুঁত থেকে অনেক দূরে, কিন্তু যুক্তিসঙ্গত বিবেচনা করে যে এগুলি সেই ক্লাস নয় যার জন্য মডেলটি প্রশিক্ষিত হয়েছিল ("ডেইজি" বাদে)।

হেডলেস মডেল ডাউনলোড করুন

টেনসরফ্লো হাব শীর্ষ শ্রেণিবিন্যাস স্তর ছাড়াই মডেলগুলি বিতরণ করে। এগুলি সহজেই স্থানান্তর শেখার জন্য ব্যবহার করা যেতে পারে।

TensorFlow Hub থেকে একটি MobileNetV2 প্রাক-প্রশিক্ষিত মডেল নির্বাচন করুন। TensorFlow Hub থেকে যেকোন সামঞ্জস্যপূর্ণ ইমেজ ফিচার ভেক্টর মডেল এখানে কাজ করবে, ড্রপ-ডাউন মেনু থেকে উদাহরণ সহ।

mobilenet_v2 = "https://tfhub.dev/google/tf2-preview/mobilenet_v2/feature_vector/4"
inception_v3 = "https://tfhub.dev/google/tf2-preview/inception_v3/feature_vector/4"

feature_extractor_model = mobilenet_v2

hub.KerasLayer সাথে কেরাস লেয়ার হিসাবে প্রাক-প্রশিক্ষিত মডেলটিকে মোড়ানোর মাধ্যমে বৈশিষ্ট্য এক্সট্র্যাক্টর তৈরি করুন। ভেরিয়েবলগুলিকে হিমায়িত করতে trainable=False আর্গুমেন্ট ব্যবহার করুন, যাতে প্রশিক্ষণ শুধুমাত্র নতুন ক্লাসিফায়ার লেয়ারটিকে পরিবর্তন করে:

feature_extractor_layer = hub.KerasLayer(
    feature_extractor_model,
    input_shape=(224, 224, 3),
    trainable=False)

বৈশিষ্ট্য নিষ্কাশনকারী প্রতিটি চিত্রের জন্য একটি 1280-দীর্ঘ ভেক্টর প্রদান করে (এই উদাহরণে ছবির ব্যাচের আকার 32-এ থাকে):

feature_batch = feature_extractor_layer(image_batch)
print(feature_batch.shape)
(32, 1280)

একটি শ্রেণীবিভাগের মাথা সংযুক্ত করুন

মডেলটি সম্পূর্ণ করতে, একটি tf.keras.Sequential মডেলে ফিচার এক্সট্র্যাক্টর স্তরটি মুড়ে দিন এবং শ্রেণীবিভাগের জন্য একটি সম্পূর্ণ-সংযুক্ত স্তর যোগ করুন:

num_classes = len(class_names)

model = tf.keras.Sequential([
  feature_extractor_layer,
  tf.keras.layers.Dense(num_classes)
])

model.summary()
Model: "sequential_1"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 keras_layer_1 (KerasLayer)  (None, 1280)              2257984   
                                                                 
 dense (Dense)               (None, 5)                 6405      
                                                                 
=================================================================
Total params: 2,264,389
Trainable params: 6,405
Non-trainable params: 2,257,984
_________________________________________________________________
predictions = model(image_batch)
predictions.shape
TensorShape([32, 5])

মডেলকে প্রশিক্ষণ দিন

প্রশিক্ষণ প্রক্রিয়া কনফিগার করতে Model.compile ব্যবহার করুন এবং লগ তৈরি করতে এবং সংরক্ষণ করতে tf.keras.callbacks.TensorBoard কলব্যাক যোগ করুন:

model.compile(
  optimizer=tf.keras.optimizers.Adam(),
  loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
  metrics=['acc'])

log_dir = "logs/fit/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
tensorboard_callback = tf.keras.callbacks.TensorBoard(
    log_dir=log_dir,
    histogram_freq=1) # Enable histogram computation for every epoch.

এখন মডেলটি প্রশিক্ষণের জন্য Model.fit পদ্ধতি ব্যবহার করুন।

এই উদাহরণটি সংক্ষিপ্ত রাখতে, আপনি মাত্র 10টি যুগের জন্য প্রশিক্ষণ পাবেন। পরবর্তীতে টেনসরবোর্ডে প্রশিক্ষণের অগ্রগতি কল্পনা করতে, একটি টেনসরবোর্ড কলব্যাক লগ তৈরি এবং সংরক্ষণ করুন।

NUM_EPOCHS = 10

history = model.fit(train_ds,
                    validation_data=val_ds,
                    epochs=NUM_EPOCHS,
                    callbacks=tensorboard_callback)
Epoch 1/10
92/92 [==============================] - 7s 42ms/step - loss: 0.7904 - acc: 0.7210 - val_loss: 0.4592 - val_acc: 0.8515
Epoch 2/10
92/92 [==============================] - 3s 33ms/step - loss: 0.3850 - acc: 0.8713 - val_loss: 0.3694 - val_acc: 0.8787
Epoch 3/10
92/92 [==============================] - 3s 33ms/step - loss: 0.3027 - acc: 0.9057 - val_loss: 0.3367 - val_acc: 0.8856
Epoch 4/10
92/92 [==============================] - 3s 33ms/step - loss: 0.2524 - acc: 0.9237 - val_loss: 0.3210 - val_acc: 0.8869
Epoch 5/10
92/92 [==============================] - 3s 33ms/step - loss: 0.2164 - acc: 0.9373 - val_loss: 0.3124 - val_acc: 0.8896
Epoch 6/10
92/92 [==============================] - 3s 33ms/step - loss: 0.1888 - acc: 0.9469 - val_loss: 0.3070 - val_acc: 0.8937
Epoch 7/10
92/92 [==============================] - 3s 33ms/step - loss: 0.1668 - acc: 0.9550 - val_loss: 0.3032 - val_acc: 0.9005
Epoch 8/10
92/92 [==============================] - 3s 33ms/step - loss: 0.1487 - acc: 0.9619 - val_loss: 0.3004 - val_acc: 0.9005
Epoch 9/10
92/92 [==============================] - 3s 33ms/step - loss: 0.1335 - acc: 0.9687 - val_loss: 0.2981 - val_acc: 0.9019
Epoch 10/10
92/92 [==============================] - 3s 33ms/step - loss: 0.1206 - acc: 0.9748 - val_loss: 0.2964 - val_acc: 0.9046

প্রতিটি যুগের সাথে মেট্রিক্স কীভাবে পরিবর্তিত হয় তা দেখতে এবং অন্যান্য স্কেলার মানগুলি ট্র্যাক করতে টেনসরবোর্ড শুরু করুন:

%tensorboard --logdir logs/fit

ভবিষ্যদ্বাণী পরীক্ষা করুন

মডেল ভবিষ্যদ্বাণী থেকে শ্রেণির নামের অর্ডারকৃত তালিকা পান:

predicted_batch = model.predict(image_batch)
predicted_id = tf.math.argmax(predicted_batch, axis=-1)
predicted_label_batch = class_names[predicted_id]
print(predicted_label_batch)
['roses' 'dandelion' 'tulips' 'sunflowers' 'dandelion' 'roses' 'dandelion'
 'roses' 'tulips' 'dandelion' 'tulips' 'tulips' 'sunflowers' 'tulips'
 'dandelion' 'roses' 'daisy' 'tulips' 'dandelion' 'dandelion' 'dandelion'
 'tulips' 'sunflowers' 'roses' 'sunflowers' 'dandelion' 'tulips' 'roses'
 'roses' 'sunflowers' 'tulips' 'sunflowers']

মডেল ভবিষ্যদ্বাণী প্লট করুন:

plt.figure(figsize=(10,9))
plt.subplots_adjust(hspace=0.5)

for n in range(30):
  plt.subplot(6,5,n+1)
  plt.imshow(image_batch[n])
  plt.title(predicted_label_batch[n].title())
  plt.axis('off')
_ = plt.suptitle("Model predictions")

png

রপ্তানি করুন এবং আপনার মডেল পুনরায় লোড করুন

এখন আপনি মডেলটিকে প্রশিক্ষিত করেছেন, পরে এটিকে পুনরায় ব্যবহার করার জন্য একটি সংরক্ষিত মডেল হিসাবে রপ্তানি করুন৷

t = time.time()

export_path = "/tmp/saved_models/{}".format(int(t))
model.save(export_path)

export_path
2022-01-26 05:07:03.429901: W tensorflow/python/util/util.cc:368] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them.
INFO:tensorflow:Assets written to: /tmp/saved_models/1643173621/assets
INFO:tensorflow:Assets written to: /tmp/saved_models/1643173621/assets
'/tmp/saved_models/1643173621'

নিশ্চিত করুন যে আপনি SavedModel পুনরায় লোড করতে পারেন এবং মডেলটি একই ফলাফল আউটপুট করতে সক্ষম:

reloaded = tf.keras.models.load_model(export_path)
result_batch = model.predict(image_batch)
reloaded_result_batch = reloaded.predict(image_batch)
abs(reloaded_result_batch - result_batch).max()
0.0
reloaded_predicted_id = tf.math.argmax(reloaded_result_batch, axis=-1)
reloaded_predicted_label_batch = class_names[reloaded_predicted_id]
print(reloaded_predicted_label_batch)
['roses' 'dandelion' 'tulips' 'sunflowers' 'dandelion' 'roses' 'dandelion'
 'roses' 'tulips' 'dandelion' 'tulips' 'tulips' 'sunflowers' 'tulips'
 'dandelion' 'roses' 'daisy' 'tulips' 'dandelion' 'dandelion' 'dandelion'
 'tulips' 'sunflowers' 'roses' 'sunflowers' 'dandelion' 'tulips' 'roses'
 'roses' 'sunflowers' 'tulips' 'sunflowers']
plt.figure(figsize=(10,9))
plt.subplots_adjust(hspace=0.5)
for n in range(30):
  plt.subplot(6,5,n+1)
  plt.imshow(image_batch[n])
  plt.title(reloaded_predicted_label_batch[n].title())
  plt.axis('off')
_ = plt.suptitle("Model predictions")

png

পরবর্তী পদক্ষেপ

আপনি অনুমানের জন্য লোড করতে SavedModel ব্যবহার করতে পারেন বা এটিকে একটি TensorFlow Lite মডেলে (অন-ডিভাইস মেশিন লার্নিংয়ের জন্য) বা TensorFlow.js মডেলে (জাভাস্ক্রিপ্টে মেশিন লার্নিংয়ের জন্য) রূপান্তর করতে পারেন।

ইমেজ, টেক্সট, অডিও এবং ভিডিও টাস্কে TensorFlow Hub থেকে প্রাক-প্রশিক্ষিত মডেলগুলি কীভাবে ব্যবহার করবেন তা শিখতে আরও টিউটোরিয়াল আবিষ্কার করুন।