CODE – one-hot-encode – নিউরাল নেটওয়ার্ক

আগের পর্বে আমরা ওয়ান-হট-এনকোড সম্পর্কে জেনেছি। এখন দেখবো কিভাবে এটা খুব সহজেই কোডে রূপান্তরিত করা যায়। এই এনকোডিং এর জন্য অনেক ধরনের লাইব্রেরি আছে। আমরা সবথেকে সহজ উপায়গুলো দেখবো।

keras-to_categoricalঃ আমার মতে সব থেকে সহজ। খুব সহজেই এক লাইনেই লিখে ফেলা যায়। প্রথমের এক দরকারী লাইব্রেরি গুলো ইম্পোর্ট করে ফেলি।

import numpy as np
from keras.utils.np_utils import to_categorical

এবার আমরা একটা Dummy লেবেল এর লিস্ট তৈরী করবো। এই একই লিস্ট সবগুলোতে ব্যবহার করবো আমরা।

labels = np.array([0, 1, 1, 2])
to_categorical(labels, num_classes=3)

num_classes প্যারামিটারে মোট লেবেলের সংখ্যা পাস করে দিবেন। যদিও এটা দিতেই হবে এমন কোন কথা নেই। যদি আপনার labels এরে তে সব ক্লাসের কমপক্ষ্যে একটি করে ডেটা থাকে তাহলে না দিলেও চলবে। নাহলে num_classes বাধ্যতামূলক। উপরের কোডের আউটপুট আসবে নিম্নরূপঃ

ওয়ান হট এনকোডেড আউটপুট

আগের পোস্টে যেভাবে বর্ণনা করেছিলাম, মিলিয়ে দেখুন ঠিক একই রকম দেখতে। খুবই সোজা, রাইট?

sklearn-LabelBinarizerঃ উপরের কোডে আমরা দেখেছি কোন একটি ইন্টেজারকে কিভাবে ওয়ান-হট-এনকোডেড ভেক্টরে পরিবর্তন করতে হয়। কিন্তু আমাদের ক্লাসের নামগুলোতো ইন্টেজার ছিলো না। সবগুলো স্ট্রিং। চলুন দেখি স্ট্রিং কে কিভাবে আমরা এনকোড করবো।

প্রথমেই দরকারী লাইব্রেরি ইমপোর্ট করে নেই।

from sklearn.preprocessing import LabelBinarizer

এবার আমাদের লেবেল এরে এর মত করে একটা ডামি এরে তৈরি করে ফেলি

x = np.array(['cat','cat','dog','tiger'])

এবার এটাকে আমরা ওয়ান-হট-এনকোডেড এরে তে পরিবর্তন করবো।

lb = LabelBinarizer()
lb.fit_transform(x)

আউটপুট আসবে নিম্নরূপঃ

এখন প্রশ্ন হলো আমরা ডিকোড করব কিভাবে। এটাও খুবই সোজা। আমরা জানি যে আউটপুটের যে ইনডেক্স এ সর্ব্বোচ্চ ভ্যালু থাকবে, সেটাই আমাদের প্রেডিক্টেড ক্লাস। এত কিছুও আমাদের ভাবতে হবে না। চলুন একটা ডামি আউটপুট এরে তৈরি করে ফেলি।

output = np.array([[0.67,0.1,0.1],[0,0.99,0.01],[0,0,1]])

ধরে নেই উপরের আউটপুট আমরা আমাদের মডেল থেকে পেয়েছি। এবার এটাকে ডিকোড করে ক্লাসের নামগুলো ফিরে পেতে চাই।

lb.inverse_transform(output)

এটার আউটপুট আসবে নিম্নরূপঃ

array(['cat', 'dog', 'tiger'], dtype='<U5')

ঠিক যেটা আমাদের দরকার সেটা আমরা পেয়ে গেছি। কিন্তু এখানে ছোট্ট একটা সমস্যা রয়ে গেছে। LabelBinarizer এর ডেটা সেইভ না করে রাখলে আমরা আবার পরবর্তীতে ব্যবহার করতে পারবো না। এজন্য আমি pickle ব্যবহার করে ডেটা সেইভ করে রাখতে পারেন পরবর্তীতে আবার ব্যবহারের জন্য।

অথবা ম্যানুয়ালি প্রথম উপায় অনুসরণ করে করতে পারেন। স্ট্রিং থেকে ম্যানুয়ালী ইনটেজার ইনডেক্স। সেটা থেকে ওয়ান-হট-এনকোড। আর খুব সহজেই numpy ব্যবহার করে আউটপুটও ডিকোড করে ফেলতে পারেন নিম্নোক্ত উপায়েঃ

output = np.array([[0.67,0.1,0.1],[0,0.99,0.01],[0,0,1]])
np.argmax(output,axis=1)

এটার আউটপুট আসবে নিম্নরূপঃ

 array([0, 1, 2], dtype=int64) 

এই আউটপুটগুলো আপনার পছন্দের উপায়ে স্ট্রিং এর সাথে ম্যাচিং করাতে পারবেন। আরো মজার ব্যপার হলো tensorflow তে এখন আর এত ঝামেলা না করেও করতে পারেন। তবে এই বিষয়গুলো আপনার জানা অনেক জরুরী। আপনাকে জানতে হবে মডেলের প্রতিটি পর্যায়ে কি কি ধরনের কাজ চলছে, তাহলেই আপনি খুব সহজেই যেকোন সমস্যা সমাধান করতে পারবেন।


Leave a Reply

Your email address will not be published. Required fields are marked *