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

তুমি কি শিখবে
- কেরাস সিকোয়েন্সিয়াল মডেল ব্যবহার করে একটি কনভলিউশনাল ইমেজ ক্লাসিফায়ার তৈরি করা।
- আপনার কেরাস মডেলকে TPU তে প্রশিক্ষণ দিতে
- কনভোলিউশনাল লেয়ারের একটি ভালো পছন্দের মাধ্যমে আপনার মডেলটিকে সূক্ষ্ম-সুরকরণ করতে।
প্রতিক্রিয়া
এই কোড ল্যাবে যদি কিছু ভুল দেখতে পান, তাহলে অনুগ্রহ করে আমাদের জানান। 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'])
৬. আপনার কাস্টম কনভনেট
হাতে-কলমে
আসুন আমরা শুরু থেকেই একটি কনভোলিউশনাল নিউরাল নেটওয়ার্ক তৈরি এবং প্রশিক্ষণ দেই। একটি TPU ব্যবহার করলে আমরা খুব দ্রুত পুনরাবৃত্তি করতে পারব। অনুগ্রহ করে নিম্নলিখিত নোটবুকটি খুলুন, কোষগুলি (Shift-ENTER) চালান এবং যেখানেই "কাজের প্রয়োজন" লেবেলটি দেখতে পাবেন সেখানে নির্দেশাবলী অনুসরণ করুন।
Keras_Flowers_TPU (playground).ipynb
লক্ষ্য হলো ট্রান্সফার লার্নিং মডেলের ৭৫% নির্ভুলতাকে ছাড়িয়ে যাওয়া। এই মডেলটির একটি সুবিধা ছিল, লক্ষ লক্ষ ছবির ডেটাসেটে আগে থেকে প্রশিক্ষিত থাকা সত্ত্বেও, আমাদের কাছে মাত্র ৩৬৭০টি ছবি আছে। আপনি কি অন্তত এটি মেলাতে পারবেন?
অতিরিক্ত তথ্য
কত স্তর, কত বড়?
স্তরের আকার নির্বাচন করা বিজ্ঞানের চেয়ে শিল্পের কাজ বেশি। খুব কম এবং অনেক বেশি প্যারামিটার (ওজন এবং পক্ষপাত) থাকার মধ্যে সঠিক ভারসাম্য খুঁজে বের করতে হবে। খুব কম ওজনের কারণে, নিউরাল নেটওয়ার্ক ফুলের আকারের জটিলতা উপস্থাপন করতে পারে না। অনেক বেশি ওজনের কারণে, এটি "অতিরিক্ত ফিটিং" হওয়ার প্রবণতা দেখাতে পারে, অর্থাৎ প্রশিক্ষণের চিত্রগুলিতে বিশেষজ্ঞ হতে পারে এবং সাধারণীকরণ করতে সক্ষম না হতে পারে। অনেক প্যারামিটারের কারণে, মডেলটি প্রশিক্ষণে ধীর গতিতেও কাজ করবে। কেরাসে, model.summary() ফাংশন আপনার মডেলের গঠন এবং প্যারামিটার গণনা প্রদর্শন করে:
Layer (type) Output Shape Param #
=================================================================
conv2d (Conv2D) (None, 192, 192, 16) 448
_________________________________________________________________
conv2d_1 (Conv2D) (None, 192, 192, 30) 4350
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 96, 96, 30) 0
_________________________________________________________________
conv2d_2 (Conv2D) (None, 96, 96, 60) 16260
_________________________________________________________________
...
_________________________________________________________________
global_average_pooling2d (Gl (None, 130) 0
_________________________________________________________________
dense (Dense) (None, 90) 11790
_________________________________________________________________
dense_1 (Dense) (None, 5) 455
=================================================================
Total params: 300,033
Trainable params: 300,033
Non-trainable params: 0
_________________________________________________________________
কয়েকটি টিপস:
- একাধিক স্তর থাকাই "গভীর" নিউরাল নেটওয়ার্কগুলিকে কার্যকর করে তোলে। এই সহজ ফুল শনাক্তকরণ সমস্যার জন্য, ৫ থেকে ১০টি স্তরের প্রয়োজন।
- ছোট ফিল্টার ব্যবহার করুন। সাধারণত ৩x৩ ফিল্টার সব জায়গায় ভালো।
- ১x১ ফিল্টারও ব্যবহার করা যেতে পারে এবং সস্তা। এগুলো আসলে কিছুই "ফিল্টার" করে না, বরং চ্যানেলের রৈখিক সংমিশ্রণ গণনা করে। এগুলোকে বাস্তব ফিল্টার দিয়ে বিকল্প করুন। (পরবর্তী বিভাগে "১x১ কনভলিউশন" সম্পর্কে আরও জানুন।)
- এই ধরণের শ্রেণীবিভাগের সমস্যার জন্য, ম্যাক্স-পুলিং লেয়ার (অথবা স্ট্রাইড >1 সহ কনভোলিউশন) ব্যবহার করে ঘন ঘন নমুনা ডাউনসাম্পল করুন। ফুলটি কোথায় তা আপনার বিবেচ্য নয়, কেবল এটি গোলাপ নাকি ড্যান্ডেলিয়ন তাই x এবং y তথ্য হারানো গুরুত্বপূর্ণ নয় এবং ছোট এলাকা ফিল্টার করা সস্তা।
- ফিল্টারের সংখ্যা সাধারণত নেটওয়ার্কের শেষে ক্লাসের সংখ্যার সমান হয়ে যায় (কেন? নীচে "গ্লোবাল এভারেজ পুলিং" কৌশলটি দেখুন)। যদি আপনি শত শত ক্লাসে শ্রেণীবদ্ধ করেন, তাহলে ধারাবাহিক স্তরগুলিতে ফিল্টারের সংখ্যা ক্রমান্বয়ে বৃদ্ধি করুন। 5 টি ক্লাস সহ ফ্লাওয়ার ডেটাসেটের জন্য, শুধুমাত্র 5 টি ফিল্টার দিয়ে ফিল্টার করা যথেষ্ট হবে না। আপনি বেশিরভাগ স্তরে একই ফিল্টার গণনা ব্যবহার করতে পারেন, উদাহরণস্বরূপ 32 এবং শেষের দিকে এটি হ্রাস করতে পারেন।
- চূড়ান্ত ঘন স্তরটি ব্যয়বহুল/ব্যয়বহুল। এর/তাদের ওজন সমস্ত কনভোলিউশনাল স্তরের মিলিত ওজনের চেয়ে বেশি হতে পারে। উদাহরণস্বরূপ, 24x24x10 ডেটা পয়েন্টের শেষ ডেটা কিউব থেকে খুব যুক্তিসঙ্গত আউটপুট থাকা সত্ত্বেও, 100 নিউরন ঘন স্তরের দাম 24x24x10x100=576,000 ওজন হবে !!! চিন্তাশীল হওয়ার চেষ্টা করুন, অথবা বিশ্বব্যাপী গড় পুলিং চেষ্টা করুন (নীচে দেখুন)।
বিশ্বব্যাপী গড় পুলিং
কনভোলিউশনাল নিউরাল নেটওয়ার্কের শেষে একটি ব্যয়বহুল ঘন স্তর ব্যবহার করার পরিবর্তে, আপনি আগত ডেটা "কিউব" কে আপনার ক্লাসের যতগুলি অংশে ভাগ করতে পারেন, তাদের মানগুলি গড় করতে পারেন এবং একটি সফটম্যাক্স অ্যাক্টিভেশন ফাংশনের মাধ্যমে এগুলি ফিড করতে পারেন। ক্লাসিফিকেশন হেড তৈরির এই পদ্ধতিতে 0 ওজন খরচ হয়। কেরাসে, সিনট্যাক্স হল tf.keras.layers.GlobalAveragePooling2D().

সমাধান
এখানে সমাধান নোটবুক। যদি আপনি আটকে যান তবে আপনি এটি ব্যবহার করতে পারেন।
Keras_Flowers_TPU (solution).ipynb
আমরা যা কভার করেছি
- 🤔 কনভোলিউশনাল লেয়ার দিয়ে খেলা হয়েছে
- 🤓 সর্বোচ্চ পুলিং, স্ট্রাইডস, গ্লোবাল এভারেজ পুলিং, ... নিয়ে পরীক্ষা-নিরীক্ষা করা হয়েছে।
- 😀 বাস্তব জগতের মডেলে দ্রুত পুনরাবৃত্তি করা হয়েছে, TPU তে
অনুগ্রহ করে একটু সময় নিয়ে এই চেকলিস্টটি আপনার মাথায় ঢোকান।
৭. অভিনন্দন!
তুমি তোমার প্রথম আধুনিক কনভোলিউশনাল নিউরাল নেটওয়ার্ক তৈরি করেছ এবং 80% + নির্ভুলতার জন্য এটিকে প্রশিক্ষণ দিয়েছ, TPU-এর সাহায্যে মাত্র কয়েক মিনিটের মধ্যেই এর আর্কিটেকচারে পুনরাবৃত্তি করতে পেরেছ। আধুনিক কনভোলিউশনাল আর্কিটেকচার সম্পর্কে জানতে অনুগ্রহ করে পরবর্তী ল্যাবে যান:
- TPU-speed data pipelines: tf.data.Dataset and TFRecords
- Your first Keras model, with transfer learning
- [THIS LAB] Convolutional neural networks, with Keras and TPUs
- Modern convnets, squeezenet, Xception, with Keras and TPUs
TPUs in practice
TPUs and GPUs are available on Cloud AI Platform :
- On Deep Learning VMs
- In AI Platform Notebooks
- In AI Platform Training jobs
Finally, we love feedback. Please tell us if you see something amiss in this lab or if you think it should be improved. Feedback can be provided through GitHub issues [ feedback link ].

|

