কনভলিউশনাল নিউরাল নেটওয়ার্ক
মজার ব্যাপার হচ্ছে, আমরা সবাই জানি – ডিজিটাল ইমেজ বা ফটো কিন্তু আর কিছুই না একটা 2D অ্যারে বা ম্যাট্রিক্স (গ্রে স্কেল বা সাদাকালো ফটোর ক্ষেত্রে)। সেই ম্যাট্রিক্সের প্রত্যেকটি সেল হচ্ছে এক একটি পিক্সেল। আর সেলের ভ্যালু হচ্ছে পিক্সেল ভ্যালু বা কালার এর মান। আবার ম্যাট্রিক্সটার (row সংখ্যা x column সংখ্যা) মানেই হচ্ছে ওই ফটোর রেজোল্যুশন। তাহলে বিষয়টা কি দাঁড়ালো?
আমরা নিউরাল নেটওয়ার্ক দিয়ে তাহলে ডিজিটাল ফটো অ্যানালাইসিস করতে পারি। বলতে গেলে – ফটো রিকগনিশনের কাজ করতে পারি। আর নিউরাল নেটওয়ার্কের মাধ্যমে ইমেজ ক্লাসিফিকেশনের জন্য বহুল ব্যবহৃত একটা টেকনিক/মডেল হচ্ছে কনভলিউশনাল নিউরাল নেটওয়ার্ক। নিউরাল নেটওয়ার্ক কি সেটা আমরা ইতোমধ্যে জেনেছি। এবার আমরা জানবো কনভলিউশন মানে কি এবং এটার প্রয়োজনীয়তা। বলে রাখা ভালো এই কনভলিউশন টার্মটা কিন্তু শুধু নিউরাল নেটওয়ার্ক বা ইমেজ প্রসেসিং এর সাথে সম্পর্কিত কোন টার্ম না। বরং এটা একটা জেনেরিক ম্যাথেমেটিক্যাল টার্ম। সিগনাল প্রসেসিং –এও এর ব্যবহার দেখা যায় (বিশেষ টাইপের একরকম সিগনালও কিন্তু ঘুরে ফিরে ম্যাট্রিক্স ইমেজের মতই। যাহোক সময় থাকলে সেটা পরে উদ্ধার করবো 🙂 )।
ব্যাসিক পরিচিতি
চলুন আমরা একটা জগতের কথা চিন্তা করি যে জগতে একটা কম্পিউটার আছে যার ডিসপ্লে মাত্র 2x2পিক্সেল সাইজের। আর ওই জগতে সব মিলে ২টা ক্যারেক্টার বা বর্ণ আছে যেগুলো হচ্ছে,এবং /অর্থাৎ ওখানকার কিবোর্ড দিয়ে একটা ফরওয়ার্ড স্ল্যাস অথবা একটা ব্যাক স্ল্যাস লেখা যায় :Pঅনেকটা নিচের মত -

এখন আমরা এই কম্পিউটারের জন্য একটা ইমেজ ক্লাসিফায়ার সফটওয়্যার বানাতে চাই যাতে করে যখন আমরা কম্পিউটারকে নিচের ইমেজটি ইনপুট দেবো তখন সে যাতে সেটা চিনে বলতে পারে যে এটা একটা \. (ব্যাক স্ল্যাস)

এবং একই ভাবে ফরওয়ার্ড স্ল্যাসটাকেও চিনতে পারে।
কিন্তু আমরা সবাই জানি যে কম্পিউটারের কাছে সব কিছুই আসলে নাম্বার। কম্পিউটার তো আর সরাসরি ফটো চেনে না, খুব বেশি হলে একটা ফটোর ম্যাথেমেটিক্যাল রিপ্রেজেন্টেশন চেনে। তাই, ধরে নিচ্ছি যে সেই কম্পিউটারের গ্রাফিক্স প্রোগ্রামটি মনিটরে কোন অ্যাক্টিভ পিক্সেল বা রং (এক্ষেত্রে ধরি লাল রঙের মান 1) দেখানোর জন্য 1 ব্যবহার করে এবং রং এর অনুপস্থিতি (ধরি গ্রে কালার এর মান -1) প্রকাশের জন্য -1 ব্যবহার করে।এতে করে প্রত্যেকটি বর্ণের গ্রাফিক্যাল রিপ্রেজেন্টেশন নিচের মত ধরে নেয়া যেতে পারে।

কিন্তু গ্রাফিক্যাল রিপ্রেজেন্টেশন বা ম্যাথেম্যাটিক্যাল রিপ্রেজেন্টেশন যাই হোক কম্পিউটার এই ম্যাট্রিক্সের মত দেখতে ডাটা ফরম্যাটকে লম্বা একটা অ্যারের মত করেই ধরে, হিসাব নিকাশ করার জন্য। অর্থাৎ নিচের মত,

পাইছি এবার। খেয়াল করুন এই দুটা আলাদা ইমেজের জন্য যে ফাইনাল ডাটা স্ট্রাকচার দাঁড়ালো সেগুলোকে কিন্তু আমরা আমাদের সেই প্রথম দিকের ইনপুট কম্বিনেশন সমস্যার সাথেই তুলনা করতে পারি। অর্থাৎ 1 -1 -1 1 কম্বিনেশনের আউটপুট ধরি 1 (ধরি 1 মানে ব্যাক স্ল্যাস) আর -1 1 1 -1 কম্বিনেশনের আউটপুট ধরি 0 (ধরি 0 মানে ফরওয়ার্ড স্ল্যাস)।
তাহলে যদি আমরা এই ইনপুট কম্বিনেশন গুলোতে সঠিক ভাবে কিছু ওয়েট সেট করতে পারি এবং দুইটা আলাদা ইনপুট কম্বিনেশনের জন্য দুটো আলাদা রেজাল্ট আসে (একটা শূন্যের কাছা কাছি আরেকটা এক এর কাছাকাছি। তাহলেই কিন্তু আমাদের ইমেজ ক্লাসিফায়ার তৈরি হয়ে গেলো। ওই ক্লাসিফায়ারে যতবারই [1 -1 -1 1] তথা ব্যাক স্ল্যাসের ইমেজের একটি ডাটা ম্যাট্রিক্স দেয়া হবে ততবার সে ওই ইনপুট গুলোর সাথে ওয়েট এর গুন যোগ করে আউটপুট দিবে ১ এর কাছাকাছি একটা মান আর আমরা জানি ১ মানে ব্যাক স্ল্যাস। তাই চিনে যাবো এই ইমেজ একটা ব্যাক স্ল্যাস। তো, চলুন এই সিম্পল ক্লাসিফায়ারের জন্য কিছু অপ্টিমাইজড ওয়েট বের করি।
প্রথমেই সব ওয়েট মনে করি 1. তাহলে [1 -1 -1 1] এর জন্য -
(1*1) + (-1*1) + (-1*1) + (1*1) = 1 - 1 - 1 + 1 = 0
আর [-1 1 1 -1] এর জন্য -
(-1*1)+(1*1)+(1*1)*(-1*1) = -1 + 1 + 1 - 1 = 0
লাভ হল না, দুইটার ক্ষেত্রেই শূন্য আসছে অর্থার ক্লাসিফাই করার মত সলিড Rule এটা হয় নি বা বলা যায় ওয়েট গুলো সঠিক হয় নি। ওয়েট গুলো একটু অ্যাডজাস্ট করে নিচের মত ট্রাই করি। অর্থাৎ প্রথম এইজের ওয়েট ধরি 1, দ্বিতীয় এইজের ওয়েট ধরি -1, তৃতীয় এইজের ওয়েট ধরি -1 এবং চতুর্থ এইজের ওয়েট ধরি 1. (যেহেতু চারটা Edge ধরে ৪টা ইনপুট আসছে একটা নিউরনের দিকে)
তাহলে [1 -1 -1 1] এর জন্য -
(1*1) + (-1*-1) + (-1*-1) + (1*1) = 1 + 1 + 1 + 1 = 4 Sigmoid করে 0.98
আর [-1 1 1 -1] এর জন্য -
(-1*1)+(1*-1)+(1*-1)*(-1*1) = -1 - 1 - 1 - 1 = -4 Sigmoid করে 0.01
অর্থাৎ আমরা মোটামুটি সঠিক ওয়েট এর খোঁজ পেয়েছি যেগুলো একটি ব্যাসিক নিউরাল নেটওয়ার্কে ব্যবহার করলে দুটা আলাদা ইনপুট কম্বিনেশনের জন্য দুটো আলাদা আউটপুট আসে এবং তার সাহায্যে আমরা দুটো ইমেজকে ক্লাসিফাই বা আলাদা করে চিনতে পারি :D একটু পরীক্ষা করেও দেখতে পারেন যে আসলেই সঠিক ওয়েটের খোঁজ পাওয়া গেছে কিনা। যেমন - নিচের দুটো ইমেজের কথা চিন্তা করুন,

দেখে মনে হচ্ছে উপরের ইমেজটি একটি ব্যাক স্ল্যাস কিন্তু উপড়ে একটু কালি বেশি পরে গেছে। আর নিচেরটা একটা ফরওয়ার্ড স্ল্যাস কিন্তু উপড়ে পুরোটা আকা শেষ হয়নি। এটা আমরা ধারনা করতে পারছি। কিন্তু চলুন পরীক্ষা করে দেখি আমাদের একটু আগের ব্যাসিক ইমেজ ক্লাসিফায়ার নিউরাল নেটওয়ার্ক এটা ধরতে পারে কিনা।
তাহলে প্রথম ইমেজ অর্থাৎ [1 1 -1 1] এর জন্য -
(1*1) + (1*-1) + (-1*-1) + (1*1) = 1 - 1 + 1 + 1 = 2 Sigmoid করে 0.88 (1 এর কাছাকাছি অর্থাৎ ব্যাক স্ল্যাস)
আর [-1 -1 1 -1] এর জন্য -
(-1*1)+(-1*-1)+(1*-1)*(-1*1) = -1 + 1 - 1 - 1 = -2 Sigmoid করে 0.11 (0 এর কাছাকাছি অর্থাৎ ফরওয়ার্ড ল্যাস)
গ্রেট, এরকম ভাঙ্গা হাতের লেখাকেও আমাদের ক্লাসিফায়ার ঠিকি ধরতে পারছে :) কিন্তু ভুলে গেলে চলবে না, এই যে, হুট করে সব ওয়েট [1 1 1 1] এর কথা চিন্তা করে তারপর অপ্টিমাইজড ওয়েট [1 -1 -1 1] -এ আসতে পারা, এখানে কিন্তু সেই এরর, অ্যাডজাস্ট, লার্নিং লুপেরই কাজ করতে হবে। এসব আগেই আলোচনা হয়ে গেছে :) আমরা বোঝার জন্য এক লাফেই অপ্টাইজ ওয়েট নিয়ে পরীক্ষা করেছি।
এবার চলুন একটু জটিল আরেকটা জগতের কথা চিন্তা করি যে জগতে একটা কম্পিউটার আছে যার ডিসপ্লে 3x3 পিক্সেল সাইজের। আর ওই জগতে সব মিলে ৪টা ক্যারেক্টার বা বর্ণ আছে যেগুলো হচ্ছে - \ / X O অর্থাৎ ওখানকার কিবোর্ড দিয়ে একটা ফরওয়ার্ড স্ল্যাস, একটা ব্যাক স্ল্যাস, একটা এক্স, আরেকটা ও লেখা যায় :P অনেকটা নিচের মত -

এখন মনে করুন যে ওই ৪টি বর্ণের কোন একটিকে কম্পিউটারে টাইপ করলে এর মনিটরে নিচের মত করে সেই ক্যারেক্টারটি রেন্ডার হয় -

এখন প্রশ্ন হচ্ছে কিভাবে আমরা তুলনামূলক জটিল একটি ক্লাসিফায়ার বানাতে পারি যার মাধ্যমে আমরা এই ক্যারেক্টার গুলোকে শুধুমাত্র তাদের ডাটা দেখে আলাদা করে চিনতে পারি? এখানে কিন্তু সেই ব্যাসিক ক্লাসিফায়ার কাজ করবে না। কেন করবে না সেটা এই পোস্টের দ্বিতীয় উদাহরণ পড়লেও আন্দাজ পাওয়া যাবে। এমনকি খুব সময় দিয়ে ওয়েট অ্যাডজাস্ট করে করেও এর জন্য পারফেক্ট কোন ওয়েট ম্যাট্রিক্স পাওয়া যাবে না যাতে করে ক্লাসিফায়ারটি খুব অ্যাকিউরেট হয়। কারন - বাস্তবে একটা বর্ণ একটা ইমেজের একদম মাঝেখানেই যে থাকবে তা নয়। বর্ণ একটাই যদি ধরি X. সেটা এক একটা ইমেজে এক এক ভাবে থাকতে পারে। যেমন - কোন ফটোতে একটু ডানে চাপিয়ে, কোনটাতে একটু বাপে চেপে অথবা কোথাও একটু ছোট (কম পিক্সেল ডাইমেনশন নিয়ে), অথবা কোথাও বড় আকারে থাকতে পারে। তাই পিক্সেল গুলোর সাথে যতই পারেফেক্ট ওয়েট জুড়ে দেয়া হোক না কেন, অবস্থা বিশেষে ক্লাসিফায়ার চিনতে পারবে না যে সেই ফটোতে নির্দিষ্ট একটা বর্ণ আছে।
তো উপায় যেটা সেটা হচ্ছে, একটা X দেখতে কেমন এবং তার বিভিন্ন অংশ গুলো কেমন সেগুলোকে প্রথমে চিনে তারপর অংশ ভিত্তিক কম্বিনেশন খুঁজতে হবে সেই বড় ইমেজটাতে (যেটায় X লুকায় আছে)। পিক্সেল ভিত্তিক খোঁজে আর কাজ হবে না। এতে করে X বর্ণটা ইমেজের যেখানেই থাকুক আর যেভাবেই থাকুক না কেন, তার অংশ বিশেষগুলো কিন্তু যেখানে থাকবে একভাবে থাকবে। অর্থাৎ X এর হাত গুলো কিন্তু ছিন্ন বিচ্ছিন্ন হয়ে থাকবে না। যেখানেই থাকুক না কেন হাত গুলো জয়েন্ট আকারেই থাকবে। তেমনি O যেখানেই যেভাবে থাকুক, মাঝখানে একটা ফাকা জায়গা থাকবে এটা স্বাভাবিক।
আচ্ছা, এবার আমরা একটু 2x2 পিক্সেলের জগত থেকে হেল্প নেবো। সেখানে আমাদের ব্যাক এবং ফরওয়ার্ড স্ল্যাস আছে। খেয়াল করুন, সেগুলাই কিন্তু X এর হাত গুলোর মতই। অর্থাৎ একভাবে খেয়াল করলে বলা যায় যে - তিন পিক্সেল ওয়ালা জগতের X, O, \, / গুলো বস্তুত দুই পিক্সেল ওয়ালা জগতের \ এবং / এর সমন্বয়েই তৈরি। নিচের ফিগারটা একটু খেয়াল করি,

উপরের ডায়ারগ্রামটাই কিন্তু একটা কনভলিউশনাল নিউরাল নেটওয়ার্কের ব্লক ডায়াগ্রাম। (ভয়ের কিছু নাই বিস্তারিত এড়িয়ে যাওয়া হবে না)। দুটি স্টেজে একটা কনভলিউশনাল নিউরাল নেটওয়ার্কের কাজকে বর্ণনা করা যায়। প্রথম স্টেজে অর্থাৎ বামের দিকে একটি বড় ইমেজ থেকে Convolution এবং Pooling টেকনিকের মাধ্যমে ছোট কিন্তু অর্থবহ ইমেজ বের করে আনা হয়। Convolution এর জন্য ছোট ইমেজ ব্যবহার করা হয় যেটাকে ফিল্টার বলা হয়। যেমন X ওয়ালা বড় একটা ইমেজের উপর আমরা \ এর ইমেজ এবং / এর ইমেজ নিয়ে Convolution করতে পারি কারণ পুরো X এর মধ্যে বস্তুত এগুলোরই অবস্থান। আর তাই X এর হাত গুলোকে চিনে নেয়ার জন্য আমরা শুধু (কাটা) হাতের ফটোকে ফিল্টার হিসেবে ব্যবহার করতে পারি।
এরপর সেই ছোট আকারের ইমেজ গুলোকে নিয়ে পরের স্টেজে নিউরাল নেটওয়ার্ক এর কাজ করা হয়। এই স্টেজে নিউরাল নেটওয়ার্কের লজিক, ওয়েট ইত্যাদি ফিক্স করে, এর আগের স্টেজের ইমেজ অর্থাৎ Pooled ইমেজের উপর কাজ করা হয় এবং পিক্সেল কম্বিনেশন যাচাই করে পার্থক্য বা চেনার কাজ করা হয়। এই দ্বিতীয় স্টেজটাকে বলে Fully Connected Layer আর প্রথম স্টেজকে বলে Convolution Layer (এই স্টেজে পুলিং বা অন্যান্য আরও কিছু ফাংশনের ব্যবহার থাকতে পারে)।
একটু বিস্তারিতভাবে এবার এই কাজ গুলো করে দেখি। নিচের ফিগারটি খেয়াল করুন,

এখানে বাম পাশে একটা X ওয়ালা ইমেজ আছে। তার ডানে আমরা দুটো ফিল্টার নিয়েছি। একটা ফিল্টার আসলে ব্যাক স্ল্যাস চেনার ফিল্টার। এই ফিল্টার দিয়ে বড় ইমেজের উপর ঘুরে বেড়ালে (Convolution করলে) যেখানেই হাই ভ্যালু পাবে সেখানেই একটা ব্যাক স্ল্যাস পাওয়া গেছে বলে ধরে নেয়া যাবে। আগের মত চিন্তা করলে এটা ব্যাক স্ল্যাস চেনার সেই ওয়েট ম্যাট্রিক্স। শুধু +1 আর -1 কে + এবং - এ চিহ্নিত করা হয়েছে (অর্থাৎ [1 -1 -1 1] => [+ - - +]. আরেকটা ফিল্টার হচ্ছে ফরওয়ার্ড স্ল্যাস চেনার ফিল্টার। এই ফিল্টারকে বড় ইমেজের উপড়ে ঘুরিয়ে নিয়ে বেড়ালে যখনই হাই ভ্যালু পাবে তখন সেখানে একটা ফরওয়ার্ড স্ল্যাস আছে বলে জানা যাবে।
কনভলিউশন করা

প্রথমেই আমরা উপড়ের ফিল্টার কে সাথে নিয়ে বড় ইমেজের টপ লেফট সাইডে বসিয়েছি এবং ওখানকার পিক্সেল ভ্যালুর সাথে ফিল্টার এর সমন্বয় ঘটিয়ে (গুন যোগ) ভ্যালু পেয়েছি 4. পরের ধাপে বলা হচ্ছে যদি তুমি একটা হাই ভ্যালু পাও তার মানে হচ্ছে তুমি যে অংশ (অঙ্গ) খুজতেছিলা সেটা পাওয়া গেছে। অর্থাৎ Convolution এর এই ধাপে একটা \ পাওয়া গেছে। কারণ \ এর ফিল্টার দিয়ে চেক করা হচ্ছিল এবং ভ্যালু হাই এসেছে। এরপর ফিল্টারকে টপ রাইটে স্লাইড করে নিয়ে যেতে হবে নিচের মত,

এই অবস্থায় ভ্যালু এসেছে -4 যা আমাদের ফিল্টার দিয়ে অংশ চেনার লজিক অনুযায়ী মিথ্যা। তাই পরের ধাপ বলছে আমি কোন ব্যাক স্লাসের অস্তিত্ব পাই নাই তাই Pooled ইমেজে গ্রে বসায় রাখলাম। আবার ফিল্টারকে স্লাইড করে বোটম লেফট কর্নারে সেট করলাম এবং নিচের অবস্থা পেলাম,

আবারও ফিল্টারকে বোটম রাইট কর্নারে নিয়ে সেট করলাম এবং নিচের মত অবস্থা পর্যবেক্ষণ করলাম যে অনুযায়ী বলা যায় - এইবার আবারও একটা \ এর অস্তিত্ব পাওয়া গেছে।

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

মনে রাখবেন, প্রত্যেকটি ফিল্টারই কিন্তু উপরে বাম থেকে শুরু করে, উপড়ে ডানে এবং তারপর নিচে বাম থেকে, নিচে ডানে গিয়ে কাজ/চেক/কনভলিউশন শেষ করে।
আর হ্যা, এই যে ফিল্টারকে স্লাইড করে পিক্সেল-কম্বিনেশন/অংশ/অঙ্গ খোজার স্টেজ, সেটাই কনভলিউশনাল লেয়ার। তারপর, আপনার ডিফাইন করা একটা নির্দিষ্ট থ্রেসহোল্ড ভ্যালুর চেয়ে বড় ভ্যালু আসলে (যেমন এক্ষেত্রে ধরছি 3) যে আপনি ভেবে নিচ্ছেন ‘একটা অংশ আপনি খুঁজে পেয়েছেন’ আর ভ্যালু কম আসলে ধরে নিচ্ছে ‘ওখানে সেই অংশ পাওয়া যায় নি’ এটাই হচ্ছে পুলিং লেয়ারের কাজ।
এরপর ডান পাশের অর্থাৎ পুলিং লেয়ার থেকে পাওয়া দুটো আলাদা ইমেজকে আমরা একসাথে করতে পারি নিচের মত,

অর্থাৎ এখন থেকে কম্পিউটার ভেবে নিবে যে বাম পাশের 3x3 পিক্সেলের যে ফটো সেটারই একটা সিমপ্লিফায়েড ভার্সন হচ্ছে ডান পাশের 2x2 পিক্সেলের ইমেজ যেটা কিনা কিছু \ / (সেই অংশ বা অঙ্গ যাই বলেন) এরসমন্বয়।
একই ভাবে আমরা O ওয়ালা বড় ইমেজকে ওই দুটো ফিল্টার দিয়েই Convolute করেও নিচের মত পুলিং লেয়ারের সাহায্যে সিমপ্লিফায়েড ভার্সনে কনভার্ট করতে পারি।


এভাবে আমাদের ৪ বর্ণ ওয়ালা জগতের বাকি দুটো বর্ণ \ এবং / এর জন্যও কাজ করে নিতে পারেন। সেক্ষেত্রেও তিন পিক্সেল ওয়ালা স্ল্যাসের সাপেক্ষে থ্রেসহোল্ড মেনে পুলিং লেয়ারের কাজ শেষে দুই পিক্সেল ওয়ালা স্ল্যাস পাবেন।
আবারও বলে নিচ্ছি, কনভলিউশন লেয়ারের কাজ হচ্ছে একটি ফিল্টার (র্যান্ডম বা নির্দিষ্ট) এর সাহায্যে একটি পূর্ণ ইমেজের উপর স্লাইড করে ঘুরে বেরিয়ে খুঁজে দেখা সেখানে কোথায় কোথায় ফিল্টার মোতাবেক অংশের অস্তিত্ব পাওয়া যায়। আর অস্তিত্ব আছে/নাই এর সিধান্ত নির্ভর করবে পুলিং লেয়ার এবং তার কাছে থাকা একটা থ্রেসহোল্ড ভ্যালুর উপর।
ফুলি কানেক্টেড লেয়ার
এবার আসুন এই লেয়ারের কাজ নিয়ে ভাবি -এই লেয়ার ইনপুট হিসেবে নেয় কনভলিউশন এবং পুলিং লেয়ার কাছ থেকে পাওয়া প্রসেসড ইমেজ এবং তার উপর চিন্তা (সেই চিন্তা)এবং ট্রেনিংকরে প্যাটার্ন বুঝে নেয় এবং ঠিক করে কোনটা কোন ইমেজ।

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

অর্থাৎ X এর পুলিং লেয়ারের পর ফ্ল্যাট রিপ্রেজেন্টেশনে প্রথমটা ব্যাক স্ল্যাস তাই আমরা স্টোর ম্যাট্রিক্সের প্রথম ভ্যালু সেট করলাম 1. আবার ফ্ল্যাট রিপ্রেজেন্টেশনের দ্বিতীয় এলিমেন্টটা ব্যাক স্ল্যাস না তাই স্টোরে ম্যাট্রিক্সের প্রথম সারির দ্বিতীয় কলামে -1 এভাবে,

ফাইনালি আমরা সব গুলো ফিল্টার পাবো নিচের মত,

এখন আমরা ফিল্টারের 1, -1 কে যদি + এবং মাইনাসে প্রকাশ করি তাহলে ব্যবহার উপযোগী ফিল্টার ধরতে পারি নিচের মত,

এরপর আমরা যেটা করতে পারি তা হল, আমরা একটা নির্দিষ্ট বর্ণের জন্য প্রাপ্ত 2D ম্যাট্রিক্স এর সাথে সবগুলো ফিল্টার (+ - ওয়ালা ম্যাট্রিক্স) এর তুলনা করবো। যেমন - নিচে X এর জন্য প্রাপ্ত ম্যাট্রিক্স এর সাথে সবগুলা ফিল্টার এর সমন্বয় (গুন যোগ) করা হয়েছে

এবং X এর ফিল্টার এর সাথেই সব চেয়ে বেশি স্কোর এসেছে (আসাটাই স্বাভাবিক কারন 2D ম্যাট্রিক্স আর ফিল্টার ম্যাট্রিক্স একই দিকের মান নির্দেশ করে)। তাই বলা যায় এই ইমেজটি X এর ইমেজ :) :D আবার O এর জন্য এই ফুলি কানেক্টেড লেয়ারটির ক্যালকুলেশন ট্রাই করে দেখি,

এক্ষেত্রেও O এর ফিল্টারের সাথেই বেশি স্কোর আসছে তাই সঠিক উত্তর, O.
কমপ্লিট কনভলিউশনাল নিউরাল নেটওয়ার্ক
নিচের ফিগারটার দিকে একবার চোখ বুলাই -

ডায়াগ্রামের একদম বামে আমাদের একটি ইনপুট ইমেজ। তার উপর আমরা দুটো ফিল্টার/মাস্ক অ্যাপ্লাই করেছি প্রত্যেকটা ৪ বার করে মোট ৮ বার (উপর নিচে ডানে বামে)। এটাই আমাদের কনভলিউশনাল লেয়ার। এরপর পুলিং লেয়ারে আমরা চিহ্নিত করেছি ক্ষুদ্র কিছু অংশ বিশেষ যার মাধ্যমে আমাদের আসল বর্ণ গুলো গঠিত এবং সেগুলোর অস্তিত্ব রেকর্ড করেছি। পুলিং লেয়ারের যে আউটপুট ইমেজ অর্থাৎ 2x2 সাইজের সিম্পল ইমেজ সেগুলোকে পিক্সেলেটেড থেকে অর্থবহ ম্যাট্রিক্সে কনভার্ট করা হয়েছে। এখান থেকেই ফুলি কানেক্টেড লেয়ার শুরু বা চিরচেনা নিউরাল নেটওয়ার্ক স্টাইলে ক্যালকুলেশন শুরু। আর তাই এই লেয়ারে, আগের ধাপে পাওয়া ম্যাট্রিক্স গুলোকে (প্রত্যেকটি) ডান পাশের প্রত্যেকটি ফিল্টার ম্যাট্রিক্স এর সাথে মাল্টিপ্লাই করা হয়েছে এবং আউটপুট লেয়ার তথা শেষ ধাপে স্কোর চেক করা হচ্ছে যে, কোন ফিল্টারের সাপেক্ষে স্কোর হাই।
পরীক্ষা করে দেখা
আবার Xএর ফটো ইনপুট হিসেবে দিয়েই পরীক্ষা করি পুরো কনভলিউশনাল নিউরাল নেটওয়ার্ক আসলেই Xকে চিনতে পারে কিনা।

খেয়াল করুন, প্রথমে X এর ইমেজের উপর আমাদের \ / ফিল্টার চালিয়ে দেখা হয়েছে এবং পুলিং লেয়ারের কাছে শুধু ৪টি অবস্থা ভ্যালিড বা ফায়ার হয়েছে। ব্যাক স্ল্যাস ফিল্টার দিয়ে ঘোরার সময় যে দুটা অবস্থায় ব্যাক স্ল্যাস পাওয়া গেছে এবং ফরওয়ার্ড স্ল্যাস ফিল্টার দিয়ে ট্রাভেল করার সময় যে দুটা জায়গায় ফরওয়ার্ড স্ল্যাসের অস্তিত্ব পাওয়া গেছে (তাই পুলিং লেয়ারের ইনপুটে ৪টি কেইস)। এরপর পুলিং লেয়ার 2x2 পিক্সেলেটেড ইমেজ কে বিশেষ ম্যাট্রিক্সে কনভার্ট করছে এবং পরীক্ষার কোন এক সিচুয়েশনে এই ম্যাট্রিক্সটি ডান পাশের ফুলি কানেক্টেড লেয়ারের প্রত্যেকটি ফিল্টারের সাথে মাল্টিপ্লাইড হচ্ছে। ফাইনালি সে ডান পাশে অর্থাৎ আউপুটপুট লেয়ারে রেজাল্ট হিসেবে জানাচ্ছে তার পাওয়া স্কোর গুলো। আর স্কোর দেখে খুব সহজেই বুঝে নেয়া যাচ্ছে X এর উপরেই এই CNN এর কনফিডেন্স বেশি :)
বার বার মনে করিয়ে দিচ্ছি, এখানে বেশ কিছু হেল্পার ফাংশনের কাজ এড়িয়ে যাওয়া হয়েছে শুধু নিউরাল নেটওয়ার্কের ওয়ার্কিং প্রিন্সিপল সহজে বোঝানোর জন্য। যেমন - কম্পিউটারকে পারফেক্ট ফিল্টার বুঝতে, কনভলিউশন করাতে, ফুলি কানেক্টেড লেয়ারের ওয়েট/এইজ উদ্ধার করতে লক্ষ্য লক্ষ্য বার ঘুরে ফিরে কাজ করতে হয়। কারণ, শুরুতেই কম্পিউটার সব কিছুর জন্য (ফিল্টার, কনভলিউশন ইত্যাদি) র্যান্ডম কিছু ভ্যালু ধরে নেয়। তারপর ট্রেনিং ডাটা সেট এ যেহেতু প্রশ্ন উত্তর দুটাই আছে, তাই সেখান থেকে এরর কন্সিডার করে করে এবং সেই অনুযায়ী সব ভ্যালু অ্যাডজাস্ট করে করে ফাইনালি এরকম স্ট্যাবল একটা স্টেজে আসে। এরর এর উপর ভিত্তি করে ভ্যালু অ্যাডজাস্ট করা নির্ভর করে Gradient Descent এরউপর। এ সম্পর্কে বাংলায় পড়তে চাইলে এখানে ক্লিক করুন।
বাস্তব জগতে CNN অনেক তো খেলনা জগতের সমস্যা উদ্ধার করলাম আমরা। আসলেই রিয়েল লাইফ সিচুয়েশনে কিভাবে CNN কাজ করে তার একটা ধারনা নেই এখন। কারন, বাস্তবে কম্পিউটারে লক্ষ্য লক্ষ্য পিক্সেল যেমন আছে তেমনি সব ফটো আমাদের আরাম দেয়ার জন্য 3x3 পিক্সেল নিয়ে বসে নাই। কয়েক মেগা পিক্সেলের ইমেজ এখন সবার কাছেই। তাই আমাদের যেমন নিউরাল নেটওয়ার্ক ডিজাইন করতে হবে খুব বুদ্ধি করে, তেমনি কম্পিউটারকেও রেডি থাকতে হবে বিনা ইস্যুতে কোটি কোটি বার একই বোরিং হিশাব করতে আর লুপের উপর থাকতে।

উপরে একটা পূর্ণ CNN এর ব্লক ডায়াগ্রাম দেখানো হয়েছে। প্রথমেই বাম পাশে একটি নৌকার ছবি ইনপুট দেয়া হচ্ছে এবং এই নেটওয়ার্কে দুই স্টেজে Convolution এবং Pooling এর কাজ করা হয়েছে (প্রয়োজনে আরও হতে পারে)। তো, প্রথম কনভলিউশন এবং পুলিং এর সময় এই ফটো থেকে কিছু গুরুত্বপূর্ণ পিক্সেল গুচ্ছ বা অবজেক্টের অংশ বিশেষ আলাদা করে নিয়ে নেয়া সম্ভব হয়। আবারো, কনভলিউশন এবং পুলিং লেয়ারের সাহায্যে যতটা সম্ভব সিমপ্লিফ্যায়েড কিন্তু অর্থবহ ইমেজে নিয়ে আসা হয়। এরপর সেই লেয়ারের আউটপুট কে ফুলি কানেক্টেড এক বা একাধিক লেয়ারে ইনপুট হিসেবে দিয়ে সবার সাথে সবার গুন/যোগ করে স্কোর জেনারেট করা হয়। ভ্রমণটা ট্রেনিং টাইপের হলে স্কোর এবং আসল আউটপুট এর পার্থক্য দেখে চক্কর দিতে থাকে এরর কমানোর জন্য। আর ভ্রমণটা ট্রেনিং শেষে প্রেডিকশনের জন্য হলে, একটা স্কোর দিয়ে দেয় যার মাধ্যমে আমরা চিনতে পারি যে ফটোটা নৌকার।
0 comments:
Post a Comment