কনভল্যুশন নিউরাল নেটওয়ার্ক (CNN) অন্য সব সাধারণ নিউরাল নেটওয়ার্কের মতই। এখানে বাড়তি হিসেবে রয়েছে কনভল্যুশন। এই লেখাটা পড়ার আগে মেশিন লার্নিং এবং টেনসর ফ্লো নিয়ে জানা থাকতে হবে। সেগুলো পাওয়া যাবে মেশিন লার্নিং পেইজে।
কনভল্যুশন
কনভল্যুশন হচ্ছে ফিচার এক্সট্রাক্ট করার পদ্ধতি। ইনপুট হিসেবে থাকে ইমেজ ম্যাট্রিক্স এবং কার্নেল ম্যাট্রিক্স বা ফিল্টার, যা ব্যবহার করে ফিচার এক্সট্রাক্ট করা হবে। আউটপুট হিসেবে পাওয়া যাবে ফিচার ম্যাপ। এক এক ফিল্টার ব্যবহার করে এক এক ধরণের ফিচার এক্সট্রাক্ট করা যায়। যেমন এজ ডিটেকশন, ব্লার, শার্পেন ইত্যাদি।
পুলিং
কনভল্যুশন নিউরাল নেয়ার্কে কনভল্যুশন লেয়ার ছাড়াও আরেকটি লেয়ার থাকে। যা হচ্ছে পুলিং লেয়ার। পুলিং এর কাজ হচ্ছে ফিচার ম্যাপের মূল ফিচার ঠিক রেখে ডাউন স্যাম্পলিং করা। সাধারণত ইমেজ ম্যাট্রিক্স বড় হলে ফিচার ম্যাপও বড় হয়। তখন ট্রেইনিং এর সময় কমিয়ে আনার জন্য এই লেয়ার। বিভিন্ন ধরণের পুলিং রয়েছে। এর মধ্যে জনপ্রিয় হচ্ছে ম্যাক্স পুলিং। এখানেও একটা কার্ণেল বা ফিল্টার নেওয়া হয়। যেমন 2*2 অথবা 3*3 ইত্যাদি। এরপর ফিচার ম্যাপ ম্যাট্রিক্সের উপর বসিয়ে ঐ ফিল্টার ম্যাট্রিক্সের মধ্যে সবচেয়ে বড় পিক্সেল ভ্যালুটা নেওয়া হয়। এভাবে মূল ইমেজের সাইজ অনেক ছোট হয়ে আসে।
আমি এখানে বিস্তারিত আলোচনা করলাম না কনভল্যুশন নিয়ে। কনভল্যুশন কি, কিভাবে কাজ করে ইত্যাদি সম্পর্কে ব্যাসিক জ্ঞান থাকলে সব কিছু বুঝতে সুবিধে হবে। এখান থেকে ধারণা গুলো পাওয়া যাবে।
কিভাবে CNN ব্যবহার করে ইমেজ ক্লাসিফিকেশন করা যায়, তাই দেখি। আর এ জন্য আমরা ব্যবহার করব CIFAR10 dataset। যা আমরা টেনসরফ্লো API ব্যবহার করে ইম্পোর্ট করে নিতে পারব। এই ডেটাসেটে ১০ প্রকারের মোট ৬০ হাজার কালার ইমেজ রয়েছে। এই ডেটা সেট ৫০ হাজার রয়েছে ট্রেইন ইমেজ এবং ১০ হাজার টেস্টিং ইমেজে ভাগ করা রয়েছে। নিচের দশ প্রকারের ইমেজ রয়েছে এই ডেটা সেটেঃ
class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']
প্রথমে ডেটা লোড করে নিব। তার জন্যঃ
import tensorflow as tf from tensorflow.keras import datasets, layers, models import matplotlib.pyplot as plt import numpy as np (train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()
ডেটাসেট ঠিক মত ইম্পোর্ট হয়েছে কিনা, তা দেখতে পারি একটা ইমেজ প্লট করেঃ
img_index = 1 plt.imshow(train_images[img_index]) plt.xlabel(class_names[train_labels[img_index][0]]) plt.show()
ডেটা নরমালাইজ করাঃ
train_images, test_images = train_images / 255.0, test_images / 255.0
মডেল তৈরিঃ
model = tf.keras.Sequential([ layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)), layers.MaxPooling2D((2, 2)), layers.Conv2D(64, (3, 3), activation='relu'), layers.MaxPooling2D((2, 2)), layers.Conv2D(64, (3, 3), activation='relu'), layers.Flatten(), layers.Dense(64, activation='relu'), layers.Dense(10) ])
আমাদের মডেলে দুইটা কনভ্যুলেশন লেয়ার এবং দুইটা পুলিং লেয়ার রয়েছে।
মডেল কম্পাইল এবং ট্রেইনিংঃ
model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy']) model.fit(train_images, train_labels, epochs=10, validation_data=(test_images, test_labels))
মডেল ইভ্যালুয়েশনঃ
model.evaluate(test_images, test_labels)
আমরা দেখব আমাদের মডেল টেস্ট ডেটার উপর ৭০% অ্যাকুরেসি দিচ্ছে। কনভল্যুশন নিউরাল নেটওয়ার্ক ব্যবহার করাই হচ্ছে বেটার অ্যাকুরেসির জন্য। আর এই জন্য আমাদের মডেলকে আরেকটূ ইম্প্রুভ করতে হবে। নেক্সট টাইম আমরা জানব কিভাবে ইম্প্রুভ করা যায়।
কোড গুলো। এখানে গিয়ে গুগল কোল্যাবে কোড গুলো রান করে দেখা যাবে।
টেনসরফ্লো নিয়ে আরো কিছু লেখাঃ
- টেনসরফ্লো ব্যবহার করে নিউরাল নেটওয়ার্ক ট্রেনিং এবং প্রিডিকশন
- টেনসরফ্লো ব্যবহার করে হ্যান্ডরিটেন নাম্বার ক্লাসিফিকেশন
nice
good
very nice