1. সংক্ষিপ্ত বিবরণ
এই ল্যাবে, আপনি আধুনিক কনভলিউশনাল আর্কিটেকচার সম্পর্কে শিখবেন এবং আপনার জ্ঞান ব্যবহার করে "স্কুইজেনেট" নামক একটি সহজ কিন্তু কার্যকর কনভনেট বাস্তবায়ন করবেন।
এই ল্যাবে কনভোলিউশনাল নিউরাল নেটওয়ার্ক সম্পর্কে প্রয়োজনীয় তাত্ত্বিক ব্যাখ্যা অন্তর্ভুক্ত রয়েছে এবং এটি ডেভেলপারদের জন্য গভীর শিক্ষা সম্পর্কে শেখার জন্য একটি ভালো সূচনা বিন্দু।
এই ল্যাবটি "কেরা অন টিপিইউ" সিরিজের ৪র্থ অংশ। আপনি নিম্নলিখিত ক্রমে অথবা স্বাধীনভাবে এগুলি করতে পারেন।
- TPU-গতির ডেটা পাইপলাইন: tf.data.Dataset এবং TFRecords
- ট্রান্সফার লার্নিং সহ আপনার প্রথম কেরাস মডেল
- কেরাস এবং টিপিইউ সহ কনভোলিউশনাল নিউরাল নেটওয়ার্ক
- [এই ল্যাব] আধুনিক কনভনেট, স্কুইজনেট, এক্সসেপশন, কেরাস এবং টিপিইউ সহ

তুমি কি শিখবে
- কেরাস কার্যকরী শৈলী আয়ত্ত করতে
- স্কুইজনেট আর্কিটেকচার ব্যবহার করে একটি মডেল তৈরি করা
- আপনার স্থাপত্যের উপর দ্রুত প্রশিক্ষণ এবং পুনরাবৃত্তি করার জন্য TPU ব্যবহার করা
- tf.data.dataset দিয়ে ডেটা অগমেন্টেশন বাস্তবায়ন করা
- TPU-তে একটি প্রি-ট্রেনড লার্জ মডেল (Xception) সূক্ষ্ম-টিউন করার জন্য
প্রতিক্রিয়া
এই কোড ল্যাবে যদি কিছু ভুল দেখতে পান, তাহলে অনুগ্রহ করে আমাদের জানান। GitHub সমস্যাগুলির [ প্রতিক্রিয়া লিঙ্ক ] মাধ্যমে প্রতিক্রিয়া প্রদান করা যেতে পারে।
২. গুগল কোলাবোরেটরি দ্রুত শুরু
এই ল্যাবটি গুগল কোলাবোরেটরি ব্যবহার করে এবং আপনার পক্ষ থেকে কোনও সেটআপের প্রয়োজন হয় না। কোলাবোরেটরি শিক্ষার উদ্দেশ্যে একটি অনলাইন নোটবুক প্ল্যাটফর্ম। এটি বিনামূল্যে CPU, GPU এবং TPU প্রশিক্ষণ প্রদান করে।

আপনি এই নমুনা নোটবুকটি খুলে কয়েকটি কক্ষ ঘুরে Colaboratory-এর সাথে পরিচিত হতে পারেন।
একটি TPU ব্যাকএন্ড নির্বাচন করুন

Colab মেনুতে, Runtime > Change runtime type নির্বাচন করুন এবং তারপর TPU নির্বাচন করুন। এই কোড ল্যাবে আপনি হার্ডওয়্যার-অ্যাক্সিলারেটেড প্রশিক্ষণের জন্য সমর্থিত একটি শক্তিশালী TPU (টেন্সর প্রসেসিং ইউনিট) ব্যবহার করবেন। প্রথম এক্সিকিউশনে রানটাইমের সাথে সংযোগ স্বয়ংক্রিয়ভাবে হয়ে যাবে, অথবা আপনি উপরের ডানদিকের কোণায় "Connect" বোতামটি ব্যবহার করতে পারেন।
নোটবুক সম্পাদন

একটি কক্ষে ক্লিক করে এবং Shift-ENTER ব্যবহার করে একের পর এক কক্ষ সম্পাদন করুন। আপনি Runtime > Run all ব্যবহার করে সম্পূর্ণ নোটবুকটিও চালাতে পারেন।
সুচিপত্র

সকল নোটবুকের একটি সূচিপত্র থাকে। আপনি বাম দিকের কালো তীর ব্যবহার করে এটি খুলতে পারেন।
লুকানো কোষ

কিছু কোষে কেবল তাদের শিরোনাম দেখাবে। এটি একটি Colab-নির্দিষ্ট নোটবুক বৈশিষ্ট্য। ভিতরের কোডটি দেখতে আপনি সেগুলিতে ডাবল ক্লিক করতে পারেন তবে এটি সাধারণত খুব আকর্ষণীয় হয় না। সাধারণত সমর্থন বা ভিজ্যুয়ালাইজেশন ফাংশন। ভিতরের ফাংশনগুলি সংজ্ঞায়িত করার জন্য আপনাকে এখনও এই কোষগুলি চালাতে হবে।
প্রমাণীকরণ

একটি অনুমোদিত অ্যাকাউন্টের মাধ্যমে প্রমাণীকরণ করলে, Colab আপনার ব্যক্তিগত Google Cloud Storage বাকেট অ্যাক্সেস করতে পারবে। উপরের কোড স্নিপেটটি একটি প্রমাণীকরণ প্রক্রিয়া শুরু করবে।
৩. [তথ্য] টেনসর প্রসেসিং ইউনিট (TPU) কী?
সংক্ষেপে

কেরাসে TPU-তে মডেল প্রশিক্ষণের কোড (এবং TPU উপলব্ধ না থাকলে GPU বা CPU-তে ফিরে যান):
try: # detect TPUs
tpu = tf.distribute.cluster_resolver.TPUClusterResolver.connect()
strategy = tf.distribute.TPUStrategy(tpu)
except ValueError: # detect GPUs
strategy = tf.distribute.MirroredStrategy() # for CPU/GPU or multi-GPU machines
# use TPUStrategy scope to define model
with strategy.scope():
model = tf.keras.Sequential( ... )
model.compile( ... )
# train model normally on a tf.data.Dataset
model.fit(training_dataset, epochs=EPOCHS, steps_per_epoch=...)
আমরা আজ TPU ব্যবহার করে ইন্টারেক্টিভ গতিতে (প্রতি প্রশিক্ষণ রানে মিনিট) একটি ফুলের শ্রেণিবিন্যাসকারী তৈরি এবং অপ্টিমাইজ করব।

টিপিইউ কেন?
আধুনিক জিপিইউগুলি প্রোগ্রামেবল "কোর"-এর চারপাশে সংগঠিত, একটি অত্যন্ত নমনীয় স্থাপত্য যা তাদেরকে 3D রেন্ডারিং, গভীর শিক্ষা, শারীরিক সিমুলেশন ইত্যাদির মতো বিভিন্ন কাজ পরিচালনা করতে দেয়। অন্যদিকে, টিপিইউগুলি একটি ক্লাসিক ভেক্টর প্রসেসরকে একটি ডেডিকেটেড ম্যাট্রিক্স মাল্টিপ্লাই ইউনিটের সাথে যুক্ত করে এবং নিউরাল নেটওয়ার্কের মতো বৃহৎ ম্যাট্রিক্স গুণনের প্রাধান্য যেখানে যেকোনো কাজে দক্ষতা অর্জন করে।

উদাহরণ: একটি ঘন নিউরাল নেটওয়ার্ক স্তর যা ম্যাট্রিক্স গুণন হিসেবে কাজ করে, যেখানে আটটি ছবির একটি ব্যাচ একসাথে নিউরাল নেটওয়ার্কের মাধ্যমে প্রক্রিয়া করা হয়। অনুগ্রহ করে একটি লাইন x কলামের গুণন পরীক্ষা করে দেখুন যে এটি আসলেই একটি ছবির সমস্ত পিক্সেল মানের একটি ওজনযুক্ত যোগফল করছে কিনা। কনভোলিউশনাল স্তরগুলিকে ম্যাট্রিক্স গুণন হিসেবেও উপস্থাপন করা যেতে পারে যদিও এটি একটু জটিল ( ব্যাখ্যা এখানে, বিভাগ 1 এ )।
হার্ডওয়্যার
MXU এবং VPU
একটি TPU v2 কোর একটি Matrix Multiply Unit (MXU) দিয়ে তৈরি যা ম্যাট্রিক্স গুণন এবং একটি Vector Processing Unit (VPU) পরিচালনা করে অন্যান্য সমস্ত কাজের জন্য যেমন অ্যাক্টিভেশন, সফটম্যাক্স ইত্যাদি। VPU float32 এবং int32 গণনা পরিচালনা করে। অন্যদিকে MXU একটি মিশ্র নির্ভুলতা 16-32 বিট ফ্লোটিং পয়েন্ট ফর্ম্যাটে কাজ করে।

মিশ্র স্পষ্টতা ভাসমান বিন্দু এবং bfloat16
MXU bfloat16 ইনপুট এবং float32 আউটপুট ব্যবহার করে ম্যাট্রিক্স গুণ গণনা করে। মধ্যবর্তী সঞ্চয় float32 নির্ভুলতার সাথে সম্পাদিত হয়।

নিউরাল নেটওয়ার্ক প্রশিক্ষণ সাধারণত হ্রাসপ্রাপ্ত ফ্লোটিং পয়েন্ট নির্ভুলতার কারণে সৃষ্ট শব্দের বিরুদ্ধে প্রতিরোধী হয়। এমন কিছু ক্ষেত্রে আছে যেখানে শব্দ অপ্টিমাইজারকে একত্রিত করতেও সাহায্য করে। ১৬-বিট ফ্লোটিং পয়েন্ট নির্ভুলতা ঐতিহ্যগতভাবে গণনা ত্বরান্বিত করার জন্য ব্যবহৃত হয়ে আসছে কিন্তু float16 এবং float32 ফর্ম্যাটের রেঞ্জ খুব আলাদা। float32 থেকে float16 এ নির্ভুলতা কমানোর ফলে সাধারণত ওভার এবং আন্ডারফ্লো হয়। সমাধান বিদ্যমান কিন্তু float16 কাজ করার জন্য সাধারণত অতিরিক্ত কাজ প্রয়োজন।
এই কারণেই গুগল TPU গুলিতে bfloat16 ফর্ম্যাট চালু করেছে। bfloat16 হল একটি ছেঁটে ফেলা float32 যার এক্সপোনেন্ট বিট এবং রেঞ্জ float32 এর মতোই। এটি, TPU গুলি bfloat16 ইনপুট কিন্তু float32 আউটপুট সহ মিশ্র নির্ভুলতায় ম্যাট্রিক্স গুণ গণনা করে, এর অর্থ হল, সাধারণত, হ্রাসকৃত নির্ভুলতার কর্মক্ষমতা লাভ থেকে উপকৃত হওয়ার জন্য কোনও কোড পরিবর্তনের প্রয়োজন হয় না।
সিস্টোলিক অ্যারে
MXU হার্ডওয়্যারে ম্যাট্রিক্স গুণন প্রয়োগ করে একটি তথাকথিত "সিস্টোলিক অ্যারে" আর্কিটেকচার ব্যবহার করে যেখানে ডেটা উপাদানগুলি হার্ডওয়্যার গণনা ইউনিটের একটি অ্যারের মধ্য দিয়ে প্রবাহিত হয়। (চিকিৎসাবিদ্যায়, "সিস্টোলিক" বলতে হৃদপিণ্ডের সংকোচন এবং রক্ত প্রবাহকে বোঝায়, এখানে ডেটা প্রবাহকে বোঝায়।)
একটি ম্যাট্রিক্স গুণনের মৌলিক উপাদান হল একটি ম্যাট্রিক্সের একটি রেখা এবং অন্য ম্যাট্রিক্সের একটি কলামের মধ্যে একটি বিন্দু গুণফল (এই বিভাগের শীর্ষে চিত্রটি দেখুন)। একটি ম্যাট্রিক্স গুণের জন্য Y=X*W, ফলাফলের একটি উপাদান হবে:
Y[2,0] = X[2,0]*W[0,0] + X[2,1]*W[1,0] + X[2,2]*W[2,0] + ... + X[2,n]*W[n,0]
একটি GPU-তে, এই ডট প্রোডাক্টটিকে একটি GPU "কোর"-এ প্রোগ্রাম করা হবে এবং তারপর সমান্তরালভাবে যতগুলি "কোর" পাওয়া যাবে তার উপর এটি চালানো হবে যাতে ফলাফলের ম্যাট্রিক্সের প্রতিটি মান একবারে গণনা করার চেষ্টা করা যায়। যদি ফলাফলের ম্যাট্রিক্স 128x128 বড় হয়, তাহলে 128x128=16K "কোর" উপলব্ধ থাকতে হবে যা সাধারণত সম্ভব নয়। বৃহত্তম GPU-তে প্রায় 4000 কোর থাকে। অন্যদিকে, একটি TPU MXU-তে কম্পিউট ইউনিটগুলির জন্য ন্যূনতম হার্ডওয়্যার ব্যবহার করে: কেবল bfloat16 x bfloat16 => float32 গুণ-সঞ্চয়কারী, অন্য কিছু নয়। এগুলি এত ছোট যে একটি TPU একটি 128x128 MXU-তে 16K প্রয়োগ করতে পারে এবং একবারে এই ম্যাট্রিক্স গুণন প্রক্রিয়া করতে পারে।

উদাহরণ: MXU সিস্টোলিক অ্যারে। কম্পিউট উপাদানগুলি হল গুণ-সঞ্চয়কারী। একটি ম্যাট্রিক্সের মান অ্যারেতে লোড করা হয় (লাল বিন্দু)। অন্য ম্যাট্রিক্সের মান অ্যারের মধ্য দিয়ে প্রবাহিত হয় (ধূসর বিন্দু)। উল্লম্ব রেখাগুলি মানগুলিকে উপরে প্রচার করে। অনুভূমিক রেখাগুলি আংশিক যোগফল প্রচার করে। এটি ব্যবহারকারীর জন্য একটি অনুশীলন হিসাবে রেখে দেওয়া হয় যাতে নিশ্চিত করা যায় যে অ্যারের মধ্য দিয়ে ডেটা প্রবাহিত হওয়ার সাথে সাথে আপনি ডান দিক থেকে ম্যাট্রিক্স গুণনের ফলাফল পাবেন।
এছাড়াও, যখন একটি MXU-তে ডট পণ্য গণনা করা হচ্ছে, তখন মধ্যবর্তী পরিমাণগুলি কেবল সংলগ্ন কম্পিউট ইউনিটগুলির মধ্যে প্রবাহিত হয়। এগুলি মেমরিতে/থেকে/এমনকি একটি রেজিস্টার ফাইলে সংরক্ষণ এবং পুনরুদ্ধার করার প্রয়োজন হয় না। শেষ ফলাফল হল যে TPU সিস্টোলিক অ্যারে আর্কিটেকচারের একটি উল্লেখযোগ্য ঘনত্ব এবং শক্তি সুবিধা রয়েছে, পাশাপাশি ম্যাট্রিক্স গুণ গণনা করার সময় একটি GPU-এর তুলনায় একটি অ-নগণ্য গতি সুবিধা রয়েছে।
ক্লাউড টিপিইউ
যখন আপনি গুগল ক্লাউড প্ল্যাটফর্মে একটি " ক্লাউড TPU v2" অনুরোধ করেন, তখন আপনি একটি ভার্চুয়াল মেশিন (VM) পাবেন যার একটি PCI-সংযুক্ত TPU বোর্ড রয়েছে। TPU বোর্ডে চারটি ডুয়াল-কোর TPU চিপ রয়েছে। প্রতিটি TPU কোরে একটি VPU (ভেক্টর প্রসেসিং ইউনিট) এবং একটি 128x128 MXU (MatriX মাল্টিপ্লাই ইউনিট) রয়েছে। এই "ক্লাউড TPU" সাধারণত নেটওয়ার্কের মাধ্যমে অনুরোধ করা VM-এর সাথে সংযুক্ত থাকে। তাই সম্পূর্ণ ছবিটি এইরকম দেখাচ্ছে:

উদাহরণ: আপনার VM একটি নেটওয়ার্ক-সংযুক্ত "ক্লাউড TPU" অ্যাক্সিলারেটর সহ। "ক্লাউড TPU" নিজেই একটি VM দিয়ে তৈরি যার একটি PCI-সংযুক্ত TPU বোর্ড রয়েছে যার উপর চারটি ডুয়াল-কোর TPU চিপ রয়েছে।
টিপিইউ পড
গুগলের ডেটা সেন্টারগুলিতে, টিপিইউগুলি একটি উচ্চ-কর্মক্ষমতা সম্পন্ন কম্পিউটিং (এইচপিসি) ইন্টারকানেক্টের সাথে সংযুক্ত থাকে যা এগুলিকে একটি খুব বড় অ্যাক্সিলারেটর হিসাবে দেখাতে পারে। গুগল এগুলিকে পড বলে এবং এগুলি 512 টিপিইউ ভি2 কোর বা 2048 টিপিইউ ভি3 কোর পর্যন্ত ধারণ করতে পারে।

চিত্র: একটি TPU v3 পড। HPC ইন্টারকানেক্টের মাধ্যমে সংযুক্ত TPU বোর্ড এবং র্যাক।
প্রশিক্ষণের সময়, অল-রিডুস অ্যালগরিদম ব্যবহার করে TPU কোরের মধ্যে গ্রেডিয়েন্ট বিনিময় করা হয় ( এখানে অল-রিডুসের ভাল ব্যাখ্যা )। প্রশিক্ষণপ্রাপ্ত মডেলটি বড় ব্যাচ আকারের প্রশিক্ষণের মাধ্যমে হার্ডওয়্যারের সুবিধা নিতে পারে।

উদাহরণ: Google TPU-এর 2-D টরয়েডাল মেশ HPC নেটওয়ার্কে অল-রিডুস অ্যালগরিদম ব্যবহার করে প্রশিক্ষণের সময় গ্রেডিয়েন্টের সিঙ্ক্রোনাইজেশন।
সফটওয়্যারটি
বড় ব্যাচ সাইজের প্রশিক্ষণ
TPU-এর জন্য আদর্শ ব্যাচ সাইজ হল প্রতি TPU কোরে ১২৮টি ডেটা আইটেম, কিন্তু হার্ডওয়্যারটি ইতিমধ্যেই প্রতি TPU কোরে ৮টি ডেটা আইটেম থেকে ভালো ব্যবহার দেখাতে পারে। মনে রাখবেন যে একটি ক্লাউড TPU-তে ৮টি কোর থাকে।
এই কোড ল্যাবে, আমরা Keras API ব্যবহার করব। Keras-এ, আপনি যে ব্যাচটি নির্দিষ্ট করবেন তা হল সমগ্র TPU-এর জন্য বিশ্বব্যাপী ব্যাচের আকার। আপনার ব্যাচগুলি স্বয়ংক্রিয়ভাবে 8টিতে বিভক্ত হবে এবং TPU-এর 8টি কোরে চলবে।

অতিরিক্ত পারফরম্যান্স টিপসের জন্য TPU পারফরম্যান্স গাইড দেখুন। খুব বড় ব্যাচ সাইজের জন্য, কিছু মডেলে বিশেষ যত্নের প্রয়োজন হতে পারে, আরও বিস্তারিত জানার জন্য LARSOptimizer দেখুন।
হুডের নিচে: XLA
টেনসরফ্লো প্রোগ্রামগুলি গণনা গ্রাফ সংজ্ঞায়িত করে। TPU সরাসরি পাইথন কোড চালায় না, এটি আপনার টেনসরফ্লো প্রোগ্রাম দ্বারা সংজ্ঞায়িত গণনা গ্রাফ চালায়। হুডের নীচে, XLA (অ্যাক্সিলারেটেড লিনিয়ার অ্যালজেব্রা কম্পাইলার) নামক একটি কম্পাইলার কম্পিউটেশন নোডের টেনসরফ্লো গ্রাফকে TPU মেশিন কোডে রূপান্তরিত করে। এই কম্পাইলারটি আপনার কোড এবং আপনার মেমোরি লেআউটে অনেক উন্নত অপ্টিমাইজেশনও করে। TPU-তে কাজ পাঠানোর সাথে সাথে কম্পাইলেশনটি স্বয়ংক্রিয়ভাবে ঘটে। আপনার বিল্ড চেইনে আপনাকে স্পষ্টভাবে XLA অন্তর্ভুক্ত করতে হবে না।

উদাহরণ: TPU তে চালানোর জন্য, আপনার Tensorflow প্রোগ্রাম দ্বারা সংজ্ঞায়িত গণনা গ্রাফটি প্রথমে একটি XLA (accelerated Linear Algebra compiler) উপস্থাপনায় অনুবাদ করা হয়, তারপর XLA দ্বারা TPU মেশিন কোডে কম্পাইল করা হয়।
কেরাসে টিপিইউ ব্যবহার
Tensorflow 2.1 থেকে Keras API এর মাধ্যমে TPU গুলি সমর্থিত। Keras সাপোর্ট TPU এবং TPU পডগুলিতে কাজ করে। এখানে একটি উদাহরণ দেওয়া হল যা TPU, GPU(গুলি) এবং CPU-তে কাজ করে:
try: # detect TPUs
tpu = tf.distribute.cluster_resolver.TPUClusterResolver.connect()
strategy = tf.distribute.TPUStrategy(tpu)
except ValueError: # detect GPUs
strategy = tf.distribute.MirroredStrategy() # for CPU/GPU or multi-GPU machines
# use TPUStrategy scope to define model
with strategy.scope():
model = tf.keras.Sequential( ... )
model.compile( ... )
# train model normally on a tf.data.Dataset
model.fit(training_dataset, epochs=EPOCHS, steps_per_epoch=...)
এই কোড স্নিপেটে:
-
TPUClusterResolver().connect()নেটওয়ার্কে TPU খুঁজে বের করে। এটি বেশিরভাগ Google ক্লাউড সিস্টেমে (AI Platform jobs, Colaboratory, Kubeflow, 'ctpu up' ইউটিলিটির মাধ্যমে তৈরি Deep Learning VM) প্যারামিটার ছাড়াই কাজ করে। এই সিস্টেমগুলি TPU_NAME এনভায়রনমেন্ট ভেরিয়েবলের জন্য তাদের TPU কোথায় তা জানে। আপনি যদি হাতে একটি TPU তৈরি করেন, তাহলে হয় আপনি যে VM থেকে এটি ব্যবহার করছেন তাতে TPU_NAME env. var. সেট করুন, অথবা স্পষ্ট প্যারামিটার সহTPUClusterResolverকল করুন:TPUClusterResolver(tp_uname, zone, project) -
TPUStrategyহল সেই অংশ যা বিতরণ এবং "অল-রিডুস" গ্রেডিয়েন্ট সিঙ্ক্রোনাইজেশন অ্যালগরিদম বাস্তবায়ন করে। - কৌশলটি একটি স্কোপের মাধ্যমে প্রয়োগ করা হয়। মডেলটি অবশ্যই স্ট্র্যাটেজি স্কোপের মধ্যে সংজ্ঞায়িত করা উচিত()।
-
tpu_model.fitফাংশনটি TPU প্রশিক্ষণের জন্য ইনপুটের জন্য একটি tf.data.Dataset অবজেক্ট আশা করে।
সাধারণ TPU পোর্টিং কাজগুলি
- টেনসরফ্লো মডেলে ডেটা লোড করার অনেক উপায় থাকলেও, TPU-এর জন্য
tf.data.DatasetAPI ব্যবহার করা প্রয়োজন। - TPU গুলি খুব দ্রুত কাজ করে এবং এগুলি চালানোর সময় ডেটা গ্রহণ করা প্রায়শই বাধা হয়ে দাঁড়ায়। TPU পারফরম্যান্স গাইডে ডেটা বাধা এবং অন্যান্য পারফরম্যান্স টিপস সনাক্ত করার জন্য আপনি কিছু সরঞ্জাম ব্যবহার করতে পারেন।
- int8 বা int16 সংখ্যাগুলিকে int32 হিসাবে বিবেচনা করা হয়। TPU তে 32 বিটের কম সংখ্যক পূর্ণসংখ্যার হার্ডওয়্যার নেই।
- কিছু টেনসরফ্লো অপারেশন সমর্থিত নয়। তালিকাটি এখানে । সুখবর হল যে এই সীমাবদ্ধতা শুধুমাত্র প্রশিক্ষণ কোডের ক্ষেত্রে প্রযোজ্য, অর্থাৎ আপনার মডেলের মধ্য দিয়ে ফরোয়ার্ড এবং ব্যাকওয়ার্ড পাস। আপনি এখনও আপনার ডেটা ইনপুট পাইপলাইনে সমস্ত টেনসরফ্লো অপারেশন ব্যবহার করতে পারেন কারণ এটি CPU-তে কার্যকর করা হবে।
-
tf.py_funcTPU তে সমর্থিত নয়।
৪. [তথ্য] নিউরাল নেটওয়ার্ক ক্লাসিফায়ার ১০১
সংক্ষেপে
যদি পরবর্তী অনুচ্ছেদে মোটা অক্ষরে লেখা সমস্ত শব্দ আপনার জানা থাকে, তাহলে আপনি পরবর্তী অনুশীলনে যেতে পারেন। যদি আপনি সবেমাত্র গভীর শিক্ষা শুরু করেন তবে স্বাগতম, এবং দয়া করে পড়তে থাকুন।
স্তরের ক্রম হিসাবে নির্মিত মডেলগুলির জন্য Keras Sequential API অফার করে। উদাহরণস্বরূপ, তিনটি ঘন স্তর ব্যবহার করে একটি চিত্র শ্রেণিবদ্ধকারী Keras এ এভাবে লেখা যেতে পারে:
model = tf.keras.Sequential([
tf.keras.layers.Flatten(input_shape=[192, 192, 3]),
tf.keras.layers.Dense(500, activation="relu"),
tf.keras.layers.Dense(50, activation="relu"),
tf.keras.layers.Dense(5, activation='softmax') # classifying into 5 classes
])
# this configures the training of the model. Keras calls it "compiling" the model.
model.compile(
optimizer='adam',
loss= 'categorical_crossentropy',
metrics=['accuracy']) # % of correct answers
# train the model
model.fit(dataset, ... )

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

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

সবচেয়ে জনপ্রিয় অ্যাক্টিভেশন ফাংশন হল RELU for Rectified Linear Unit। এটি একটি খুব সহজ ফাংশন যা আপনি উপরের গ্রাফে দেখতে পাচ্ছেন।
সফটম্যাক্স অ্যাক্টিভেশন
উপরের নেটওয়ার্কটি ৫-নিউরন স্তর দিয়ে শেষ হয় কারণ আমরা ফুলগুলিকে ৫টি বিভাগে শ্রেণীবদ্ধ করছি (গোলাপ, টিউলিপ, ড্যান্ডেলিয়ন, ডেইজি, সূর্যমুখী)। মধ্যবর্তী স্তরের নিউরনগুলি ক্লাসিক RELU অ্যাক্টিভেশন ফাংশন ব্যবহার করে সক্রিয় করা হয়। যদিও শেষ স্তরে, আমরা ০ এবং ১ এর মধ্যে সংখ্যা গণনা করতে চাই যা এই ফুলটি গোলাপ, টিউলিপ ইত্যাদি হওয়ার সম্ভাবনা প্রতিনিধিত্ব করে। এর জন্য, আমরা "সফটম্যাক্স" নামক একটি অ্যাক্টিভেশন ফাংশন ব্যবহার করব।
একটি ভেক্টরের উপর সফটম্যাক্স প্রয়োগ করা হয় প্রতিটি উপাদানের সূচক গ্রহণ করে এবং তারপর ভেক্টরকে স্বাভাবিক করে, সাধারণত L1 আদর্শ (পরম মানের যোগফল) ব্যবহার করে যাতে মানগুলি 1 পর্যন্ত যোগ হয় এবং সম্ভাব্যতা হিসাবে ব্যাখ্যা করা যায়।


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

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

মিনি-ব্যাচিং এবং মোমেন্টাম
আপনি শুধুমাত্র একটি উদাহরণ ছবিতে আপনার গ্রেডিয়েন্ট গণনা করতে পারেন এবং ওজন এবং পক্ষপাতগুলি তাৎক্ষণিকভাবে আপডেট করতে পারেন, কিন্তু উদাহরণস্বরূপ, 128টি ছবির একটি ব্যাচে এটি করলে একটি গ্রেডিয়েন্ট পাওয়া যায় যা বিভিন্ন উদাহরণ চিত্র দ্বারা আরোপিত সীমাবদ্ধতাগুলিকে আরও ভালভাবে উপস্থাপন করে এবং তাই সমাধানের দিকে দ্রুত একত্রিত হওয়ার সম্ভাবনা থাকে। মিনি-ব্যাচের আকার একটি সামঞ্জস্যযোগ্য প্যারামিটার।
এই কৌশল, যাকে কখনও কখনও "স্টোকাস্টিক গ্রেডিয়েন্ট ডিসেন্ট" বলা হয়, এর আরেকটি, আরও বাস্তবসম্মত সুবিধা রয়েছে: ব্যাচগুলির সাথে কাজ করার অর্থ বৃহত্তর ম্যাট্রিক্সগুলির সাথে কাজ করা এবং এগুলি সাধারণত GPU এবং TPU গুলিতে অপ্টিমাইজ করা সহজ।
যদিও অভিসৃতিটি এখনও কিছুটা বিশৃঙ্খল হতে পারে এবং এমনকি যদি গ্রেডিয়েন্ট ভেক্টরগুলি সমস্ত শূন্য হয় তবে এটি বন্ধও হতে পারে। এর অর্থ কি আমরা একটি সর্বনিম্ন খুঁজে পেয়েছি? সর্বদা নয়। একটি গ্রেডিয়েন্ট উপাদান সর্বনিম্ন বা সর্বোচ্চ উভয়ই হতে পারে। লক্ষ লক্ষ উপাদান সহ একটি গ্রেডিয়েন্ট ভেক্টরের ক্ষেত্রে, যদি তারা সমস্ত শূন্য হয়, তবে প্রতিটি শূন্য একটি সর্বনিম্নের সাথে মিলে যাওয়ার এবং তাদের কোনওটিই সর্বোচ্চ বিন্দুর সাথে না মিলার সম্ভাবনা খুবই কম। বহু মাত্রার স্থানে, স্যাডল পয়েন্টগুলি বেশ সাধারণ এবং আমরা তাদের উপর থামতে চাই না।

চিত্র: একটি স্যাডল পয়েন্ট। গ্রেডিয়েন্ট 0 কিন্তু সব দিকে এটি সর্বনিম্ন নয়। (ছবি অ্যাট্রিবিউশন উইকিমিডিয়া: নিকোগুয়ারো - নিজস্ব কাজ, CC BY 3.0 )
সমাধান হল অপ্টিমাইজেশন অ্যালগরিদমে কিছু গতি যোগ করা যাতে এটি থেমে না গিয়ে স্যাডল পয়েন্ট অতিক্রম করতে পারে।
শব্দকোষ
ব্যাচ বা মিনি-ব্যাচ : প্রশিক্ষণ সর্বদা প্রশিক্ষণ ডেটা এবং লেবেলের ব্যাচগুলিতে সঞ্চালিত হয়। এটি করলে অ্যালগরিদম একত্রিত হতে সাহায্য করে। "ব্যাচ" মাত্রা সাধারণত ডেটা টেনসরের প্রথম মাত্রা। উদাহরণস্বরূপ, আকৃতির একটি টেনসর [100, 192, 192, 3] তে 192x192 পিক্সেলের 100টি ছবি থাকে যার প্রতি পিক্সেল (RGB) তিনটি মান থাকে।
ক্রস-এনট্রপি লস : একটি বিশেষ লস ফাংশন যা প্রায়শই শ্রেণিবদ্ধকরণে ব্যবহৃত হয়।
ঘন স্তর : নিউরনের একটি স্তর যেখানে প্রতিটি নিউরন পূর্ববর্তী স্তরের সমস্ত নিউরনের সাথে সংযুক্ত থাকে।
বৈশিষ্ট্য : একটি নিউরাল নেটওয়ার্কের ইনপুটগুলিকে কখনও কখনও "বৈশিষ্ট্য" বলা হয়। একটি ডেটাসেটের কোন অংশগুলি (অথবা অংশগুলির সংমিশ্রণ) একটি নিউরাল নেটওয়ার্কে ফিড করা উচিত তা নির্ধারণ করার শিল্পকে "বৈশিষ্ট্য প্রকৌশল" বলা হয়।
লেবেল : "ক্লাস" বা তত্ত্বাবধানে থাকা শ্রেণীবিভাগ সমস্যার সঠিক উত্তরের আরেকটি নাম
শেখার হার : প্রশিক্ষণ লুপের প্রতিটি পুনরাবৃত্তিতে ওজন এবং পক্ষপাত আপডেট করা গ্রেডিয়েন্টের ভগ্নাংশ।
লগিট : অ্যাক্টিভেশন ফাংশন প্রয়োগের আগে নিউরনের একটি স্তরের আউটপুটগুলিকে "লগিট" বলা হয়। এই শব্দটি "লজিস্টিক ফাংশন" অর্থাৎ "সিগময়েড ফাংশন" থেকে এসেছে যা আগে সবচেয়ে জনপ্রিয় অ্যাক্টিভেশন ফাংশন ছিল। "লজিস্টিক ফাংশনের আগে নিউরন আউটপুট" কে সংক্ষিপ্ত করে "লগিট" করা হয়েছিল।
ক্ষতি : সঠিক উত্তরের সাথে নিউরাল নেটওয়ার্ক আউটপুট তুলনা করার ত্রুটি ফাংশন
নিউরন : এর ইনপুটগুলির ওজনযুক্ত যোগফল গণনা করে, একটি পক্ষপাত যোগ করে এবং একটি অ্যাক্টিভেশন ফাংশনের মাধ্যমে ফলাফল ফিড করে।
এক-গরম এনকোডিং : ৫ এর মধ্যে ৩য় শ্রেণী ৫টি উপাদানের ভেক্টর হিসেবে এনকোড করা হয়েছে, ৩য়টি ছাড়া বাকি সকল শূন্য, যা ১।
relu : সংশোধিত রৈখিক একক। নিউরনের জন্য একটি জনপ্রিয় সক্রিয়করণ ফাংশন।
সিগময়েড : আরেকটি অ্যাক্টিভেশন ফাংশন যা আগে জনপ্রিয় ছিল এবং এখনও বিশেষ ক্ষেত্রে কার্যকর।
সফটম্যাক্স : একটি বিশেষ অ্যাক্টিভেশন ফাংশন যা একটি ভেক্টরের উপর কাজ করে, বৃহত্তম উপাদান এবং অন্যান্য সকল উপাদানের মধ্যে পার্থক্য বৃদ্ধি করে এবং ভেক্টরকে 1 এর যোগফলে স্বাভাবিক করে তোলে যাতে এটি সম্ভাব্যতার ভেক্টর হিসাবে ব্যাখ্যা করা যায়। শ্রেণিবদ্ধকরণের শেষ ধাপ হিসেবে ব্যবহৃত হয়।
টেনসর : একটি "টেনসর" একটি ম্যাট্রিক্সের মতো কিন্তু এর মাত্রার একটি নির্দিষ্ট সংখ্যক থাকে। একটি 1-মাত্রিক টেনসর হল একটি ভেক্টর। একটি 2-মাত্রিক টেনসর হল একটি ম্যাট্রিক্স। এবং তারপরে আপনার 3, 4, 5 বা তার বেশি মাত্রার টেনসর থাকতে পারে।
৫. [তথ্য] কনভোলিউশনাল নিউরাল নেটওয়ার্ক
সংক্ষেপে
যদি পরবর্তী অনুচ্ছেদে মোটা অক্ষরে লেখা সমস্ত শব্দ আপনার জানা থাকে, তাহলে আপনি পরবর্তী অনুশীলনে যেতে পারেন। যদি আপনি কেবল কনভ্যুলেশনাল নিউরাল নেটওয়ার্ক নিয়ে শুরু করেন, তাহলে দয়া করে আরও পড়ুন।

উদাহরণ: 4x4x3=48 টি শেখার যোগ্য ওজন দিয়ে তৈরি দুটি ধারাবাহিক ফিল্টার ব্যবহার করে একটি ছবি ফিল্টার করা।
কেরাসে একটি সাধারণ কনভ্যুলেশনাল নিউরাল নেটওয়ার্ক এইভাবে দেখায়:
model = tf.keras.Sequential([
# input: images of size 192x192x3 pixels (the three stands for RGB channels)
tf.keras.layers.Conv2D(kernel_size=3, filters=24, padding='same', activation='relu', input_shape=[192, 192, 3]),
tf.keras.layers.Conv2D(kernel_size=3, filters=24, padding='same', activation='relu'),
tf.keras.layers.MaxPooling2D(pool_size=2),
tf.keras.layers.Conv2D(kernel_size=3, filters=12, padding='same', activation='relu'),
tf.keras.layers.MaxPooling2D(pool_size=2),
tf.keras.layers.Conv2D(kernel_size=3, filters=6, padding='same', activation='relu'),
tf.keras.layers.Flatten(),
# classifying into 5 categories
tf.keras.layers.Dense(5, activation='softmax')
])
model.compile(
optimizer='adam',
loss= 'categorical_crossentropy',
metrics=['accuracy'])

কনভোলিউশনাল নিউরাল নেট ১০১
একটি কনভোলিউশনাল নেটওয়ার্কের একটি স্তরে, একটি "নিউরন" ছবির ঠিক উপরে পিক্সেলের একটি ওজনযুক্ত যোগফল করে, শুধুমাত্র ছবির একটি ছোট অংশ জুড়ে। এটি একটি পক্ষপাত যোগ করে এবং একটি অ্যাক্টিভেশন ফাংশনের মাধ্যমে যোগফল ফিড করে, ঠিক যেমন একটি নিয়মিত ঘন স্তরের একটি নিউরন করে। এই অপারেশনটি একই ওজন ব্যবহার করে পুরো ছবিতে পুনরাবৃত্তি করা হয়। মনে রাখবেন যে ঘন স্তরগুলিতে, প্রতিটি নিউরনের নিজস্ব ওজন ছিল। এখানে, ওজনের একটি একক "প্যাচ" উভয় দিকে চিত্র জুড়ে স্লাইড করে (একটি "কনভোলিউশন")। আউটপুটে চিত্রে যত পিক্সেল আছে ততগুলি মান রয়েছে (যদিও প্রান্তে কিছু প্যাডিং প্রয়োজন)। এটি একটি ফিল্টারিং অপারেশন, 4x4x3=48 ওজনের ফিল্টার ব্যবহার করে।
তবে, ৪৮টি ওজন যথেষ্ট হবে না। স্বাধীনতার আরও ডিগ্রি যোগ করার জন্য, আমরা ওজনের একটি নতুন সেট দিয়ে একই ক্রিয়াটি পুনরাবৃত্তি করি। এটি ফিল্টার আউটপুটের একটি নতুন সেট তৈরি করে। ইনপুট ছবিতে R, G, B চ্যানেলের সাথে সাদৃশ্য রেখে এটিকে আউটপুটের একটি "চ্যানেল" বলা যাক।

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

উদাহরণ: একটি কনভ্যুলেশনাল নিউরাল নেটওয়ার্ক "কিউব" ডেটাকে অন্যান্য "কিউব" ডেটাতে রূপান্তরিত করে।
স্ট্রাইডেড কনভোলিউশন, সর্বাধিক পুলিং
২ বা ৩ ধাপে কনভলিউশন সম্পাদন করে, আমরা ফলস্বরূপ ডেটা কিউবটিকে তার অনুভূমিক মাত্রায় সঙ্কুচিত করতে পারি। এটি করার দুটি সাধারণ উপায় রয়েছে:
- স্ট্রাইডেড কনভোলিউশন: উপরের মত একটি স্লাইডিং ফিল্টার কিন্তু একটি স্ট্রাইড >1 সহ
- সর্বোচ্চ পুলিং: একটি স্লাইডিং উইন্ডো যা সর্বোচ্চ অপারেশন প্রয়োগ করে (সাধারণত 2x2 প্যাচে, প্রতি 2 পিক্সেল পুনরাবৃত্তি করা হয়)

উদাহরণ: কম্পিউটিং উইন্ডো ৩ পিক্সেল স্লাইড করলে আউটপুট মান কম হয়। স্ট্রাইডেড কনভলিউশন বা সর্বোচ্চ পুলিং (২x২ উইন্ডোতে সর্বোচ্চ ২ ধাপ স্লাইড করলে) হল অনুভূমিক মাত্রায় ডেটা কিউব সঙ্কুচিত করার একটি উপায়।
সি অনভোলিউশনাল ক্লাসিফায়ার
অবশেষে, আমরা শেষ ডেটা কিউবটিকে সমতল করে একটি ঘন, সফটম্যাক্স-সক্রিয় স্তরের মধ্য দিয়ে এটি সরবরাহ করে একটি শ্রেণিবিন্যাসের মাথা সংযুক্ত করি। একটি সাধারণ কনভোলিউশনাল শ্রেণিবিন্যাসকারী দেখতে এরকম হতে পারে:

উদাহরণ: কনভোলিউশনাল এবং সফটম্যাক্স স্তর ব্যবহার করে একটি চিত্র শ্রেণিবদ্ধকারী। এটি 3x3 এবং 1x1 ফিল্টার ব্যবহার করে। ম্যাক্সপুল স্তরগুলি 2x2 ডেটা পয়েন্টের সর্বাধিক গ্রুপ গ্রহণ করে। শ্রেণিবিন্যাসের শীর্ষটি সফটম্যাক্স সক্রিয়করণ সহ একটি ঘন স্তর দিয়ে বাস্তবায়িত হয়।
কেরাসে
উপরে চিত্রিত কনভোলিউশনাল স্ট্যাকটি কেরাসে এভাবে লেখা যেতে পারে:
model = tf.keras.Sequential([
# input: images of size 192x192x3 pixels (the three stands for RGB channels)
tf.keras.layers.Conv2D(kernel_size=3, filters=32, padding='same', activation='relu', input_shape=[192, 192, 3]),
tf.keras.layers.Conv2D(kernel_size=1, filters=32, padding='same', activation='relu'),
tf.keras.layers.MaxPooling2D(pool_size=2),
tf.keras.layers.Conv2D(kernel_size=3, filters=32, padding='same', activation='relu'),
tf.keras.layers.Conv2D(kernel_size=1, filters=32, padding='same', activation='relu'),
tf.keras.layers.MaxPooling2D(pool_size=2),
tf.keras.layers.Conv2D(kernel_size=3, filters=32, padding='same', activation='relu'),
tf.keras.layers.Conv2D(kernel_size=1, filters=32, padding='same', activation='relu'),
tf.keras.layers.MaxPooling2D(pool_size=2),
tf.keras.layers.Conv2D(kernel_size=3, filters=32, padding='same', activation='relu'),
tf.keras.layers.Conv2D(kernel_size=1, filters=32, padding='same', activation='relu'),
tf.keras.layers.MaxPooling2D(pool_size=2),
tf.keras.layers.Conv2D(kernel_size=3, filters=16, padding='same', activation='relu'),
tf.keras.layers.Conv2D(kernel_size=1, filters=8, padding='same', activation='relu'),
tf.keras.layers.Flatten(),
# classifying into 5 categories
tf.keras.layers.Dense(5, activation='softmax')
])
model.compile(
optimizer='adam',
loss= 'categorical_crossentropy',
metrics=['accuracy'])
৬. [নতুন তথ্য] আধুনিক কনভোলিউশনাল স্থাপত্য
সংক্ষেপে

উদাহরণ: একটি কনভ্যুলেশনাল "মডিউল"। এই মুহুর্তে সবচেয়ে ভালো কোনটি? একটি ম্যাক্স-পুল স্তরের পরে একটি 1x1 কনভ্যুলেশনাল স্তর, নাকি স্তরগুলির একটি ভিন্ন সংমিশ্রণ? সবগুলো চেষ্টা করে দেখুন, ফলাফলগুলিকে একত্রিত করুন এবং নেটওয়ার্ককে সিদ্ধান্ত নিতে দিন। ডানদিকে: এই ধরনের মডিউল ব্যবহার করে " ইনসেপশন " কনভ্যুলেশনাল আর্কিটেকচার।
কেরাসে, এমন মডেল তৈরি করতে যেখানে ডেটা প্রবাহ শাখা-প্রশাখায় প্রবেশ করতে পারে এবং বেরিয়ে যেতে পারে, আপনাকে "কার্যকরী" মডেল স্টাইল ব্যবহার করতে হবে। এখানে একটি উদাহরণ দেওয়া হল:
l = tf.keras.layers # syntax shortcut
y = l.Conv2D(filters=32, kernel_size=3, padding='same',
activation='relu', input_shape=[192, 192, 3])(x) # x=input image
# module start: branch out
y1 = l.Conv2D(filters=32, kernel_size=1, padding='same', activation='relu')(y)
y3 = l.Conv2D(filters=32, kernel_size=3, padding='same', activation='relu')(y)
y = l.concatenate([y1, y3]) # output now has 64 channels
# module end: concatenation
# many more layers ...
# Create the model by specifying the input and output tensors.
# Keras layers track their connections automatically so that's all that's needed.
z = l.Dense(5, activation='softmax')(y)
model = tf.keras.Model(x, z)

অন্যান্য সস্তা কৌশল
ছোট 3x3 ফিল্টার

এই চিত্রটিতে, আপনি দুটি পরপর 3x3 ফিল্টারের ফলাফল দেখতে পাচ্ছেন। ফলাফলে কোন ডেটা পয়েন্ট অবদান রেখেছে তা খুঁজে বের করার চেষ্টা করুন: এই দুটি পরপর 3x3 ফিল্টার একটি 5x5 অঞ্চলের কিছু সংমিশ্রণ গণনা করে। এটি ঠিক একই সংমিশ্রণ নয় যা একটি 5x5 ফিল্টার গণনা করবে তবে এটি চেষ্টা করার মতো কারণ দুটি পরপর 3x3 ফিল্টার একটি একক 5x5 ফিল্টারের চেয়ে সস্তা।
১x১ কনভোলিউশন?

গাণিতিক পরিভাষায়, "1x1" কনভোলিউশন হল একটি ধ্রুবক দ্বারা গুণন, খুব একটা কার্যকর ধারণা নয়। কনভোলিউশনাল নিউরাল নেটওয়ার্কে, মনে রাখবেন যে ফিল্টারটি কেবল একটি 2D চিত্র নয়, একটি ডেটা কিউবে প্রয়োগ করা হয়। অতএব, একটি "1x1" ফিল্টার 1x1 কলামের ডেটার একটি ওজনযুক্ত যোগফল গণনা করে (চিত্র দেখুন) এবং আপনি যখন এটি ডেটা জুড়ে স্লাইড করেন, তখন আপনি ইনপুটের চ্যানেলগুলির একটি রৈখিক সংমিশ্রণ পাবেন। এটি আসলে কার্যকর। আপনি যদি চ্যানেলগুলিকে পৃথক ফিল্টারিং ক্রিয়াকলাপের ফলাফল হিসাবে মনে করেন, উদাহরণস্বরূপ "পয়েন্ট কানের জন্য একটি ফিল্টার", "হুইস্কার" এর জন্য আরেকটি ফিল্টার এবং "স্লিট আই" এর জন্য তৃতীয়টি, তাহলে একটি "1x1" কনভোলিউশনাল স্তর এই বৈশিষ্ট্যগুলির একাধিক সম্ভাব্য রৈখিক সংমিশ্রণ গণনা করবে, যা "বিড়াল" খুঁজতে কার্যকর হতে পারে। তার উপরে, 1x1 স্তরগুলি কম ওজন ব্যবহার করে।
৭. স্কুইজনেট
"Squeezenet" পত্রিকায় এই ধারণাগুলিকে একত্রিত করার একটি সহজ উপায় দেখানো হয়েছে। লেখকরা শুধুমাত্র 1x1 এবং 3x3 কনভলিউশনাল স্তর ব্যবহার করে একটি খুব সহজ কনভলিউশনাল মডিউল ডিজাইনের পরামর্শ দিয়েছেন।

উদাহরণ: "ফায়ার মডিউল" এর উপর ভিত্তি করে স্কুইজনেট আর্কিটেকচার। তারা একটি 1x1 স্তরকে বিকল্প করে যা উল্লম্ব মাত্রায় আগত ডেটাকে "সঙ্কুচিত" করে, তারপরে দুটি সমান্তরাল 1x1 এবং 3x3 কনভোলিউশনাল স্তর তৈরি করে যা ডেটার গভীরতা আবার "প্রসারিত" করে।
হাতে-কলমে
তোমার আগের নোটবুকে কাজ চালিয়ে যাও এবং স্কুইজনেট-অনুপ্রাণিত কনভোলিউশনাল নিউরাল নেটওয়ার্ক তৈরি করো। তোমাকে মডেল কোডটি কেরাস "কার্যকরী স্টাইল"-এ পরিবর্তন করতে হবে।
Keras_Flowers_TPU (playground).ipynb
অতিরিক্ত তথ্য
এই অনুশীলনীতে স্কুইজনেট মডিউলের জন্য একটি সহায়ক ফাংশন সংজ্ঞায়িত করা কার্যকর হবে:
def fire(x, squeeze, expand):
y = l.Conv2D(filters=squeeze, kernel_size=1, padding='same', activation='relu')(x)
y1 = l.Conv2D(filters=expand//2, kernel_size=1, padding='same', activation='relu')(y)
y3 = l.Conv2D(filters=expand//2, kernel_size=3, padding='same', activation='relu')(y)
return tf.keras.layers.concatenate([y1, y3])
# this is to make it behave similarly to other Keras layers
def fire_module(squeeze, expand):
return lambda x: fire(x, squeeze, expand)
# usage:
x = l.Input(shape=[192, 192, 3])
y = fire_module(squeeze=24, expand=48)(x) # typically, squeeze is less than expand
y = fire_module(squeeze=32, expand=64)(y)
...
model = tf.keras.Model(x, y)
এবারের লক্ষ্য হল ৮০% নির্ভুলতা অর্জন করা।
চেষ্টা করার মতো জিনিস
একটি একক কনভোলিউশনাল লেয়ার দিয়ে শুরু করুন, তারপর " fire_modules " দিয়ে অনুসরণ করুন, MaxPooling2D(pool_size=2) লেয়ার দিয়ে পর্যায়ক্রমে। আপনি নেটওয়ার্কে সর্বোচ্চ 2 থেকে 4টি পুলিং লেয়ার এবং সর্বোচ্চ পুলিং লেয়ারগুলির মধ্যে 1, 2 বা 3টি টানা ফায়ার মডিউল দিয়ে পরীক্ষা করতে পারেন।
ফায়ার মডিউলগুলিতে, "স্কুইজ" প্যারামিটারটি সাধারণত "এক্সপ্যান্ড" প্যারামিটারের চেয়ে ছোট হওয়া উচিত। এই প্যারামিটারগুলি আসলে ফিল্টারের সংখ্যা। এগুলি সাধারণত 8 থেকে 196 পর্যন্ত হতে পারে। আপনি এমন আর্কিটেকচারের সাথে পরীক্ষা করতে পারেন যেখানে নেটওয়ার্কের মাধ্যমে ফিল্টারের সংখ্যা ধীরে ধীরে বৃদ্ধি পায়, অথবা এমন সোজা আর্কিটেকচার যেখানে সমস্ত ফায়ার মডিউলে একই সংখ্যক ফিল্টার থাকে।
এখানে একটি উদাহরণ:
x = tf.keras.layers.Input(shape=[*IMAGE_SIZE, 3]) # input is 192x192 pixels RGB
y = tf.keras.layers.Conv2D(kernel_size=3, filters=32, padding='same', activation='relu')(x)
y = fire_module(24, 48)(y)
y = tf.keras.layers.MaxPooling2D(pool_size=2)(y)
y = fire_module(24, 48)(y)
y = tf.keras.layers.MaxPooling2D(pool_size=2)(y)
y = fire_module(24, 48)(y)
y = tf.keras.layers.GlobalAveragePooling2D()(y)
y = tf.keras.layers.Dense(5, activation='softmax')(y)
model = tf.keras.Model(x, y)
এই মুহুর্তে, আপনি হয়তো লক্ষ্য করবেন যে আপনার পরীক্ষাগুলি খুব একটা ভালোভাবে এগোচ্ছে না এবং ৮০% নির্ভুলতার লক্ষ্য দূরবর্তী বলে মনে হচ্ছে। আরও কিছু সস্তা কৌশলের জন্য সময় এসেছে।
ব্যাচ নরমালাইজেশন
ব্যাচ নর্ম আপনার অভিসৃতি সমস্যাগুলির সমাধানে সাহায্য করবে। পরবর্তী কর্মশালায় এই কৌশল সম্পর্কে বিস্তারিত ব্যাখ্যা থাকবে, আপাতত, আপনার নেটওয়ার্কের প্রতিটি কনভোলিউশনাল স্তরের পরে , আপনার fire_module ফাংশনের ভিতরের স্তরগুলি সহ, এই লাইনটি যোগ করে এটিকে একটি ব্ল্যাক বক্স "ম্যাজিক" সহায়ক হিসাবে ব্যবহার করুন:
y = tf.keras.layers.BatchNormalization(momentum=0.9)(y)
# please adapt the input and output "y"s to whatever is appropriate in your context
আমাদের ডেটাসেট ছোট হওয়ায় মোমেন্টাম প্যারামিটারটি তার ডিফল্ট মান ০.৯৯ থেকে ০.৯ এ কমাতে হবে। আপাতত এই বিশদটি মনে রাখবেন না।
তথ্য বৃদ্ধি
স্যাচুরেশন পরিবর্তনের বাম-ডান ফ্লিপের মতো সহজ রূপান্তরের মাধ্যমে ডেটা বৃদ্ধি করে আপনি আরও কয়েক শতাংশ পয়েন্ট পাবেন:


Tensorflow-এ tf.data.Dataset API ব্যবহার করে এটি করা খুবই সহজ। আপনার ডেটার জন্য একটি নতুন রূপান্তর ফাংশন সংজ্ঞায়িত করুন:
def data_augment(image, label):
image = tf.image.random_flip_left_right(image)
image = tf.image.random_saturation(image, lower=0, upper=2)
return image, label
তারপর এটি আপনার চূড়ান্ত ডেটা রূপান্তরে ব্যবহার করুন (সেল "প্রশিক্ষণ এবং বৈধতা ডেটাসেট", ফাংশন "get_batched_dataset"):
dataset = dataset.repeat() # existing line
# insert this
if augment_data:
dataset = dataset.map(data_augment, num_parallel_calls=AUTO)
dataset = dataset.shuffle(2048) # existing line
ডেটা বর্ধন ঐচ্ছিক করতে ভুলবেন না এবং শুধুমাত্র প্রশিক্ষণ ডেটাসেট বর্ধিত করার জন্য প্রয়োজনীয় কোড যোগ করতে ভুলবেন না। বৈধতা ডেটাসেট বর্ধিত করার কোনও মানে হয় না।
৩৫টি যুগে ৮০% নির্ভুলতা এখন নাগালের মধ্যে থাকা উচিত।
সমাধান
এখানে সমাধান নোটবুক। যদি আপনি আটকে যান তবে আপনি এটি ব্যবহার করতে পারেন।
Keras_Flowers_TPU_squeezenet.ipynb
আমরা যা কভার করেছি
- 🤔 কেরাস "কার্যকরী স্টাইল" মডেল
- 🤓 স্কুইজনেট আর্কিটেকচার
- 🤓 tf.data.datset এর মাধ্যমে ডেটা বৃদ্ধি
অনুগ্রহ করে একটু সময় নিয়ে এই চেকলিস্টটি আপনার মাথায় ঢোকান।
৮. এক্সসেপশন সূক্ষ্মভাবে সুরক্ষিত
পৃথকযোগ্য কনভোলিউশন
কনভোলিউশনাল লেয়ার বাস্তবায়নের একটি ভিন্ন পদ্ধতি সম্প্রতি জনপ্রিয়তা পাচ্ছে: ডেপথ-সেপারেবল কনভোলিউশন। আমি জানি, এটি একটি মুখরোচক কথা, কিন্তু ধারণাটি বেশ সহজ। এগুলি টেনসরফ্লো এবং কেরাসে tf.keras.layers.SeparableConv2D হিসাবে প্রয়োগ করা হয়।
একটি পৃথকীকরণযোগ্য কনভোলিউশন ছবিতে একটি ফিল্টারও চালায় কিন্তু এটি ইনপুট ইমেজের প্রতিটি চ্যানেলের জন্য একটি স্বতন্ত্র ওজন সেট ব্যবহার করে। এটি একটি "1x1 কনভোলিউশন" দিয়ে অনুসরণ করে, যা ডট পণ্যের একটি সিরিজ যার ফলে ফিল্টার করা চ্যানেলগুলির একটি ওজনযুক্ত যোগফল তৈরি হয়। প্রতিবার নতুন ওজনের সাথে, চ্যানেলগুলির যতগুলি ওজনযুক্ত পুনর্মিলন প্রয়োজন ততগুলি গণনা করা হয়।

উদাহরণ: বিভাজ্য কনভলিউশন। প্রথম ধাপ: প্রতিটি চ্যানেলের জন্য পৃথক ফিল্টার সহ কনভলিউশন। দ্বিতীয় ধাপ: চ্যানেলগুলির রৈখিক পুনর্মিলন। পছন্দসই সংখ্যক আউটপুট চ্যানেল না পৌঁছানো পর্যন্ত ওজনের একটি নতুন সেট দিয়ে পুনরাবৃত্তি করা হয়। প্রথম ধাপটিও পুনরাবৃত্তি করা যেতে পারে, প্রতিবার নতুন ওজন সহ কিন্তু বাস্তবে এটি খুব কমই ঘটে।
সাম্প্রতিকতম কনভলিউশনাল নেটওয়ার্ক আর্কিটেকচারগুলিতে বিভাজ্য কনভলিউশন ব্যবহার করা হয়: MobileNetV2, Xception, EfficientNet। যাইহোক, MobileNetV2 হল সেই পদ্ধতি যা আপনি আগে ট্রান্সফার লার্নিংয়ের জন্য ব্যবহার করেছিলেন।
এগুলি নিয়মিত কনভোলিউশনের তুলনায় সস্তা এবং বাস্তবে সমানভাবে কার্যকর বলে প্রমাণিত হয়েছে। উপরে দেখানো উদাহরণের ওজন গণনা এখানে দেওয়া হল:
কনভোলিউশনাল স্তর: ৪ x ৪ x ৩ x ৫ = ২৪০
পৃথকযোগ্য কনভোলিউশনাল স্তর: ৪ x ৪ x ৩ + ৩ x ৫ = ৪৮ + ১৫ = ৬৩
প্রতিটি ধরণের কনভলিউশনাল লেয়ার স্কেল একইভাবে প্রয়োগ করার জন্য কত গুণের প্রয়োজন তা পাঠকের জন্য গণনা করার একটি অনুশীলন হিসাবে এটি রেখে দেওয়া হয়েছে। বিভাজ্য কনভলিউশনগুলি ছোট এবং গণনার দিক থেকে অনেক বেশি কার্যকর।
হাতে-কলমে
"ট্রান্সফার লার্নিং" প্লেগ্রাউন্ড নোটবুক থেকে পুনরায় চালু করুন কিন্তু এবার প্রাক-প্রশিক্ষিত মডেল হিসেবে Xception নির্বাচন করুন। Xception শুধুমাত্র বিভাজ্য কনভলিউশন ব্যবহার করে। সমস্ত ওজন প্রশিক্ষিত রেখে দিন। আমরা প্রাক-প্রশিক্ষিত স্তরগুলি ব্যবহার না করে আমাদের ডেটাতে প্রাক-প্রশিক্ষিত ওজনগুলিকে সূক্ষ্ম-টিউন করব।
Keras Flowers transfer learning (playground).ipynb
লক্ষ্য: নির্ভুলতা > ৯৫% (না, সত্যি বলতে, এটা সম্ভব!)
এটি চূড়ান্ত অনুশীলন, এর জন্য আরও কিছুটা কোড এবং ডেটা বিজ্ঞানের কাজ প্রয়োজন।
ফাইন-টিউনিং সম্পর্কে অতিরিক্ত তথ্য
tf.keras.application-এ স্ট্যান্ডার্ড প্রি-ট্রেনড মডেলগুলিতে Xception পাওয়া যাচ্ছে।* এবার সমস্ত ওজন প্রশিক্ষিত রাখতে ভুলবেন না।
pretrained_model = tf.keras.applications.Xception(input_shape=[*IMAGE_SIZE, 3],
include_top=False)
pretrained_model.trainable = True
একটি মডেলকে সূক্ষ্ম-টিউন করার সময় ভালো ফলাফল পেতে, আপনাকে শেখার হারের দিকে মনোযোগ দিতে হবে এবং একটি র্যাম্প-আপ পিরিয়ড সহ একটি শেখার হারের সময়সূচী ব্যবহার করতে হবে। এভাবে:

একটি স্ট্যান্ডার্ড লার্নিং রেট দিয়ে শুরু করলে মডেলের পূর্ব-প্রশিক্ষিত ওজন ব্যাহত হবে। শুরু করলে ধীরে ধীরে এগুলি সংরক্ষণ করা হবে যতক্ষণ না মডেলটি আপনার ডেটাতে ল্যাচ করে এবং সেগুলিকে একটি যুক্তিসঙ্গত উপায়ে পরিবর্তন করতে সক্ষম হয়। র্যাম্পের পরে, আপনি একটি ধ্রুবক বা সূচকীয়ভাবে ক্ষয়প্রাপ্ত লার্নিং রেট দিয়ে চালিয়ে যেতে পারেন।
কেরাসে, শেখার হার একটি কলব্যাকের মাধ্যমে নির্দিষ্ট করা হয় যেখানে আপনি প্রতিটি যুগের জন্য উপযুক্ত শেখার হার গণনা করতে পারেন। কেরাস প্রতিটি যুগের জন্য সঠিক শেখার হার অপ্টিমাইজারে প্রেরণ করবে।
def lr_fn(epoch):
lr = ...
return lr
lr_callback = tf.keras.callbacks.LearningRateScheduler(lr_fn, verbose=True)
model.fit(..., callbacks=[lr_callback])
সমাধান
এখানে সমাধান নোটবুক। যদি আপনি আটকে যান তবে আপনি এটি ব্যবহার করতে পারেন।
07_Keras_Flowers_TPU_xception_fine_tuned_best.ipynb
আমরা যা কভার করেছি
- 🤔 গভীরতা-বিভাজ্য কনভোলিউশন
- 🤓 শেখার হারের সময়সূচী
- 😈 একটি প্রাক-প্রশিক্ষিত মডেলকে উন্নত করা।
অনুগ্রহ করে একটু সময় নিয়ে এই চেকলিস্টটি আপনার মাথায় ঢোকান।
9. অভিনন্দন!
তুমি তোমার প্রথম আধুনিক কনভোলিউশনাল নিউরাল নেটওয়ার্ক তৈরি করেছ এবং 90% + নির্ভুলতার সাথে এটিকে প্রশিক্ষণ দিয়েছ, TPU-এর সাহায্যে মাত্র কয়েক মিনিটের মধ্যে ধারাবাহিক প্রশিক্ষণের পুনরাবৃত্তি করেছ। এর মাধ্যমে 4টি "TPU কোডল্যাবের উপর কেরাস" শেষ হয়:
- TPU-গতির ডেটা পাইপলাইন: tf.data.Dataset এবং TFRecords
- ট্রান্সফার লার্নিং সহ আপনার প্রথম কেরাস মডেল
- কেরাস এবং টিপিইউ সহ কনভোলিউশনাল নিউরাল নেটওয়ার্ক
- [এই ল্যাব] আধুনিক কনভনেট, স্কুইজনেট, এক্সসেপশন, কেরাস এবং টিপিইউ সহ
বাস্তবে টিপিইউ
ক্লাউড এআই প্ল্যাটফর্মে টিপিইউ এবং জিপিইউ পাওয়া যায়:
পরিশেষে, আমরা প্রতিক্রিয়া পেতে ভালোবাসি। এই ল্যাবে যদি কিছু ভুল দেখেন অথবা এটি উন্নত করা উচিত বলে মনে করেন, তাহলে দয়া করে আমাদের জানান। GitHub সমস্যাগুলির [ প্রতিক্রিয়া লিঙ্ক ] মাধ্যমে প্রতিক্রিয়া প্রদান করা যেতে পারে।

|

