diff --git a/README.md b/README.md index cd06d90..96eda3e 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ এ পর্যন্ত পড়ার পর যদি খুব অস্বস্তি চলে আসে তবে ভয় পাওয়ার কিছু নাই, নিচেই খুব ব্যাসিক কিছু উদাহরণ এর মাধ্যমে সব সহজ ভাবে আলোচনা করা হবে। আমরা একটা সমস্যা দেখবো এবং তার সমাধানের জন্য একটি নিউরাল নেটওয়ার্ক ডিজাইন করবো। তারপর পাইথনে কোড লিখে সেই নেটওয়ার্কের প্রোগ্রামেটিক ভার্শন লিখবো এবং সেটার লার্নিং করিয়ে সমস্যাটা সমাধানও করবো ইনসা আল্লাহ। তার আগে পরবর্তী চ্যাপ্টারে জেনে নেব, মেশিন লার্নিং এবং ডিপ লার্নিং এর মধ্যে পার্থক্য বা সম্পর্ক কোথায়। -এখান থেকে শুরু করুন [START](https://github.com/BanglaProgramming/Deep-Learning-of-Machine-Language/blob/master/SUMMARY.md) +এখান থেকে শুরু করুন [START](/SUMMARY.md) **ওপেন সোর্স** diff --git a/SUMMARY.md b/SUMMARY.md index f6def6f..165ebd3 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -1,6 +1,6 @@ # Summary -* [পরিচিতি](README.md) + * [মেশিন লার্নিং বনাম ডিপ লার্নিং](ml-vs-dl.md) * [আর্টিফিশিয়াল নিউরাল নেটওয়ার্ক](artificial-nn.md) * [সহজ একটি নিউরাল নেটওয়ার্ক](simple-nn.md) @@ -33,4 +33,5 @@ * [Inception মডেল](to-do.md) * [ট্রান্সফার লার্নিং](to-do.md) * [ডিপ ড্রিম](to-do.md) -* [রি-ইনফোর্সমেন্ট লার্নিং](to-do.md) \ No newline at end of file +* [রি-ইনফোর্সমেন্ট লার্নিং](to-do.md) +* \ No newline at end of file diff --git a/artificial-nn.md b/artificial-nn.md index 237b074..6e92768 100644 --- a/artificial-nn.md +++ b/artificial-nn.md @@ -1,6 +1,10 @@ +[Topics](/SUMMARY.md) + ## আর্টিফিশিয়াল নিউরাল নেটওয়ার্ক কি? নিউরাল নেটওয়ার্ক এবং অন্য যেকোনো রকম নেটওয়ার্ক (যেমন – কিছু কম্পিউটার মিলে একটি লোকাল এরিয়া নেটওয়ার্ক অথবা পুরো ওয়েব নেটওয়ার্ক) বস্তুত একই। বেশ কিছু নোড বা পয়েন্ট একে ওপরের সাথে নির্দিষ্ট কিছু নিয়মে যুক্ত থেকে নিজেদের মধ্যে তথ্য আদান প্রদান করলেই তাকে একটা নেটওয়ার্ক বলা যায়। নিউরাল নেটওয়ার্কের ক্ষেত্রে সেই নোড (Node) হচ্ছে এক একটি নিউরন। আমাদের ব্রেইনের মধ্যে বস্তুত বিলিয়ন সংখ্যক নিউরনের একটা নেটওয়ার্ক তৈরি করা আছে। মোটামুটি সেই গঠন শৈলীর উপর ভিত্তি করেই ডাটা থেকে প্যাটার্ন রিকগনিশনের জন্য এক ধরনের কার্যপদ্ধতির নামই হচ্ছে আর্টিফিশিয়াল নিউরাল নেটওয়ার্ক। অর্থাৎ সত্যিকারের নিউরান যে নীতিতে কাজ করে, এই নিউরনও একইভাবে কাজ করে। কিন্তু যেহেতু এগুলো সত্যিকারের নিউরন নয় তাই এটার নাম আর্টিফিশিয়াল নিউরাল নেটওয়ার্ক। **ভিত্তি** -তো আমরা যদি একটু দুঃসাহস করে সত্যিকারের একটা নিউরনের কার্যনীতি দেখি তাহলে আমরা জানতে পারি যে – একটা নিউরনের কিছু ইনপুট দরকার এবং সেই ইনপুট গুলো আসে Dendrite নামের কিছু ডাল পালার মত অংশ দিয়ে, এরপর নিউরন বডি বা Soma নামের অংশে কিছু ক্যালকুলেশন হয় সেই ইনপুট গুলোর উপর। অতঃপর Axon নামের লেজের মত একটা অংশ দিয়ে সেই ক্যালকুলেশনের আউটপুট বের হয় যা কিনা আবার অন্য এক বা একাধিক নিউরনের ইনপুট স্লট তথা Dendrite এ চলে যায়। একটি নিউরনের এক্সন এবং অন্য নিউরনের ডেন্ড্রাইটের মাঝে Synapse নামের কিছু তরল থাকে। এটাই বস্তুত এক নিউরন থেকে আরেক নিউরনের কাছে এক্সনের আউটপুট কে ডেন্ড্ররাইটে ইনপুট দেয়ার ক্ষেত্রে ট্রান্সমিশনের ভূমিকা রাখে। যদি একটি নিউরনের যথেষ্ট পরিমাণ সিন্যাপ্টিক ইনপুট ফায়ার (আশানুরূপ একটা ভ্যালু তৈরি করে) করে তাহলে সেই নিউরনটা ফায়ার করে বা বলা যেতে পারে যে, সেই নিউরনটা অ্যাকটিভ হয়। বিষয় হচ্ছে – এই ঘটনাকেই চিন্তা করা বলে। \ No newline at end of file +তো আমরা যদি একটু দুঃসাহস করে সত্যিকারের একটা নিউরনের কার্যনীতি দেখি তাহলে আমরা জানতে পারি যে – একটা নিউরনের কিছু ইনপুট দরকার এবং সেই ইনপুট গুলো আসে Dendrite নামের কিছু ডাল পালার মত অংশ দিয়ে, এরপর নিউরন বডি বা Soma নামের অংশে কিছু ক্যালকুলেশন হয় সেই ইনপুট গুলোর উপর। অতঃপর Axon নামের লেজের মত একটা অংশ দিয়ে সেই ক্যালকুলেশনের আউটপুট বের হয় যা কিনা আবার অন্য এক বা একাধিক নিউরনের ইনপুট স্লট তথা Dendrite এ চলে যায়। একটি নিউরনের এক্সন এবং অন্য নিউরনের ডেন্ড্রাইটের মাঝে Synapse নামের কিছু তরল থাকে। এটাই বস্তুত এক নিউরন থেকে আরেক নিউরনের কাছে এক্সনের আউটপুট কে ডেন্ড্ররাইটে ইনপুট দেয়ার ক্ষেত্রে ট্রান্সমিশনের ভূমিকা রাখে। যদি একটি নিউরনের যথেষ্ট পরিমাণ সিন্যাপ্টিক ইনপুট ফায়ার (আশানুরূপ একটা ভ্যালু তৈরি করে) করে তাহলে সেই নিউরনটা ফায়ার করে বা বলা যেতে পারে যে, সেই নিউরনটা অ্যাকটিভ হয়। বিষয় হচ্ছে – এই ঘটনাকেই চিন্তা করা বলে। + +[Next : সহজ একটি নিউরাল নেটওয়ার্ক](simple-nn.md) \ No newline at end of file diff --git a/cnn-check.md b/cnn-check.md index ff1dbe6..0793bad 100644 --- a/cnn-check.md +++ b/cnn-check.md @@ -1,3 +1,5 @@ +[Topics](/SUMMARY.md) + ## পরীক্ষা করে দেখা যাক আবার X এর ফটো ইনপুট হিসেবে দিয়েই পরীক্ষা করি পুরো কনভলিউশনাল নিউরাল নেটওয়ার্ক আসলেই X কে চিনতে পারে কিনা।

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

উপরে একটা পূর্ণ CNN এর ব্লক ডায়াগ্রাম দেখানো হয়েছে। প্রথমেই বাম পাশে একটি নৌকার ছবি ইনপুট দেয়া হচ্ছে এবং এই নেটওয়ার্কে দুই স্টেজে Convolution এবং Pooling এর কাজ করা হয়েছে (প্রয়োজনে আরও হতে পারে)। তো, প্রথম কনভলিউশন এবং পুলিং এর সময় এই ফটো থেকে কিছু গুরুত্বপূর্ণ পিক্সেল গুচ্ছ বা অবজেক্টের অংশ বিশেষ আলাদা করে নিয়ে নেয়া সম্ভব হয়। আবারো, কনভলিউশন এবং পুলিং লেয়ারের সাহায্যে যতটা সম্ভব সিমপ্লিফ্যায়েড কিন্তু অর্থবহ ইমেজে নিয়ে আসা হয়। এরপর সেই লেয়ারের আউটপুট কে ফুলি কানেক্টেড এক বা একাধিক লেয়ারে ইনপুট হিসেবে দিয়ে সবার সাথে সবার গুন/যোগ করে স্কোর জেনারেট করা হয়। ভ্রমণটা ট্রেনিং টাইপের হলে স্কোর এবং আসল আউটপুট এর পার্থক্য দেখে চক্কর দিতে থাকে এরর কমানোর জন্য। আর ভ্রমণটা ট্রেনিং শেষে প্রেডিকশনের জন্য হলে, একটা স্কোর দিয়ে দেয় যার মাধ্যমে আমরা চিনতে পারি যে ফটোটা নৌকার।
\ No newline at end of file +উপরে একটা পূর্ণ CNN এর ব্লক ডায়াগ্রাম দেখানো হয়েছে। প্রথমেই বাম পাশে একটি নৌকার ছবি ইনপুট দেয়া হচ্ছে এবং এই নেটওয়ার্কে দুই স্টেজে Convolution এবং Pooling এর কাজ করা হয়েছে (প্রয়োজনে আরও হতে পারে)। তো, প্রথম কনভলিউশন এবং পুলিং এর সময় এই ফটো থেকে কিছু গুরুত্বপূর্ণ পিক্সেল গুচ্ছ বা অবজেক্টের অংশ বিশেষ আলাদা করে নিয়ে নেয়া সম্ভব হয়। আবারো, কনভলিউশন এবং পুলিং লেয়ারের সাহায্যে যতটা সম্ভব সিমপ্লিফ্যায়েড কিন্তু অর্থবহ ইমেজে নিয়ে আসা হয়। এরপর সেই লেয়ারের আউটপুট কে ফুলি কানেক্টেড এক বা একাধিক লেয়ারে ইনপুট হিসেবে দিয়ে সবার সাথে সবার গুন/যোগ করে স্কোর জেনারেট করা হয়। ভ্রমণটা ট্রেনিং টাইপের হলে স্কোর এবং আসল আউটপুট এর পার্থক্য দেখে চক্কর দিতে থাকে এরর কমানোর জন্য। আর ভ্রমণটা ট্রেনিং শেষে প্রেডিকশনের জন্য হলে, একটা স্কোর দিয়ে দেয় যার মাধ্যমে আমরা চিনতে পারি যে ফটোটা নৌকার।
+ + +[Next : বিভিন্ন লাইব্রেরীর ব্যবহার](dl-libraries.md) \ No newline at end of file diff --git a/cnn-full.md b/cnn-full.md index fcd1013..3dbabc8 100644 --- a/cnn-full.md +++ b/cnn-full.md @@ -1,4 +1,8 @@ +[Topics](/SUMMARY.md) + ## কমপ্লিট কনভলিউশনাল নিউরাল নেটওয়ার্ক নিচের ফিগারটার দিকে একবার চোখ বুলাই -
ডায়াগ্রামের একদম বামে আমাদের একটি ইনপুট ইমেজ। তার উপর আমরা দুটো ফিল্টার/মাস্ক অ্যাপ্লাই করেছি প্রত্যেকটা ৪ বার করে মোট ৮ বার (উপর নিচে ডানে বামে)। এটাই আমাদের কনভলিউশনাল লেয়ার। এরপর পুলিং লেয়ারে আমরা চিহ্নিত করেছি ক্ষুদ্র কিছু অংশ বিশেষ যার মাধ্যমে আমাদের আসল বর্ণ গুলো গঠিত এবং সেগুলোর অস্তিত্ব রেকর্ড করেছি। পুলিং লেয়ারের যে আউটপুট ইমেজ অর্থাৎ 2x2 সাইজের সিম্পল ইমেজ সেগুলোকে পিক্সেলেটেড থেকে অর্থবহ ম্যাট্রিক্সে কনভার্ট করা হয়েছে। এখান থেকেই ফুলি কানেক্টেড লেয়ার শুরু বা চিরচেনা নিউরাল নেটওয়ার্ক স্টাইলে ক্যালকুলেশন শুরু। আর তাই এই লেয়ারে, আগের ধাপে পাওয়া ম্যাট্রিক্স গুলোকে (প্রত্যেকটি) ডান পাশের প্রত্যেকটি ফিল্টার ম্যাট্রিক্স এর সাথে মাল্টিপ্লাই করা হয়েছে এবং আউটপুট লেয়ার তথা শেষ ধাপে স্কোর চেক করা হচ্ছে যে, কোন ফিল্টারের সাপেক্ষে স্কোর হাই।
\ No newline at end of file +ডায়াগ্রামের একদম বামে আমাদের একটি ইনপুট ইমেজ। তার উপর আমরা দুটো ফিল্টার/মাস্ক অ্যাপ্লাই করেছি প্রত্যেকটা ৪ বার করে মোট ৮ বার (উপর নিচে ডানে বামে)। এটাই আমাদের কনভলিউশনাল লেয়ার। এরপর পুলিং লেয়ারে আমরা চিহ্নিত করেছি ক্ষুদ্র কিছু অংশ বিশেষ যার মাধ্যমে আমাদের আসল বর্ণ গুলো গঠিত এবং সেগুলোর অস্তিত্ব রেকর্ড করেছি। পুলিং লেয়ারের যে আউটপুট ইমেজ অর্থাৎ 2x2 সাইজের সিম্পল ইমেজ সেগুলোকে পিক্সেলেটেড থেকে অর্থবহ ম্যাট্রিক্সে কনভার্ট করা হয়েছে। এখান থেকেই ফুলি কানেক্টেড লেয়ার শুরু বা চিরচেনা নিউরাল নেটওয়ার্ক স্টাইলে ক্যালকুলেশন শুরু। আর তাই এই লেয়ারে, আগের ধাপে পাওয়া ম্যাট্রিক্স গুলোকে (প্রত্যেকটি) ডান পাশের প্রত্যেকটি ফিল্টার ম্যাট্রিক্স এর সাথে মাল্টিপ্লাই করা হয়েছে এবং আউটপুট লেয়ার তথা শেষ ধাপে স্কোর চেক করা হচ্ছে যে, কোন ফিল্টারের সাপেক্ষে স্কোর হাই।
+ +[Next : পরীক্ষা করে দেখা](cnn-check.md) \ No newline at end of file diff --git a/cnn-intro.md b/cnn-intro.md index 11410a7..9373a63 100644 --- a/cnn-intro.md +++ b/cnn-intro.md @@ -1,3 +1,5 @@ +[Topics](/SUMMARY.md) + ## সহজ উদাহরণ চলুন আমরা একটা জগতের কথা চিন্তা করি যে জগতে একটা কম্পিউটার আছে যার ডিসপ্লে মাত্র 2x2 পিক্সেল সাইজের। আর ওই জগতে সব মিলে ২টা ক্যারেক্টার বা বর্ণ আছে যেগুলো হচ্ছে, \ এবং / অর্থাৎ ওখানকার কিবোর্ড দিয়ে একটা ফরওয়ার্ড স্ল্যাস অথবা একটা ব্যাক স্ল্যাস লেখা যায় :P অনেকটা নিচের মত -
এরপর সেই ছোট আকারের ইমেজ গুলোকে নিয়ে পরের স্টেজে নিউরাল নেটওয়ার্ক এর কাজ করা হয়। এই স্টেজে নিউরাল নেটওয়ার্কের লজিক, ওয়েট ইত্যাদি ফিক্স করে, এর আগের স্টেজের ইমেজ অর্থাৎ Pooled ইমেজের উপর কাজ করা হয় এবং পিক্সেল কম্বিনেশন যাচাই করে পার্থক্য বা চেনার কাজ করা হয়। এই দ্বিতীয় স্টেজটাকে বলে Fully Connected Layer আর প্রথম স্টেজকে বলে Convolution Layer (এই স্টেজে পুলিং বা অন্যান্য আরও কিছু ফাংশনের ব্যবহার থাকতে পারে)।
একটু বিস্তারিতভাবে এবার এই কাজ গুলো করে দেখি। নিচের ফিগারটি খেয়াল করুন,

এখানে বাম পাশে একটা X ওয়ালা ইমেজ আছে। তার ডানে আমরা দুটো ফিল্টার নিয়েছি। একটা ফিল্টার আসলে ব্যাক স্ল্যাস চেনার ফিল্টার। এই ফিল্টার দিয়ে বড় ইমেজের উপর ঘুরে বেড়ালে (Convolution করলে) যেখানেই হাই ভ্যালু পাবে সেখানেই একটা ব্যাক স্ল্যাস পাওয়া গেছে বলে ধরে নেয়া যাবে। আগের মত চিন্তা করলে এটা ব্যাক স্ল্যাস চেনার সেই ওয়েট ম্যাট্রিক্স। শুধু +1 আর -1 কে + এবং - এ চিহ্নিত করা হয়েছে (অর্থাৎ [1 -1 -1 1] => [+ - - +]. আরেকটা ফিল্টার হচ্ছে ফরওয়ার্ড স্ল্যাস চেনার ফিল্টার। এই ফিল্টারকে বড় ইমেজের উপড়ে ঘুরিয়ে নিয়ে বেড়ালে যখনই হাই ভ্যালু পাবে তখন সেখানে একটা ফরওয়ার্ড স্ল্যাস আছে বলে জানা যাবে।
\ No newline at end of file +এখানে বাম পাশে একটা X ওয়ালা ইমেজ আছে। তার ডানে আমরা দুটো ফিল্টার নিয়েছি। একটা ফিল্টার আসলে ব্যাক স্ল্যাস চেনার ফিল্টার। এই ফিল্টার দিয়ে বড় ইমেজের উপর ঘুরে বেড়ালে (Convolution করলে) যেখানেই হাই ভ্যালু পাবে সেখানেই একটা ব্যাক স্ল্যাস পাওয়া গেছে বলে ধরে নেয়া যাবে। আগের মত চিন্তা করলে এটা ব্যাক স্ল্যাস চেনার সেই ওয়েট ম্যাট্রিক্স। শুধু +1 আর -1 কে + এবং - এ চিহ্নিত করা হয়েছে (অর্থাৎ [1 -1 -1 1] => [+ - - +]. আরেকটা ফিল্টার হচ্ছে ফরওয়ার্ড স্ল্যাস চেনার ফিল্টার। এই ফিল্টারকে বড় ইমেজের উপড়ে ঘুরিয়ে নিয়ে বেড়ালে যখনই হাই ভ্যালু পাবে তখন সেখানে একটা ফরওয়ার্ড স্ল্যাস আছে বলে জানা যাবে।
+ + +[Next : কনভলিউশন করা](convolution.md) diff --git a/cnn.md b/cnn.md index 2f92d53..80ba893 100644 --- a/cnn.md +++ b/cnn.md @@ -1,4 +1,9 @@ +[Topics](/SUMMARY.md) + ## কনভলিউশনাল নিউরাল নেটওয়ার্ক এতক্ষণ পর্যন্ত খেয়াল করেছেন যে, বার বার আমরা ম্যাট্রিক্স নিয়ে কাজ করছি। আর কাজের কাজ বলতে আমরা যা করেছি তা হচ্ছে ডাটার মধ্যে থেকে প্যাটার্ন খুঁজে বের করা এবং সেই খুঁজে পাওয়া প্যাটার্নকে কাজে লাগিয়ে পরবর্তীতে ওই রকম ডাটা সম্পর্কিত বিষয়ে প্রেডিকশন দেয়া। মজার ব্যাপার হচ্ছে, আমরা সবাই জানি – ডিজিটাল ইমেজ বা ফটো কিন্তু আর কিছুই না একটা 2D অ্যারে বা ম্যাট্রিক্স (গ্রে স্কেল বা সাদাকালো ফটোর ক্ষেত্রে)। সেই ম্যাট্রিক্সের প্রত্যেকটি সেল হচ্ছে এক একটি পিক্সেল। আর সেলের ভ্যালু হচ্ছে পিক্সেল ভ্যালু বা কালার এর মান। আবার ম্যাট্রিক্সটার (row সংখ্যা x column সংখ্যা) মানেই হচ্ছে ওই ফটোর রেজোল্যুশন। তাহলে বিষয়টা কি দাঁড়ালো? -আমরা নিউরাল নেটওয়ার্ক দিয়ে তাহলে ডিজিটাল ফটো অ্যানালাইসিস করতে পারি। বলতে গেলে – ফটো রিকগনিশনের কাজ করতে পারি। আর নিউরাল নেটওয়ার্কের মাধ্যমে ইমেজ ক্লাসিফিকেশনের জন্য বহুল ব্যবহৃত একটা টেকনিক/মডেল হচ্ছে কনভলিউশনাল নিউরাল নেটওয়ার্ক। নিউরাল নেটওয়ার্ক কি সেটা আমরা ইতোমধ্যে জেনেছি। এবার আমরা জানবো কনভলিউশন মানে কি এবং এটার প্রয়োজনীয়তা। বলে রাখা ভালো এই কনভলিউশন টার্মটা কিন্তু শুধু নিউরাল নেটওয়ার্ক বা ইমেজ প্রসেসিং এর সাথে সম্পর্কিত কোন টার্ম না। বরং এটা একটা জেনেরিক ম্যাথেমেটিক্যাল টার্ম। সিগনাল প্রসেসিং –এও এর ব্যবহার দেখা যায় (বিশেষ টাইপের একরকম সিগনালও কিন্তু ঘুরে ফিরে ম্যাট্রিক্স ইমেজের মতই। যাহোক সময় থাকলে সেটা পরে উদ্ধার করবো 🙂 )। \ No newline at end of file +আমরা নিউরাল নেটওয়ার্ক দিয়ে তাহলে ডিজিটাল ফটো অ্যানালাইসিস করতে পারি। বলতে গেলে – ফটো রিকগনিশনের কাজ করতে পারি। আর নিউরাল নেটওয়ার্কের মাধ্যমে ইমেজ ক্লাসিফিকেশনের জন্য বহুল ব্যবহৃত একটা টেকনিক/মডেল হচ্ছে কনভলিউশনাল নিউরাল নেটওয়ার্ক। নিউরাল নেটওয়ার্ক কি সেটা আমরা ইতোমধ্যে জেনেছি। এবার আমরা জানবো কনভলিউশন মানে কি এবং এটার প্রয়োজনীয়তা। বলে রাখা ভালো এই কনভলিউশন টার্মটা কিন্তু শুধু নিউরাল নেটওয়ার্ক বা ইমেজ প্রসেসিং এর সাথে সম্পর্কিত কোন টার্ম না। বরং এটা একটা জেনেরিক ম্যাথেমেটিক্যাল টার্ম। সিগনাল প্রসেসিং –এও এর ব্যবহার দেখা যায় (বিশেষ টাইপের একরকম সিগনালও কিন্তু ঘুরে ফিরে ম্যাট্রিক্স ইমেজের মতই। যাহোক সময় থাকলে সেটা পরে উদ্ধার করবো 🙂 )। + + +[Next : ব্যাসিক পরিচিতি](cnn-intro.md) \ No newline at end of file diff --git a/convolution.md b/convolution.md index 7a9e43a..c094e4a 100644 --- a/convolution.md +++ b/convolution.md @@ -1,3 +1,5 @@ +[Topics](/SUMMARY.md) + ## Convolution শুরু করা যাক
প্রথমেই আমরা উপড়ের ফিল্টার কে সাথে নিয়ে বড় ইমেজের টপ লেফট সাইডে বসিয়েছি এবং ওখানকার পিক্সেল ভ্যালুর সাথে ফিল্টার এর সমন্বয় ঘটিয়ে (গুন যোগ) ভ্যালু পেয়েছি 4. পরের ধাপে বলা হচ্ছে যদি তুমি একটা হাই ভ্যালু পাও তার মানে হচ্ছে তুমি যে অংশ (অঙ্গ) খুজতেছিলা সেটা পাওয়া গেছে। অর্থাৎ Convolution এর এই ধাপে একটা \ পাওয়া গেছে। কারণ \ এর ফিল্টার দিয়ে চেক করা হচ্ছিল এবং ভ্যালু হাই এসেছে। এরপর ফিল্টারকে টপ রাইটে স্লাইড করে নিয়ে যেতে হবে নিচের মত,
@@ -20,4 +22,7 @@

এভাবে আমাদের ৪ বর্ণ ওয়ালা জগতের বাকি দুটো বর্ণ \ এবং / এর জন্যও কাজ করে নিতে পারেন। সেক্ষেত্রেও তিন পিক্সেল ওয়ালা স্ল্যাসের সাপেক্ষে থ্রেসহোল্ড মেনে পুলিং লেয়ারের কাজ শেষে দুই পিক্সেল ওয়ালা স্ল্যাস পাবেন।
-আবারও বলে নিচ্ছি, কনভলিউশন লেয়ারের কাজ হচ্ছে একটি ফিল্টার (র্যান্ডম বা নির্দিষ্ট) এর সাহায্যে একটি পূর্ণ ইমেজের উপর স্লাইড করে ঘুরে বেরিয়ে খুঁজে দেখা সেখানে কোথায় কোথায় ফিল্টার মোতাবেক অংশের অস্তিত্ব পাওয়া যায়। আর অস্তিত্ব আছে/নাই এর সিধান্ত নির্ভর করবে পুলিং লেয়ার এবং তার কাছে থাকা একটা থ্রেসহোল্ড ভ্যালুর উপর।
\ No newline at end of file +আবারও বলে নিচ্ছি, কনভলিউশন লেয়ারের কাজ হচ্ছে একটি ফিল্টার (র্যান্ডম বা নির্দিষ্ট) এর সাহায্যে একটি পূর্ণ ইমেজের উপর স্লাইড করে ঘুরে বেরিয়ে খুঁজে দেখা সেখানে কোথায় কোথায় ফিল্টার মোতাবেক অংশের অস্তিত্ব পাওয়া যায়। আর অস্তিত্ব আছে/নাই এর সিধান্ত নির্ভর করবে পুলিং লেয়ার এবং তার কাছে থাকা একটা থ্রেসহোল্ড ভ্যালুর উপর।
+ + +[Next : ফুলি কানেক্টেড লেয়ার](fully-connected-layer.md) \ No newline at end of file diff --git a/dl-libraries.md b/dl-libraries.md index c18641a..1a4ed87 100644 --- a/dl-libraries.md +++ b/dl-libraries.md @@ -1,3 +1,8 @@ +[Topics](/SUMMARY.md) + ## বিভিন্ন ডিপ লার্নিং লাইব্রেরীর ব্যবহার আর্টিফিশিয়াল নিউরাল নেটওয়ার্কের গভীরের কর্মকাণ্ড গুলোর উপর যথেষ্ট পরিমাণ স্বচ্ছ ধারনা থাকার পরেই কেবল এরকম কিছু লাইব্রেরীর ব্যবহার করা উচিৎ হবে। TensorFlow বা সিমিলার লাইব্রেরী গুলো আসলে কি করে? আপনি ম্যানুয়ালি হয়ত Matrix Multiplication, Activation Function, Cost Function বা Gradient Descent করার জন্য এবং নিউরাল নেটওয়ার্কের লেয়ার বা নিউরন গুলো ডিফাইন করার জন্য এক গাদা কোড লিখবেন। যেভাবে এখন পর্যন্ত আমরা করেছি। আবার হয়ত, ইমেজ বা সাইন্ড নিয়ে কাজ করার সময় প্রাথমিক স্টেজে ইমেজ/সাউন্ড ডাটা ম্যানিপুলেট করার জন্যও কিছু কোড লিখবেন, যেমন - ইমেজকে গ্রেস্কেলে কনভার্ট করা, চ্যানেল আলাদা করা, ডাইমেনশন ঠিক ঠাক করা ইত্যাদি। মেশিন লার্নিং এবং ডিপ লার্নিং লাইব্রেরী গুলো বস্তুত এই ম্যানুয়াল কাজ গুলোর জন্যই কিছু রেডিমেড ফাংশন বা মেথড বানিয়ে রেখেছে। অর্থাৎ যে কাজ গুলো সবসময়ই করতে হয় যেকোনো মডেল নিয়ে কাজ করার সময়, সেগুলোর জন্য বিভিন্ন হেল্পার ফাংশন এবং আরও কিছু উপকারী ও গুরুত্বপূর্ণ ফিচার নিয়েই এরকম লাইব্রেরী গুলো তৈরি। -এগুলোকে হাই লেভেল বলতে হবে কারন আপনি অনেক ফাংশনের শুধু নাম ব্যবহার করেই সেটার ইমপ্লিমেন্টেশন করে ফেলতে পারেন। সেগুলোর গভীরে আসলেই কি ম্যাথ বা লজিক কাজ করছে তা জানা লাগবে না। এমনকি TensorFlow, Theano টাইপের হাই লেভেল লাইব্রেরীর উপর ভিত্তি করেও আরও হাই লেভেল লাইব্রেরী তৈরি হচ্ছে, যেমন - Keras. যত হাই লেভেল, তত বেশি অ্যাবসট্র্যাক্ট লেয়ার অর্থাৎ আপনার কাছ থেকে তত বেশি কর্মকাণ্ড হাইড করে রাখা। তাই, সবসময় হাই লেভেল লাইব্রেরী ব্যবহারে অভ্যস্ত হওয়া উচিৎ নয়। এটা সব রকম কন্টেক্সট এর জন্যই মেনে চলা উচিৎ। সেটা মেশিন লার্নিং হোক বা সাধারণ প্রোগ্রামিং বা ডেভেলপমেন্ট হোক।
\ No newline at end of file +এগুলোকে হাই লেভেল বলতে হবে কারন আপনি অনেক ফাংশনের শুধু নাম ব্যবহার করেই সেটার ইমপ্লিমেন্টেশন করে ফেলতে পারেন। সেগুলোর গভীরে আসলেই কি ম্যাথ বা লজিক কাজ করছে তা জানা লাগবে না। এমনকি TensorFlow, Theano টাইপের হাই লেভেল লাইব্রেরীর উপর ভিত্তি করেও আরও হাই লেভেল লাইব্রেরী তৈরি হচ্ছে, যেমন - Keras. যত হাই লেভেল, তত বেশি অ্যাবসট্র্যাক্ট লেয়ার অর্থাৎ আপনার কাছ থেকে তত বেশি কর্মকাণ্ড হাইড করে রাখা। তাই, সবসময় হাই লেভেল লাইব্রেরী ব্যবহারে অভ্যস্ত হওয়া উচিৎ নয়। এটা সব রকম কন্টেক্সট এর জন্যই মেনে চলা উচিৎ। সেটা মেশিন লার্নিং হোক বা সাধারণ প্রোগ্রামিং বা ডেভেলপমেন্ট হোক।
+ + +[Next : TensorFlow পরিচিতি](tf-intro.md) \ No newline at end of file diff --git a/fully-connected-layer.md b/fully-connected-layer.md index e2f5736..307cf35 100644 --- a/fully-connected-layer.md +++ b/fully-connected-layer.md @@ -1,3 +1,5 @@ +[Topics](/SUMMARY.md) + ## ফুলি কানেক্টেড লেয়ার এবার আসুন এই লেয়ারের কাজ নিয়ে ভাবি - এই লেয়ার ইনপুট হিসেবে নেয় কনভলিউশন এবং পুলিং লেয়ার কাছ থেকে পাওয়া প্রসেসড ইমেজ এবং তার উপর চিন্তা (সেই চিন্তা) এবং ট্রেনিং করে প্যাটার্ন বুঝে নেয় এবং ঠিক করে কোনটা কোন ইমেজ।

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

এক্ষেত্রেও O এর ফিল্টারের সাথেই বেশি স্কোর আসছে তাই সঠিক উত্তর, O.
\ No newline at end of file +এক্ষেত্রেও O এর ফিল্টারের সাথেই বেশি স্কোর আসছে তাই সঠিক উত্তর, O.
+ + +[Next : কমপ্লিট কনভলিউশনাল নিউরাল নেটওয়ার্ক](cnn-full.md) \ No newline at end of file diff --git a/ml-vs-dl.md b/ml-vs-dl.md index 242b945..af8747b 100644 --- a/ml-vs-dl.md +++ b/ml-vs-dl.md @@ -1,3 +1,5 @@ +[Topics](/SUMMARY.md) + ## মেশিন লার্নিং বনাম ডিপ লার্নিং ইতোমধ্যে একটা ধারনা পেয়ে গেছেন যে, ডিপ লার্নিং এর মাধ্যমে বেশিরভাগ সময়েই ডাটা ক্লাসিফিকেশনের কাজ করা হয়ে থাকে। কিন্তু যদি আপনার মেশিন লার্নিং সম্পর্কে ধারনা থেকে থাকে তাহলে হয়ত এটাও জানেন যে, মেশিন লার্নিং এর বিভিন্ন অ্যালগরিদম ব্যবহার করেও ডাটা ক্লাসিফিকেশনের কাজ করা যায়। কিন্তু দুটো মাধ্যমের কাজ করার ধরনে বেশ কিছু পার্থক্য আছে। যেমন- মেশিন লার্নিং ব্যবহার করে ইমেজ ক্লাসিফিকেশনের কাজ করার সময় প্রথমেই ট্রেনিং ডাটা(ইমেজ) থেকে আপনার নিজেকেই ফিচার (যেমন-এইজ, কর্নার ইত্যাদি) এক্সট্র্যাক্ট করে নিতে হবে আপনার মেশিন লার্নিং মডেলকে ট্রেনিং করানোর জন্য। এরপর নতুন ডাটা(ইমেজ) নিয়ে সেটার ধরন প্রেডিক্ট করার সময় আপনার মেশিন লার্নিং মডেল সেই ফিচার গুলোকেই ভ্যারিয়েবল (চেনার হাতিয়ার) হিসেবে কাজে লাগিয়ে নতুন ইমেজটাকে অ্যানালাইস করে ডিসিশন নেয়। এভাবে ইমেজের মধ্যে কোন একটি নির্দিষ্ট অবজেক্ট রিকগনিশন বা ডিটেকশণ এর কাজও করা হয়ে থাকে। @@ -6,4 +8,7 @@ কখন আপনার জন্য মেশিন লার্নিং অ্যাপ্রোচ ভালো হবে এবং কখন আপনি ডিপ লার্নিং নিয়ে কাজ করলে সুবিধা হবে সেটা নির্ভর করে আপনার নির্দিষ্ট সমস্যাটির টাইপের উপর এবং আপনার কাছে থাকা ডাটার পরিমাণ ও ধরনের উপর। তবে খুব সহজ ভাবেও প্রাথমিক একটা সিদ্ধান্ত নিতে পারেন। যেমন- আপনার কাছে যদি তুলনামূলক কম পরিমাণ ডাটা থাকে এবং আপনার কম্পিউটেশন পাওয়ারও সীমাবদ্ধ হয় তাহলে আপনার জন্য মেশিন লার্নিং অ্যাপ্রোচ ভালো হবে। এতে করে আপনি একদিকে কম রিসোর্স ব্যবহার করেই সমস্যাটি নিয়ে কাজ করতে পারবেন এবং সাথে সাথে যেহেতু আপনি নিজেই ডাটা থেকে ফিচার পছন্দ করেন আর বর্তমানে অনেক গুলো মেশিন লার্নিং অ্যালগরিদম আছে তাই, বিভিন্ন ফিচার এবং অ্যালগরিদম এর কম্বিনেশন ব্যবহার করে আপনার মডেল এর পারফর্মেন্স চেক করে দেখতে পারেন। -অন্যদিকে যদি আপনার কাছে অনেক পরিমাণ ডাটা থাকে এবং সাথে সাথে আপনার কাছে যথেষ্ট পরিমাণ কম্পিউটেশন পাওয়ার থাকে তাহলে আপনার জন্য ডিপ লার্নিং অ্যাপ্রোচ ভালো হবে। এতে করে অনেক অনেক ডাটা থেকে ট্রেনিং করানোর সময় আপনার ডিজাইন করা নিউরাল নেটওয়ার্কটি অনেক বেশি পারফেকশন দেখাতে পারবে। এমনকি সেই ডাটা গুলো থেকে ধরে ধরে আপনাকে ফিচার পছন্দ না করে দিলেও চলবে। তবে এর জন্য মারাত্মক রকম কম্পিউটেশন পাওয়ার এবং সময়ও দরকার পরবে। \ No newline at end of file +অন্যদিকে যদি আপনার কাছে অনেক পরিমাণ ডাটা থাকে এবং সাথে সাথে আপনার কাছে যথেষ্ট পরিমাণ কম্পিউটেশন পাওয়ার থাকে তাহলে আপনার জন্য ডিপ লার্নিং অ্যাপ্রোচ ভালো হবে। এতে করে অনেক অনেক ডাটা থেকে ট্রেনিং করানোর সময় আপনার ডিজাইন করা নিউরাল নেটওয়ার্কটি অনেক বেশি পারফেকশন দেখাতে পারবে। এমনকি সেই ডাটা গুলো থেকে ধরে ধরে আপনাকে ফিচার পছন্দ না করে দিলেও চলবে। তবে এর জন্য মারাত্মক রকম কম্পিউটেশন পাওয়ার এবং সময়ও দরকার পরবে। + + +[Next : আর্টিফিশিয়াল নিউরাল নেটওয়ার্ক](artificial-nn.md) \ No newline at end of file diff --git a/multi-layer-nn-check.md b/multi-layer-nn-check.md index c0ddb72..90f6cec 100644 --- a/multi-layer-nn-check.md +++ b/multi-layer-nn-check.md @@ -1,3 +1,8 @@ +[Topics](/SUMMARY.md) + ## খাতা কলমে পরীক্ষা করে দেখা
নোটঃ উপরোক্ত দুটি টিউটরিয়ালের সিমপ্লিসিটির জন্য এখানে bias ফ্যাক্টরক এড়িয়ে যাওয়া হচ্ছে। bias হচ্ছে ইনপুট এবং ওয়েটের গুন ফলের সাথে আরেকটি কন্সট্যান্ট টাইপ ভ্যালু যোগ করা। অর্থাৎ যদি একটি নিউরনে একটি Edge এর মাধ্যমে ইনপুট আসে x এবং এর সাথে Edge এর ওয়েট গুন হয় w তাহলে এর সাথে আরেকটি কন্সট্যান্ট (bias) b যোগ করা যেতে পারে নিউরন বা নেটওয়ার্কের নোডে। তাহলে ওই নিউরন বা নোডে উক্ত এইজ, ওয়েটের সাপেক্ষে ভ্যালু জমা হবে z, যেখানে z = wx+b. এই z কে Activation Function এর ইনপুট হিসেবে পরে ব্যবহার করা হয়। আরেকভাবে বলা যায় - weight হচ্ছে Edge বা কানেকশনের প্রোপার্টি আর bias হচ্ছে নিউরন বা নোডের প্রোপার্টি।
\ No newline at end of file +নোটঃ উপরোক্ত দুটি টিউটরিয়ালের সিমপ্লিসিটির জন্য এখানে bias ফ্যাক্টরক এড়িয়ে যাওয়া হচ্ছে। bias হচ্ছে ইনপুট এবং ওয়েটের গুন ফলের সাথে আরেকটি কন্সট্যান্ট টাইপ ভ্যালু যোগ করা। অর্থাৎ যদি একটি নিউরনে একটি Edge এর মাধ্যমে ইনপুট আসে x এবং এর সাথে Edge এর ওয়েট গুন হয় w তাহলে এর সাথে আরেকটি কন্সট্যান্ট (bias) b যোগ করা যেতে পারে নিউরন বা নেটওয়ার্কের নোডে। তাহলে ওই নিউরন বা নোডে উক্ত এইজ, ওয়েটের সাপেক্ষে ভ্যালু জমা হবে z, যেখানে z = wx+b. এই z কে Activation Function এর ইনপুট হিসেবে পরে ব্যবহার করা হয়। আরেকভাবে বলা যায় - weight হচ্ছে Edge বা কানেকশনের প্রোপার্টি আর bias হচ্ছে নিউরন বা নোডের প্রোপার্টি।
+ + +[Next : কনভলিউশনাল নিউরাল নেটওয়ার্ক](cnn.md) \ No newline at end of file diff --git a/multi-layer-nn-code.md b/multi-layer-nn-code.md index 012744d..ef63e21 100644 --- a/multi-layer-nn-code.md +++ b/multi-layer-nn-code.md @@ -1,3 +1,5 @@ +[Topics](/SUMMARY.md) + ## আবারও প্রোগ্রামিংএখন আমরা আগের চ্যাপ্টারে ডিজাইন করা ডিপ নিউরাল নেটওয়ার্কের একটা প্রোগ্রাম্যাটিক ভার্সন দেখবোঃ
@@ -106,4 +108,7 @@ if __name__ == "__main__":train ফাংশনের শেষে এই দুটো লেয়ারের ওয়েট গুলো অ্যাডজাস্ট করা হয়েছে এবং ট্রেনিং লুপ চালিয়ে যাওয়া হয়েছে। এর নিচে থাকা think ফাংশনের কাজ খুব সহজেই বুঝে যাওয়ার কথা কারণ এটা সেই ব্যাসিক নেটওয়ার্কের মতই (শুধু দুই ধাপের আউটপুট আলাদা করে চিন্তা করছে)।
উপরের প্রোগ্রামটি রান করালে নিচের মত আউটপুট আসতে পারেঃ

পুরো ঘটনাকে ৩টী স্টেজে ভাগ করে নিলে আমরা দেখতে পাই যে - প্রথম ধাপে শুধুমাত্র দুই লেয়ারের প্রত্যেকটি Edge এর ওয়েটকে র্যান্ডোমলি নির্ধারণ করা হচ্ছে। পরবর্তী ধাপে পুরো ট্রেনিং প্রসেস শেষে দুটো লেয়ারের প্রত্যেকটি এইজের আপডেটেড এবং অপ্টিমাইজড ওয়েট গুলো দেখতে পাচ্ছি। এবং তৃতীয় ধাপে নিউরাল নেটওয়ার্কে নতুন একটি অচেনা ইনপুট কম্বিনেশন দিয়ে আমরা অউটপুট পাচ্ছি 0.0078 অর্থাৎ সফলভাবে 0 প্রেডিক্ট করতে পারছে আমাদের ডিপ নিউরাল নেটওয়ার্ক :) :D
\ No newline at end of file +পুরো ঘটনাকে ৩টী স্টেজে ভাগ করে নিলে আমরা দেখতে পাই যে - প্রথম ধাপে শুধুমাত্র দুই লেয়ারের প্রত্যেকটি Edge এর ওয়েটকে র্যান্ডোমলি নির্ধারণ করা হচ্ছে। পরবর্তী ধাপে পুরো ট্রেনিং প্রসেস শেষে দুটো লেয়ারের প্রত্যেকটি এইজের আপডেটেড এবং অপ্টিমাইজড ওয়েট গুলো দেখতে পাচ্ছি। এবং তৃতীয় ধাপে নিউরাল নেটওয়ার্কে নতুন একটি অচেনা ইনপুট কম্বিনেশন দিয়ে আমরা অউটপুট পাচ্ছি 0.0078 অর্থাৎ সফলভাবে 0 প্রেডিক্ট করতে পারছে আমাদের ডিপ নিউরাল নেটওয়ার্ক :) :D
+ + +[Next : পরীক্ষা করে দেখা](multi-layer-nn-check.md) \ No newline at end of file diff --git a/multi-layer-nn.md b/multi-layer-nn.md index 069a283..79d0145 100644 --- a/multi-layer-nn.md +++ b/multi-layer-nn.md @@ -1,3 +1,5 @@ +[Topics](/SUMMARY.md) + ## মাল্টি লেয়ার অর্থাৎ ডিপ নিউরাল নেটওয়ার্ক আগের চ্যাপ্টারে উল্লেখ করা সমস্যাটি ছিল, @@ -14,4 +16,7 @@\ No newline at end of file + + + +[Next : কোডিং](multi-layer-nn-code.md) \ No newline at end of file diff --git a/simple-nn-check.md b/simple-nn-check.md index e8e078f..0eac415 100644 --- a/simple-nn-check.md +++ b/simple-nn-check.md @@ -1,3 +1,5 @@ +[Topics](/SUMMARY.md) + ## পরীক্ষা করে দেখা তাহলে চলুন এবার খাতা কলম নিয়ে পরীক্ষায় বসে যাই কিভাবে এই কৃত্রিম নিউরনের নেটওয়ার্ক এই সিদ্ধান্ত নিতে পারলো। আপডেটেড ওয়েট গুলোকে এবার নিউরাল নেটওয়ার্কের ফিগারে বসাই, @@ -8,3 +10,4 @@  +[Next : মাল্টি লেয়ার নিউরাল নেটওয়ার্ক](multi-layer-nn.md) \ No newline at end of file diff --git a/simple-nn-code.md b/simple-nn-code.md index 7fead00..99254f4 100644 --- a/simple-nn-code.md +++ b/simple-nn-code.md @@ -1,3 +1,5 @@ +[Topics](/SUMMARY.md) + ## “Talk is cheap. Show me the code.” এই বানীটি কার, তার নাম জানলে নিচে কমেন্ট করতে পারেন। এই যে আমরা নিউরাল নেটওয়ার্ক এর কাহিনীকে ফলো করে সেরকম নীতিতে আমাদের বাস্তবের কিছু সমস্যা সমাধানের জন্য একটা পদ্ধতি নিয়ে চিন্তা করলাম সেটা তো আর খাতা কলমে করে কুলাবে না। এই কাজটা কম্পিউটার দিয়ে করালে খুব দ্রুত আমাদের উদ্দেশ্য পুড়ন হবে। আর সবাই জানে, কম্পিউটারকে দিয়ে ইচ্ছামত কামলা খাটুনি খাটিয়ে নেয়া যায়। শুধুমাত্র তাকে তার ভাষায় আদেশ দিতে হবে। এর নাম নাকি আবার কম্পিউটার প্রোগ্রাম। তো, কি আর করা, লিখে ফেলি; কম্পিউটার বোঝে এবং আমাদের লিখতে সহজ এমন একটা ভাষায় একটা প্রোগ্রাম, যার মাধ্যমে বস্তুতপক্ষে আমরা উপড়ে আলোচ্য কাজ গুলোকেই করবো। @@ -168,4 +170,7 @@ NeuralNetwork ক্লাসের কোড বোঝার পর আবা পুরো ১০০০০ বার লুপের পর অর্থাৎ ট্রেনিং শেষের পর ওয়েটেড ম্যাট্রিক্স এর ফাইনাল রূপ আসবে নিচের মত, - \ No newline at end of file + + + +[Next : পরীক্ষা করে দেখা](simple-nn-check.md) \ No newline at end of file diff --git a/simple-nn-diagram.md b/simple-nn-diagram.md index 562401d..d05b1cd 100644 --- a/simple-nn-diagram.md +++ b/simple-nn-diagram.md @@ -1,6 +1,10 @@ +[Topics](/SUMMARY.md) + ## ফিরে দেখা এ অবস্থায় আমরা আমাদের সিঙ্গেল নিউরন বিশিষ্ট আর্টিফিশিয়াল নিউরাল নেটওয়ার্কের চেহারাটা একটু স্মার্ট ভাবে দেখি,  -এখানে n এর মান 3 ধরলেই আমাদের সমস্যার সাথে উপরের ফিগারটি মিলে যাবে। \ No newline at end of file +এখানে n এর মান 3 ধরলেই আমাদের সমস্যার সাথে উপরের ফিগারটি মিলে যাবে। + +[Next : কোডিং](simple-nn-code.md) \ No newline at end of file diff --git a/simple-nn-train.md b/simple-nn-train.md index 6c962c8..43fd9c3 100644 --- a/simple-nn-train.md +++ b/simple-nn-train.md @@ -1,3 +1,5 @@ +[Topics](/SUMMARY.md) + ## কিভাবে এই নিউরনকে ট্রেনিং দেয়া যায়? আমরা যেটা করতে পারি – নিউরনটার তিনটা ইনপুটে আমাদের প্রথম উদাহরণের তিনটা ভ্যালু দেবো আর আউপুট প্রান্তে সেই উদাহরণ মোতাবেক সঠিক আউপুটটা রাখবো। এরপর ইনপুট লাইন (গ্রাফ কনসেপ্টে Edge) গুলোতে কিছু Weight (ভ্যালু) সেট করবো। এরপর প্রত্যেকটা ইনপুট ভ্যালুর সাথে ওই Edge এর ভ্যালু তথা Weight গুন করে নিউরন-বডি/Soma বা Node এ একটা Weighted Sum জমা করবো। এক্ষেত্রে এই Node টী হচ্ছে আমাদের আউপুট নোড। যাই হোক, এই নোডে জমা হওয়া ভ্যালুর পরিমাণ কিন্তু 1 এর অনেক বেশি বা 0 এর চেয়ে কম হতে পারে। কিন্তু আমরা তো চাই, ভ্যালুটা 1 আর 0 এর মাঝা মাঝি থাকুক যাতে করে আমরা আমাদের আগে থেকেই সেট করা আউপুট ভ্যালু (যেমন – প্রথম উদাহরণ মোতাবেক 0) –এর সাথে তুলনা করতে পারি। তাই আউটপুট নোডে জমা হওয়া ভ্যালুকে আমরা গণিতের একটা স্পেশাল গ্যারাকলে ফেলে কোন না কোন ভাবে 1 ও 0 এর মাঝেই রাখবো। এটাকে বলে Activation Function (নিচেই আমরা এর চেহারা এবং ব্যবহার দেখবো)। এরপর সেই ক্যালকূলেটেড ভ্যালু এবং প্রথম উদাহরণ মোতাবেক আউটপুটের ভ্যালুর মধ্যে তুলনা করে আমরা ভুলের পরিমাণ দেখবো। @@ -49,3 +51,4 @@  +[Next : ফিরে দেখা](simple-nn-diagram.md) \ No newline at end of file diff --git a/simple-nn.md b/simple-nn.md index 392cd11..bb4f345 100644 --- a/simple-nn.md +++ b/simple-nn.md @@ -1,3 +1,5 @@ +[Topics](/SUMMARY.md) + ## বানিয়ে ফেলি একটা নিউরাল নেটওয়ার্ক উপরোক্ত প্রসেসটাকেই আমরা কম্পিউটারে প্রোগ্রাম লিখে সিমুলেট করতে পারি। তাহলেই কিন্তু একটা আর্টিফিশিয়াল নিউরন বানাতে পারছি বলে ধরে নয়া যায়। তাই না? তবে এটা সত্যিকারের নিউরনের মত জটিল হবে না কারণ, আগেই বলা হয়েছে যে আর্টিফিশিয়াল নিউরাল নেটওয়ার্ক শুধুমাত্র সত্যিকারের নিউরনের নেটওয়ার্কের কনসেপ্ট এর উপর ভিত্তি করে তৈরি। তার মানে এই না যে এটা শতভাগ একই। যাই হোক আমরা একটি সিঙ্গেল নিউরন তৈরি করি যার মাধ্যমেই আমরা ছোট্ট একটা সমস্যা সমাধানের চেষ্টা করবো। ধরে নেই আমাদের আর্টিফিশিয়াল ব্রেনে একটাই মাত্র নিউরন। @@ -12,4 +14,6 @@  -এই নিউরনেরও তিনটা ইনপুট নেয়ার জন্য তিনটা ডেন্ড্রাইট আছে আর একটা এক্সন আছে যেখানে আমরা আউপুট পেয়ে যাবো কারণ এই ব্রেনে আর কোন নিউরন নাই যাকে এই এক্সনের আউপুটকে ইনপুট হিসেবে দিতে হবে। \ No newline at end of file +এই নিউরনেরও তিনটা ইনপুট নেয়ার জন্য তিনটা ডেন্ড্রাইট আছে আর একটা এক্সন আছে যেখানে আমরা আউপুট পেয়ে যাবো কারণ এই ব্রেনে আর কোন নিউরন নাই যাকে এই এক্সনের আউপুটকে ইনপুট হিসেবে দিতে হবে। + +[Next : ট্রেনিং এর পদ্ধতি](simple-nn-train.md) \ No newline at end of file diff --git a/tf-hello-world.md b/tf-hello-world.md index 35999ce..a02e1be 100644 --- a/tf-hello-world.md +++ b/tf-hello-world.md @@ -1,3 +1,5 @@ +[Topics](/SUMMARY.md) + ## হ্যালো ওয়ার্ল্ড যেহেতু এটা পাইথন লাইব্রেরী ব্যতীত আর কিছুই না। তাই এর ইন্সটলেশন আর দশটা স্বাভাবিক পাইথন লাইব্রেরীর মতই। অর্থাৎ, আপনার পছন্দের মেশিনে বা পাইথন রিয়েল/ভার্চুয়াল এনভায়রনমেন্টে pip ইন্সটলার দিয়ে সহজেই ইন্সটল করে নিতে পারেন নিচের কমান্ড ইস্যু। করে। @@ -47,4 +49,7 @@ with tf.Session() as session: দুটো প্রোগ্রামের আউটপুট একই আসবে [5]. এ অবস্থায় হয়ত মনে হচ্ছে নর্মাল একটা যোগ করতে এতো কাহিনী? আসলে এটার মাধ্যমে আপনি বুঝতে পারলেন TensorFlow কিভাবে কাজ করে। কিন্তু এই লেভেলের সস্থা কাজ নিশ্চয়ই আপনি TensorFlow দিয়ে করাবেন না, তাই না? অতি জটিল কম্পিউটেশন সহজ করার সাথে সাথে এই লাইব্রেরীর আরও কিছু সুবিধার মধ্যে আছে - আপনি একই গ্রাফ যেকোনো রকম হার্ডওয়্যার প্ল্যাটফর্মে রান করাতে পারবেন। CPU, GPU, Cluster বা Android, iOS. যাই হোক। বলে নেয়া ভালো Google I/O 17 এ Google কিন্তু নতুন এক ধরনের হার্ডওয়্যার TPU (Tensor Processing Unit) রিলিজ দিয়েছে যা স্পেশালি Tensor ভিত্তিক কম্পিউটেশনের জন্য ইফেক্টিভলি ডিজাইন করা। -আরেকবার আমরা TensoFlow এর একটা এক লাইনের সংজ্ঞা লিখে ফেলি - “একটি কম্পিউটেশন গ্রাফে বিভিন্ন অপারেশনের মধ্যে টেনসর ফর্মে ডাটা আদান প্রদান করে একবারে পুরো কম্পিউটেশন যেকোনো হার্ডওয়্যারে সম্পন্ন করার জন্য একটি মডেল বা লাইব্রেরী হচ্ছে TensorFlow.” আর এতো লম্বা মনে না থাকলে শুধু এটুকু মনে রাখুন এটা একটা “কম্পিউটেশনাল লাইব্রেরী” :D \ No newline at end of file +আরেকবার আমরা TensoFlow এর একটা এক লাইনের সংজ্ঞা লিখে ফেলি - “একটি কম্পিউটেশন গ্রাফে বিভিন্ন অপারেশনের মধ্যে টেনসর ফর্মে ডাটা আদান প্রদান করে একবারে পুরো কম্পিউটেশন যেকোনো হার্ডওয়্যারে সম্পন্ন করার জন্য একটি মডেল বা লাইব্রেরী হচ্ছে TensorFlow.” আর এতো লম্বা মনে না থাকলে শুধু এটুকু মনে রাখুন এটা একটা “কম্পিউটেশনাল লাইব্রেরী” :D + + +[Next : ভ্যারিয়েবল ও প্লেসহোল্ডার](tf-var-placeholder.md) \ No newline at end of file diff --git a/tf-img-class-cost-opt.md b/tf-img-class-cost-opt.md index 5d9946d..344c171 100644 --- a/tf-img-class-cost-opt.md +++ b/tf-img-class-cost-opt.md @@ -1,3 +1,5 @@ +[Topics](/SUMMARY.md) + ## Cost ফাংশন মডেলকে এফিসিয়েন্ট করার জন্য আমাদেরকে weights, biases এগুলা ওপ্টিমাইজ করতে হবে। আর এগুলো অপ্টিমাইজ করার জন্য আমাদেরকে জানতে হবে মডেলটা কত ভালো পারফর্ম করল। এটা বের করতে পারবো y_pred এবং y_true এর তুলনা করে। এই তুলনা করার অনেক রকম পদ্ধতির মধ্যে একটি পদ্ধতি হচ্ছে cross-entropy মিজারমেন্ট। ক্লাসিফিকেশন সমস্যার জন্য এটি একটি বহুল ব্যবহৃত Cost Function. এটি একটি Continuous Function যার মান সবসময় পজিটিভ। কিন্তু যদি প্রেডিক্টেড আউটপুট এবং আমাদের চাহিদা মোতাবেক আউটপুট একদম মিলে যায় তাহলে এর মান আসে শূন্য। তার মানে, আমরা যদি এই ফ্যাক্টরটির দিকে নজর রাখি এবং সব সময় চাই যে, ওয়েট - বায়াস অ্যাডজাস্ট করে করে এই ফ্যাক্টরটির মান যতটা শূন্যের কাছাকাছি আনা যায় -তাহলেই আমরা ভালো Accuracy এর দিকে আগাবো। @@ -43,3 +45,6 @@ correct_prediction = tf.equal(y_pred_cls, y_true_cls) # Cell 22 accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) ``` + + +[Next : TensorFlow রান](tf-img-class-run.md) \ No newline at end of file diff --git a/tf-img-class-data-dimen.md b/tf-img-class-data-dimen.md index dcb1d29..c341030 100644 --- a/tf-img-class-data-dimen.md +++ b/tf-img-class-data-dimen.md @@ -1,3 +1,5 @@ +[Topics](/SUMMARY.md) + ## ডাটা ডাইমেনশন ডাটা ডাইমেনশন সম্পর্কে স্বচ্ছ ধারনা রাখতে হবে মাথায়। কোন ম্যাট্রিক্স বা টেনসরের ডাইমেনশন এর প্রসঙ্গ আসা মাত্রই যাতে কল্পনায় স্পষ্ট একটা ভিউ আসে ওই ডাটা অবজেক্টটার। তাহলে সব কিছু সহজ মনে হবে। যাই হোক, এরকম কিছু ডাইমেনশনকে আমরা কিছু ভ্যারিয়েবলে স্টোর করি এবার এবং সেলটি এক্সিকিউট করে নেই, @@ -65,3 +67,6 @@ plot_images(images=images, cls_true=cls_true) এই অবস্থায় নোটবুকের সেলটি এক্সিকিউট করলে নিচের মত আউটপুট আসবে,এই যে, বিভিন্ন স্টেজের মধ্যেকার কো-রিলেশনকে চেনার জন্য এবং কাজে লাগানোর জন্য এক বা একাধিক মধ্যবর্তী লেয়ারের সংযোজন, এটাকেই ডিপ লার্নিং বলে।
-
+
+
+[Next : গ্রাফ তৈরি](tf-img-class-graph.md)
\ No newline at end of file
diff --git a/tf-img-class-exp-data.md b/tf-img-class-exp-data.md
index 25c6f2a..0227202 100644
--- a/tf-img-class-exp-data.md
+++ b/tf-img-class-exp-data.md
@@ -1,3 +1,5 @@
+[Topics](/SUMMARY.md)
+
## ডাটা বুঝে নেয়া
পুরো ডাটাসেটে যথাযথ ক্লাস (কোনটা কোন ডিজিট) ম্যাপ করা ৭০০০০ ইমেজ আছে যার মধ্যে ৫৫০০০ হচ্ছে ট্রেনিং ইমেজ, ১০০০০ হচ্ছে টেস্ট ইমেজ এবং ৫০০০ হচ্ছে ভ্যালিডেশন ইমেজ। অর্থাৎ পুরো ডাটাসেটটি ৩টি সাবসেটে বিভক্ত। কিছু ডাটা ট্রেনিং এর জন্য, কিছু ডাটা ভ্যালিডেশনের জন্য, আর কিছু ডাটা হচ্ছে ফাইনাল মডেলকে টেস্ট করার জন্য। এই সাবসেট গুলো মিউচুয়ালি এক্সকুসিভ অর্থাৎ একটি সেটের ডাটা আরেকটি সেটের মধ্যে নাই। অর্থাৎ কমন কোন এলিমেন্ট এই ৩টি সেটের মধ্যে নাই। পরীক্ষা করে দেখতে পারি নিচের কোড ওয়ালা সেলটি এক্সিকিউট করে,
@@ -66,4 +68,6 @@ data.test.cls[0:5]
array([7, 2, 1, 0, 4])
```
-এতক্ষণে One-Hot Vector প্রেজেন্টেশন এবং argmax মেথডের কাজ বোঝা গেছে নিশ্চয়ই?
\ No newline at end of file
+এতক্ষণে One-Hot Vector প্রেজেন্টেশন এবং argmax মেথডের কাজ বোঝা গেছে নিশ্চয়ই?
+
+[Next : ডাটা ডাইমেনশন](tf-img-class-data-dimen.md)
diff --git a/tf-img-class-graph.md b/tf-img-class-graph.md
index 9dc3f50..d6dd7bc 100644
--- a/tf-img-class-graph.md
+++ b/tf-img-class-graph.md
@@ -1,3 +1,5 @@
+[Topics](/SUMMARY.md)
+
## TensorFlow গ্রাফ তৈরি
আগেই বলা হয়েছে, TensorFlow দিয়ে কাজ করতে হলে প্রথমেই একটি পুরনাঙ্গ কম্পিউটেশনাল গ্রাফ তৈরি করতে হয়। এরপর পুরো গ্রাফকে এক সাথে এক্সিকিউট করা যায়। এতে করে পাইথনে আলাদা আলাদা করে ক্যালকুলেশন গুলো লিখে এক্সিকিউট করালে যেমন টাইম বা অন্য কমপ্লেক্সিটি হতে পারতো, তার চেয়ে অনেক ইফেক্টিভলি ক্যালকুলেশন গুলো হয়।
গ্রাফে আরও সুবিধা হচ্ছে স্বয়ংক্রিয় ভাবে গ্র্যাডিয়েন্ট ডিসেন্ট বের করা যায় যাতে করে মডেলের ভ্যারিয়েবল (ওয়েট, বায়াস) গুলোকে অপ্টিমাইজ করা যায় সহজেই। যেহেতু পুরো গ্রাফ জুড়ে অনেক গুলো কম্পিউটেশন থাকে এতে করে ডেরিভ্যাটিভ এর চেইন রুল এর মাধ্যমে খুব দ্রুত এবং সহজে পুরো গ্রাফের গ্র্যাডিয়েন্ট ডিসেন্ট বের করা যায়।
@@ -57,4 +59,6 @@ weights = tf.Variable(tf.zeros([img_size_flat, num_classes]))
```python
# Cell 14
biases = tf.Variable(tf.zeros([num_classes]))
-```
\ No newline at end of file
+```
+
+[Next : মডেল](tf-img-class-model.md)
\ No newline at end of file
diff --git a/tf-img-class-model.md b/tf-img-class-model.md
index e4ed26d..d02ee2d 100644
--- a/tf-img-class-model.md
+++ b/tf-img-class-model.md
@@ -1,3 +1,5 @@
+[Topics](/SUMMARY.md)
+
## মডেল
খুব সহজ ভাবে বলতে গেলে, আমাদের এই ম্যাথেম্যাটিক্যাল মডেলটি প্লেস হোল্ডার ভ্যারিয়েবল x এর মধ্যে থাকা ইমেজ গুলোর সাথে weights গুন করে এবং শেষে bias যোগ করে। আর এর রেজাল্টটি হয় একটি ম্যাট্রিক্স যার সেইপ হবে, [num_images, num_classes]. কারন কি? কারন হচ্ছে, ইনপুট লেয়ারের ডাটা ম্যাট্রিক্স বা x এর সেইপ হচ্ছে [num_images, img_size_flat] (None এর জায়গায় যেকোনো সংখ্যক ইমেজ দেয়া যাবে, মনে আছে? ধরলাম num_images সংখ্যক দিয়েছি), আর weights এর সেইপ হচ্ছে [img_size_flat, num_classes]. XxY আর YxZ গুন করলে XxZ -ই হয় :) তাই রেজাল্ট ম্যাট্রিক্সের সেইপ হবে, [num_images, num_classes].
আর এই ম্যাট্রিক্সের প্রত্যেকটি row এর সাথে bias ভেক্টর যোগ হয়। অর্থাৎ যদি ম্যাট্রিক্সে শুধু দুটো ইমেজের ডাটা থাকে সেগুলো হবে এরকম - [[c00, c01, c02, c03, c04, c05, c06, c07, c08, c09],[c10, c11, c12, c13, c14, c15, c16, c17, c18, c19]]. আর এগুলোর সাথে bias (দেখতে এমন - [b0, b1, b2, b3, b4, b5, b6, b7, b8, b9]) ভেক্টর যোগ করা যাবে খুব সহজে নিচের স্টেটমেন্ট দিয়ে।
@@ -23,4 +25,7 @@ y_pred = tf.nn.softmax(logits)
y_pred_cls = tf.argmax(y_pred, dimension=1)
```
-এখন পর্যন্ত আমরা কি করলাম? ইনপুট ইমেজ নেয়ার ব্যবস্থা করেছি। সেই ইনপুট ইমেজগুলোর ট্রু ক্লাস ইনপুটের ব্যবস্থা করেছি। ইনপুট লেয়ার আর আউটপুট লেয়ার এর কাঠামো ঠিক করেছি। ইনপুট লেয়ার থেকে শূন্য ওয়েট গুন করে তারপর বায়াস যোগ করে আউটপুট লেয়ারে logits ম্যাট্রিক্স পেয়েছি এবং এটার উপর softmax, argmax আপ্লাই করে প্রত্যেকটি ইমেজের জন্য একটি করে ক্যালকুলেটেড ক্লাস পেয়েছি। অর্থাৎ ইনপুট নিয়ে মডেলের হিসাব করা রেজাল্ট পাওয়ার ব্যবস্থা হয়েছে। এরপর দেখতে হবে এই রেজাল্ট সঠিক ক্লাস থেকে কেমন ফারাকে আছে। তার উপর ভিত্তি করেই ওয়েট, বায়াস গুলো অ্যাডজাস্ট করবো।
\ No newline at end of file
+এখন পর্যন্ত আমরা কি করলাম? ইনপুট ইমেজ নেয়ার ব্যবস্থা করেছি। সেই ইনপুট ইমেজগুলোর ট্রু ক্লাস ইনপুটের ব্যবস্থা করেছি। ইনপুট লেয়ার আর আউটপুট লেয়ার এর কাঠামো ঠিক করেছি। ইনপুট লেয়ার থেকে শূন্য ওয়েট গুন করে তারপর বায়াস যোগ করে আউটপুট লেয়ারে logits ম্যাট্রিক্স পেয়েছি এবং এটার উপর softmax, argmax আপ্লাই করে প্রত্যেকটি ইমেজের জন্য একটি করে ক্যালকুলেটেড ক্লাস পেয়েছি। অর্থাৎ ইনপুট নিয়ে মডেলের হিসাব করা রেজাল্ট পাওয়ার ব্যবস্থা হয়েছে। এরপর দেখতে হবে এই রেজাল্ট সঠিক ক্লাস থেকে কেমন ফারাকে আছে। তার উপর ভিত্তি করেই ওয়েট, বায়াস গুলো অ্যাডজাস্ট করবো।
+
+
+[Next : Cost ফাংশন ও অপটিমাইজেশন](tf-img-class-cost-opt.md)
\ No newline at end of file
diff --git a/tf-img-class-run.md b/tf-img-class-run.md
index cb033bc..c0be763 100644
--- a/tf-img-class-run.md
+++ b/tf-img-class-run.md
@@ -179,4 +179,6 @@ session.close()
উপরের আলোচ্য ধাপ গুলো নিয়ে পূর্ণ .ipynb ডকুমেন্টটি পাওয়া যাবে এখানেপূর্ণ প্রোগ্রামঃ -যারা নোটবুকে ধাপে ধাপে এই কোড ব্লক গুলো এক্সিকিউট করেছেন বোঝার জন্য এবং এখন গোছানো একটা প্রোগ্রাম চান যেকোনো জায়গায় রান করার জন্য - ক্লিক করুন এখানে। \ No newline at end of file +যারা নোটবুকে ধাপে ধাপে এই কোড ব্লক গুলো এক্সিকিউট করেছেন বোঝার জন্য এবং এখন গোছানো একটা প্রোগ্রাম চান যেকোনো জায়গায় রান করার জন্য - ক্লিক করুন এখানে। + + diff --git a/tf-img-class.md b/tf-img-class.md index f11d046..ce73ab1 100644 --- a/tf-img-class.md +++ b/tf-img-class.md @@ -1,3 +1,5 @@ +[Topics](/SUMMARY.md) + ## TensorFlow দিয়ে ইমেজ ক্লাসিফিকেশনের উপযোগী একটি NN তৈরি এই সেকশনে আমরা, অনেক রকম মানুষের বিভিন্ন রকম হাতের লেখা ওয়ালা কিছু নাম্বার/ডিজিট এর ফটো কালেকশন দিয়ে একটা নিউরাল নেটওয়ার্ক-কে ট্রেইন করিয়ে তারপর কিছু টেস্ট ফটো দিয়ে সেগুলোর সঠিক ক্লাসিফিকেশন জানার চেষ্টা করবো। সহজ ভাবে বলতে - "হ্যান্ড রিটেন ডিজিট ক্লাসিফিকেশন প্রব্লেম"। @@ -30,3 +32,6 @@ data = input_data.read_data_sets("data/MNIST/", one_hot=True) ``` এর মাধ্যমে ১২ মেগাবাইট সাইজের ডাটাসেটটি ডাউনলোড হবে যদি data/MNIST/ পাথে আগে থেকেই ডাটাসেটটি না থাকে। + + +[Next : ডাটা বুঝে নেয়া](tf-img-class-exp-data.md) \ No newline at end of file diff --git a/tf-intro.md b/tf-intro.md index d4efcd8..b68f674 100644 --- a/tf-intro.md +++ b/tf-intro.md @@ -1,3 +1,5 @@ +[Topics](/SUMMARY.md) +

আপনি কি আগে জানতেন - বিশেষ ধরনের মাল্টিডাইমেনশনাল অ্যারে টাইপের ডাটা স্ট্রাকচারকেই Tensor বলে? :)@@ -66,4 +68,7 @@ Tensor: [21 22 23]]] ``` -যা হোক, TensorFlow নিয়ে কাজ করার ধাপ দুইটা - উপরে উল্লেখিত স্টাইলে গ্রাফ তৈরি এবং তারপর সেই গ্রাফকে রান বা এক্সিকিউট করা। আবার বলি, গ্রাফের মধ্যে থাকে কিছু ডিফাইন করা অপারেশন। \ No newline at end of file +যা হোক, TensorFlow নিয়ে কাজ করার ধাপ দুইটা - উপরে উল্লেখিত স্টাইলে গ্রাফ তৈরি এবং তারপর সেই গ্রাফকে রান বা এক্সিকিউট করা। আবার বলি, গ্রাফের মধ্যে থাকে কিছু ডিফাইন করা অপারেশন। + + +[Next : TensorFlow ব্যাসিক](tf-hello-world.md) \ No newline at end of file diff --git a/tf-var-placeholder.md b/tf-var-placeholder.md index 5b07dd2..a450336 100644 --- a/tf-var-placeholder.md +++ b/tf-var-placeholder.md @@ -1,3 +1,5 @@ +[Topics](/SUMMARY.md) + ## ভ্যারিয়েবল ও প্লেসহোল্ডার এখন যেহেতু আমরা ডাটা স্ট্রাকচার গুলো নিয়ে মোটামুটি একটা ধারনা পেলাম, চলুন দেখি TensorFlow কিভাবে ভ্যারিয়েবল হ্যান্ডেল করে। ভ্যারিয়েবল ডিফাইন করতে হয় tf.Variable() স্টেটমেন্টের মাধ্যমে। তবে মনে রাখা জরুরি - কম্পিউটেশন গ্রাফে ভ্যারিয়েবল গুলো ব্যবহারের জন্য সেগুলোকে ইনিসিয়ালাইজ করতে হবে (গ্রাফকে সেশনে রান করানোর আগেই)। এটা করা হয় tf. global_variables_initializer() এর মাধ্যমে। কোন ভ্যারিয়েবলের ভ্যালু আপডেট করার জন্য আমাদেরকে assign অপারেশনকে রান করতে হয়। @@ -95,4 +97,7 @@ with tf.Session() as session: [[ 30. 32. 34.] [ 36. 38. 40.] [ 42. 44. 46.]]] -``` \ No newline at end of file +``` + + +[Next : TensorFlow দিয়ে ইমেজ ক্লাসিফায়ার তৈরি](tf-img-class.md) \ No newline at end of file