TensorFlow.org এ দেখুন | Google Colab-এ চালান | GitHub এ দেখুন | নোটবুক ডাউনলোড করুন | TF হাব মডেল দেখুন |
টেনসরফ্লো হাব হল প্রাক-প্রশিক্ষিত টেনসরফ্লো মডেলের একটি ভান্ডার।
এই টিউটোরিয়ালটি দেখায় কিভাবে:
- Tf.keras সহ
tf.keras
Hub থেকে মডেলগুলি ব্যবহার করুন। - TensorFlow Hub থেকে একটি ইমেজ ক্লাসিফিকেশন মডেল ব্যবহার করুন।
- আপনার নিজের ইমেজ ক্লাসের জন্য একটি মডেল ফাইন-টিউন করতে সহজ ট্রান্সফার লার্নিং করুন।
সেটআপ
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
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())
সহজ স্থানান্তর শেখার
কিন্তু আপনি যদি আপনার নিজস্ব ডেটাসেট ব্যবহার করে একটি কাস্টম ক্লাসিফায়ার তৈরি করতে চান যাতে এমন ক্লাস রয়েছে যা মূল ইমেজনেট ডেটাসেটে অন্তর্ভুক্ত নয় (যেটি প্রাক-প্রশিক্ষিত মডেলটি প্রশিক্ষিত ছিল)?
এটি করতে, আপনি করতে পারেন:
- টেনসরফ্লো হাব থেকে একটি প্রাক-প্রশিক্ষিত মডেল নির্বাচন করুন; এবং
- আপনার কাস্টম ডেটাসেট থেকে ক্লাস চিনতে উপরের (শেষ) স্তরটিকে পুনরায় প্রশিক্ষণ দিন।
ডেটাসেট
এই উদাহরণে, আপনি 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")
ফলাফলগুলি নিখুঁত থেকে অনেক দূরে, কিন্তু যুক্তিসঙ্গত বিবেচনা করে যে এগুলি সেই ক্লাস নয় যার জন্য মডেলটি প্রশিক্ষিত হয়েছিল ("ডেইজি" বাদে)।
হেডলেস মডেল ডাউনলোড করুন
টেনসরফ্লো হাব শীর্ষ শ্রেণিবিন্যাস স্তর ছাড়াই মডেলগুলি বিতরণ করে। এগুলি সহজেই স্থানান্তর শেখার জন্য ব্যবহার করা যেতে পারে।
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")
রপ্তানি করুন এবং আপনার মডেল পুনরায় লোড করুন
এখন আপনি মডেলটিকে প্রশিক্ষিত করেছেন, পরে এটিকে পুনরায় ব্যবহার করার জন্য একটি সংরক্ষিত মডেল হিসাবে রপ্তানি করুন৷
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")
পরবর্তী পদক্ষেপ
আপনি অনুমানের জন্য লোড করতে SavedModel ব্যবহার করতে পারেন বা এটিকে একটি TensorFlow Lite মডেলে (অন-ডিভাইস মেশিন লার্নিংয়ের জন্য) বা TensorFlow.js মডেলে (জাভাস্ক্রিপ্টে মেশিন লার্নিংয়ের জন্য) রূপান্তর করতে পারেন।
ইমেজ, টেক্সট, অডিও এবং ভিডিও টাস্কে TensorFlow Hub থেকে প্রাক-প্রশিক্ষিত মডেলগুলি কীভাবে ব্যবহার করবেন তা শিখতে আরও টিউটোরিয়াল আবিষ্কার করুন।