1. ওভারভিউ
এই ল্যাবে, আপনি শিখবেন কিভাবে একটি নিউরাল নেটওয়ার্ক মডেলে কনভোল্যুশনাল লেয়ার একত্রিত করতে হয় যা ফুল চিনতে পারে। এইবার, আপনি নিজেই মডেলটি স্ক্র্যাচ থেকে তৈরি করবেন এবং TPU এর শক্তি ব্যবহার করে এটিকে কয়েক সেকেন্ডের মধ্যে প্রশিক্ষিত করবেন এবং এর ডিজাইনে পুনরাবৃত্তি করবেন।
এই ল্যাবটিতে কনভোল্যুশনাল নিউরাল নেটওয়ার্ক সম্পর্কে প্রয়োজনীয় তাত্ত্বিক ব্যাখ্যা রয়েছে এবং এটি গভীর শিক্ষা সম্পর্কে শেখার বিকাশকারীদের জন্য একটি ভাল সূচনা পয়েন্ট।
এই ল্যাবটি "কেরাস অন টিপিইউ" সিরিজের পার্ট 3। আপনি সেগুলি নিম্নলিখিত ক্রমে বা স্বাধীনভাবে করতে পারেন।
- TPU-গতির ডেটা পাইপলাইন: tf.data.Dataset এবং TFRecords
- ট্রান্সফার লার্নিং সহ আপনার প্রথম কেরাস মডেল
- [এই ল্যাব] কেরাস এবং টিপিইউ সহ কনভোল্যুশনাল নিউরাল নেটওয়ার্ক
- কেরাস এবং টিপিইউ সহ আধুনিক কনভনেট, স্কুইজেনেট, এক্সসেপশন
আপনি কি শিখবেন
- কেরাস সিকোয়েন্সিয়াল মডেল ব্যবহার করে একটি কনভোল্যুশনাল ইমেজ ক্লাসিফায়ার তৈরি করতে।
- টিপিইউতে আপনার কেরাস মডেলকে প্রশিক্ষণ দিতে
- কনভোলিউশনাল লেয়ারগুলির একটি ভাল পছন্দের সাথে আপনার মডেলকে সূক্ষ্ম-সুর করতে।
প্রতিক্রিয়া
আপনি যদি এই কোড ল্যাবে কিছু ভুল দেখতে পান, দয়া করে আমাদের বলুন। গিটহাব সমস্যার মাধ্যমে প্রতিক্রিয়া প্রদান করা যেতে পারে [ প্রতিক্রিয়া লিঙ্ক ]।
2. Google Colaboratory দ্রুত শুরু
এই ল্যাবটি Google Collaboratory ব্যবহার করে এবং আপনার পক্ষ থেকে কোন সেটআপের প্রয়োজন নেই৷ Colaboratory হল শিক্ষার উদ্দেশ্যে একটি অনলাইন নোটবুক প্ল্যাটফর্ম। এটি বিনামূল্যে CPU, GPU এবং TPU প্রশিক্ষণ প্রদান করে।
আপনি এই নমুনা নোটবুকটি খুলতে পারেন এবং Colaboratory এর সাথে নিজেকে পরিচিত করতে কয়েকটি কক্ষের মাধ্যমে চালাতে পারেন।
একটি TPU ব্যাকএন্ড নির্বাচন করুন
Colab মেনুতে, রানটাইম > রানটাইম পরিবর্তন করুন এবং তারপরে TPU নির্বাচন করুন। এই কোড ল্যাবে আপনি একটি শক্তিশালী TPU (টেনসর প্রসেসিং ইউনিট) ব্যবহার করবেন যা হার্ডওয়্যার-ত্বরিত প্রশিক্ষণের জন্য সমর্থিত। রানটাইমের সাথে সংযোগটি প্রথম সম্পাদনে স্বয়ংক্রিয়ভাবে ঘটবে, অথবা আপনি উপরের-ডান কোণে "সংযোগ" বোতামটি ব্যবহার করতে পারেন।
নোটবুক এক্সিকিউশন
একটি কক্ষে ক্লিক করে এবং Shift-ENTER ব্যবহার করে এক সময়ে সেলগুলি চালান৷ আপনি রানটাইম > সমস্ত চালান দিয়ে পুরো নোটবুক চালাতে পারেন
বিষয়বস্তুর সারণী
সমস্ত নোটবুকের বিষয়বস্তুর একটি টেবিল আছে। আপনি বাম দিকে কালো তীর ব্যবহার করে এটি খুলতে পারেন।
লুকানো কোষ
কিছু ঘর শুধুমাত্র তাদের শিরোনাম দেখাবে। এটি একটি Colab-নির্দিষ্ট নোটবুক বৈশিষ্ট্য। ভিতরে কোড দেখতে আপনি তাদের উপর ডাবল ক্লিক করতে পারেন কিন্তু এটি সাধারণত খুব আকর্ষণীয় হয় না। সাধারণত সমর্থন বা ভিজ্যুয়ালাইজেশন ফাংশন. ভিতরে ফাংশন সংজ্ঞায়িত করার জন্য আপনাকে এখনও এই ঘরগুলি চালাতে হবে।
প্রমাণীকরণ
Colab-এর পক্ষে আপনার ব্যক্তিগত Google ক্লাউড স্টোরেজ বালতি অ্যাক্সেস করা সম্ভব যদি আপনি একটি অনুমোদিত অ্যাকাউন্টের মাধ্যমে প্রমাণীকরণ করেন। উপরের কোড স্নিপেট একটি প্রমাণীকরণ প্রক্রিয়া ট্রিগার করবে।
3. [তথ্য] টেনসর প্রসেসিং ইউনিট (TPUs) কি?
সংক্ষেপে
কেরাসে টিপিইউতে একটি মডেলকে প্রশিক্ষণের জন্য কোড (এবং একটি টিপিইউ উপলব্ধ না হলে 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 রেন্ডারিং, গভীর শিক্ষা, শারীরিক সিমুলেশন ইত্যাদি পরিচালনা করতে দেয়। অন্যদিকে TPU গুলি একটি ডেডিকেটেড ভেক্টর প্রসেসরের সাথে যুক্ত করে। ম্যাট্রিক্স মাল্টিপ্লাই ইউনিট এবং যে কোনো কাজে এক্সেল যেখানে বৃহৎ ম্যাট্রিক্স গুণের প্রভাব থাকে, যেমন নিউরাল নেটওয়ার্ক।
দৃষ্টান্ত: ম্যাট্রিক্স গুণিতক হিসাবে একটি ঘন নিউরাল নেটওয়ার্ক স্তর, একযোগে নিউরাল নেটওয়ার্কের মাধ্যমে প্রক্রিয়াকৃত আটটি চিত্রের ব্যাচ সহ। এটি একটি চিত্রের সমস্ত পিক্সেল মানের একটি ওজনযুক্ত যোগফল করছে কিনা তা যাচাই করতে অনুগ্রহ করে একটি লাইন x কলাম গুণনের মাধ্যমে চালান৷ কনভোল্যুশনাল লেয়ারগুলিকেও ম্যাট্রিক্স গুণন হিসাবে উপস্থাপন করা যেতে পারে যদিও এটি একটু বেশি জটিল ( এখানে ব্যাখ্যা, বিভাগ 1 এ )।
হার্ডওয়্যার
MXU এবং VPU
একটি TPU v2 কোর একটি ম্যাট্রিক্স মাল্টিপ্লাই ইউনিট (MXU) দিয়ে তৈরি যা ম্যাট্রিক্স গুণন চালায় এবং একটি ভেক্টর প্রসেসিং ইউনিট (VPU) অন্যান্য সমস্ত কাজ যেমন অ্যাক্টিভেশন, সফটম্যাক্স ইত্যাদির জন্য। VPU float32 এবং int32 গণনা পরিচালনা করে। অন্যদিকে MXU একটি মিশ্র নির্ভুলতা 16-32 বিট ফ্লোটিং পয়েন্ট ফর্ম্যাটে কাজ করে।
মিশ্র স্পষ্টতা ভাসমান বিন্দু এবং bfloat16
MXU bfloat16 ইনপুট এবং float32 আউটপুট ব্যবহার করে ম্যাট্রিক্স গুন গণনা করে। মধ্যবর্তী সঞ্চয়গুলি float32 নির্ভুলতায় সঞ্চালিত হয়।
নিউরাল নেটওয়ার্ক প্রশিক্ষণ সাধারণত কম ফ্লোটিং পয়েন্ট নির্ভুলতা দ্বারা প্রবর্তিত গোলমাল প্রতিরোধী। এমন কিছু ক্ষেত্রে আছে যেখানে শব্দ এমনকি অপ্টিমাইজারকে একত্রিত হতে সাহায্য করে। 16-বিট ফ্লোটিং পয়েন্ট নির্ভুলতা ঐতিহ্যগতভাবে গণনাকে ত্বরান্বিত করার জন্য ব্যবহার করা হয়েছে কিন্তু float16 এবং float32 বিন্যাসের খুব ভিন্ন রেঞ্জ রয়েছে। float32 থেকে float16-এ নির্ভুলতা হ্রাস করার ফলে সাধারণত ওভার এবং আন্ডারফ্লো হয়। সমাধান বিদ্যমান কিন্তু অতিরিক্ত কাজ সাধারণত float16 কাজ করতে প্রয়োজন হয়.
এই কারণেই গুগল টিপিইউতে bfloat16 ফর্ম্যাট চালু করেছে। bfloat16 হল একটি ছেঁটে যাওয়া float32 যার ফ্লোট32-এর মতো একই সূচক বিট এবং রেঞ্জ রয়েছে। এটির সাথে যোগ করা হয়েছে যে TPUs 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 "কোর" উপলব্ধ হতে হবে যা সাধারণত সম্ভব নয়। বৃহত্তম জিপিইউতে প্রায় 4000 কোর রয়েছে। অন্যদিকে একটি TPU MXU-তে কম্পিউট ইউনিটের জন্য ন্যূনতম হার্ডওয়্যার ব্যবহার করে: শুধু bfloat16 x bfloat16 => float32
মাল্টিপ্লাই-অ্যাকুমুলেটর, অন্য কিছু নয়। এগুলি এতই ছোট যে একটি TPU একটি 128x128 MXU তে 16K প্রয়োগ করতে পারে এবং এই ম্যাট্রিক্স গুণকে একবারে প্রক্রিয়া করতে পারে।
উদাহরণ: MXU সিস্টোলিক অ্যারে। কম্পিউট উপাদানগুলি গুন-সঞ্চয়কারী। একটি ম্যাট্রিক্সের মানগুলি অ্যারেতে লোড করা হয় (লাল বিন্দু)। অন্যান্য ম্যাট্রিক্সের মানগুলি অ্যারের (ধূসর বিন্দু) মাধ্যমে প্রবাহিত হয়। উল্লম্ব রেখাগুলি মানগুলিকে উপরে প্রচার করে। অনুভূমিক রেখাগুলি আংশিক সমষ্টি প্রচার করে। এটি ব্যবহারকারীর কাছে যাচাই করার জন্য একটি অনুশীলন হিসাবে ছেড়ে দেওয়া হয়েছে যে অ্যারের মাধ্যমে ডেটা প্রবাহিত হওয়ার সাথে সাথে আপনি ডান দিক থেকে ম্যাট্রিক্স গুণনের ফলাফল পাবেন।
তা ছাড়াও, যখন ডট পণ্যগুলি একটি MXU-তে গণনা করা হচ্ছে, তখন মধ্যবর্তী সমষ্টিগুলি কেবল সংলগ্ন কম্পিউট ইউনিটগুলির মধ্যে প্রবাহিত হয়। এগুলিকে মেমরিতে/ থেকে এমনকি একটি রেজিস্টার ফাইল সংরক্ষণ এবং পুনরুদ্ধার করার দরকার নেই। শেষ ফলাফল হল যে TPU সিস্টোলিক অ্যারে আর্কিটেকচারের একটি উল্লেখযোগ্য ঘনত্ব এবং পাওয়ার সুবিধা রয়েছে, সেইসাথে একটি GPU-এর তুলনায় একটি নগণ্য গতির সুবিধা রয়েছে, যখন ম্যাট্রিক্স গুণনগুলি গণনা করা হয়।
মেঘ TPU
যখন আপনি Google ক্লাউড প্ল্যাটফর্মে একটি " ক্লাউড TPU v2" এর জন্য অনুরোধ করেন, আপনি একটি ভার্চুয়াল মেশিন (VM) পান যাতে একটি PCI-সংযুক্ত TPU বোর্ড থাকে৷ TPU বোর্ডে চারটি ডুয়াল-কোর TPU চিপ রয়েছে। প্রতিটি টিপিইউ কোরে একটি ভিপিইউ (ভেক্টর প্রসেসিং ইউনিট) এবং একটি 128x128 MXU (ম্যাট্রিক্স মাল্টিপ্লাই ইউনিট) বৈশিষ্ট্যযুক্ত। এই "ক্লাউড টিপিইউ" সাধারণত নেটওয়ার্কের মাধ্যমে ভিএমের সাথে সংযুক্ত থাকে যা এটির অনুরোধ করেছিল৷ তাই সম্পূর্ণ ছবি এই মত দেখায়:
উদাহরণ: নেটওয়ার্ক-সংযুক্ত "ক্লাউড TPU" অ্যাক্সিলারেটরের সাথে আপনার VM। "দ্য ক্লাউড টিপিইউ" নিজেই একটি পিসিআই-সংযুক্ত টিপিইউ বোর্ড সহ একটি ভিএম দিয়ে তৈরি যার উপরে চারটি ডুয়াল-কোর টিপিইউ চিপ রয়েছে৷
TPU শুঁটি
Google-এর ডেটা সেন্টারগুলিতে, TPU গুলি একটি উচ্চ-পারফরম্যান্স কম্পিউটিং (HPC) আন্তঃসংযোগের সাথে সংযুক্ত থাকে যা তাদের একটি খুব বড় অ্যাক্সিলারেটর হিসাবে দেখাতে পারে। গুগল তাদের পড বলে এবং তারা 512 টিপিইউ ভি2 কোর বা 2048 টিপিইউ ভি3 কোর পর্যন্ত অন্তর্ভুক্ত করতে পারে।
উদাহরণ: একটি TPU v3 পড। TPU বোর্ড এবং র্যাকগুলি HPC আন্তঃসংযোগের মাধ্যমে সংযুক্ত।
প্রশিক্ষণের সময়, অল-রিডুস অ্যালগরিদম ব্যবহার করে টিপিইউ কোরের মধ্যে গ্রেডিয়েন্ট আদান-প্রদান করা হয় ( এখানে অল-রিডুসের ভালো ব্যাখ্যা )। প্রশিক্ষিত মডেলটি বড় ব্যাচের মাপের প্রশিক্ষণের মাধ্যমে হার্ডওয়্যারের সুবিধা নিতে পারে।
উদাহরণ: Google TPU-এর 2-D টরয়েডাল মেশ HPC নেটওয়ার্কে অল-রিডুস অ্যালগরিদম ব্যবহার করে প্রশিক্ষণের সময় গ্রেডিয়েন্টের সিঙ্ক্রোনাইজেশন।
সফটওয়্যার
বড় ব্যাচ আকারের প্রশিক্ষণ
TPU-গুলির জন্য আদর্শ ব্যাচের আকার হল প্রতি TPU কোরে 128টি ডেটা আইটেম কিন্তু হার্ডওয়্যারটি ইতিমধ্যেই প্রতি TPU কোরে 8টি ডেটা আইটেম থেকে ভাল ব্যবহার দেখাতে পারে। মনে রাখবেন যে একটি ক্লাউড টিপিইউতে 8টি কোর রয়েছে।
এই কোড ল্যাবে, আমরা Keras API ব্যবহার করব। কেরাসে, আপনি যে ব্যাচটি নির্দিষ্ট করেছেন তা হল সমগ্র TPU-এর জন্য বিশ্বব্যাপী ব্যাচের আকার। আপনার ব্যাচগুলি স্বয়ংক্রিয়ভাবে 8-এ বিভক্ত হবে এবং TPU-এর 8টি কোরে চলবে।
অতিরিক্ত পারফরম্যান্স টিপসের জন্য TPU পারফরম্যান্স গাইড দেখুন। খুব বড় ব্যাচের আকারের জন্য, কিছু মডেলে বিশেষ যত্নের প্রয়োজন হতে পারে, আরও বিস্তারিত জানার জন্য LARSOptimizer দেখুন।
হুড অধীনে: XLA
টেনসরফ্লো প্রোগ্রাম গণনা গ্রাফ সংজ্ঞায়িত করে। TPU সরাসরি পাইথন কোড চালায় না, এটি আপনার টেনসরফ্লো প্রোগ্রাম দ্বারা সংজ্ঞায়িত গণনা গ্রাফ চালায়। হুডের নিচে, XLA (এক্সিলারেটেড লিনিয়ার অ্যালজেব্রা কম্পাইলার) নামক একটি কম্পাইলার কম্পিউটেশন নোডের টেনসরফ্লো গ্রাফকে TPU মেশিন কোডে রূপান্তরিত করে। এই কম্পাইলারটি আপনার কোড এবং আপনার মেমরি লেআউটে অনেক উন্নত অপ্টিমাইজেশন সঞ্চালন করে। TPU-তে কাজ পাঠানোর সাথে সাথে সংকলন স্বয়ংক্রিয়ভাবে ঘটে। আপনাকে স্পষ্টভাবে আপনার বিল্ড চেইনে XLA অন্তর্ভুক্ত করতে হবে না।
উদাহরণ: TPU-তে চালানোর জন্য, আপনার Tensorflow প্রোগ্রাম দ্বারা সংজ্ঞায়িত গণনা গ্রাফটি প্রথমে একটি XLA (ত্বরিত লিনিয়ার অ্যালজেব্রা কম্পাইলার) উপস্থাপনায় অনুবাদ করা হয়, তারপর XLA দ্বারা TPU মেশিন কোডে সংকলিত হয়।
কেরাসে টিপিইউ ব্যবহার করা
TPUs কেরাস API এর মাধ্যমে Tensorflow 2.1 এর মাধ্যমে সমর্থিত। কেরাস সমর্থন টিপিইউ এবং টিপিইউ পডগুলিতে কাজ করে। এখানে একটি উদাহরণ রয়েছে যা 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' ইউটিলিটির মাধ্যমে তৈরি ডিপ লার্নিং ভিএম) প্যারামিটার ছাড়াই কাজ করে। TPU_NAME এনভায়রনমেন্ট ভেরিয়েবলের জন্য এই সিস্টেমগুলি জানে যে তাদের TPU কোথায় আছে৷ আপনি যদি হাতে একটি TPU তৈরি করেন, হয় TPU_NAME env সেট করুন৷ var আপনি যে VM থেকে এটি ব্যবহার করছেন তাতে, অথবা স্পষ্ট প্যারামিটার সহTPUClusterResolver
কল করুন:TPUClusterResolver(tp_uname, zone, project)
-
TPUStrategy
হল সেই অংশ যা ডিস্ট্রিবিউশন এবং "অল-রিডুস" গ্রেডিয়েন্ট সিঙ্ক্রোনাইজেশন অ্যালগরিদম প্রয়োগ করে। - কৌশল একটি সুযোগ মাধ্যমে প্রয়োগ করা হয়. মডেলটিকে অবশ্যই কৌশলের সুযোগ() এর মধ্যে সংজ্ঞায়িত করতে হবে।
-
tpu_model.fit
ফাংশন টিপিইউ প্রশিক্ষণের জন্য ইনপুটের জন্য একটি tf.data.Dataset অবজেক্ট আশা করে।
সাধারণ TPU পোর্টিং কাজ
- টেনসরফ্লো মডেলে ডেটা লোড করার অনেক উপায় থাকলেও, TPU-এর জন্য,
tf.data.Dataset
API ব্যবহার করা প্রয়োজন। - টিপিইউগুলি খুব দ্রুত এবং সেগুলি চালানোর সময় ডেটা গ্রহণ করা প্রায়শই বাধা হয়ে দাঁড়ায়৷ টিপিইউ পারফরম্যান্স গাইডে ডেটা বাধা এবং অন্যান্য কর্মক্ষমতা টিপস সনাক্ত করতে আপনি এমন সরঞ্জামগুলি ব্যবহার করতে পারেন।
- int8 বা int16 সংখ্যাগুলিকে int32 হিসাবে গণ্য করা হয়। TPU-তে 32 বিটের কম পূর্ণসংখ্যার হার্ডওয়্যার অপারেটিং নেই।
- কিছু Tensorflow অপারেশন সমর্থিত নয়। তালিকা এখানে আছে . ভাল খবর হল এই সীমাবদ্ধতা শুধুমাত্র ট্রেনিং কোডের ক্ষেত্রে প্রযোজ্য, অর্থাৎ আপনার মডেলের মধ্য দিয়ে ফরওয়ার্ড এবং পিছন দিকে পাস। আপনি এখনও আপনার ডেটা ইনপুট পাইপলাইনে সমস্ত Tensorflow অপারেশন ব্যবহার করতে পারেন কারণ এটি CPU-তে কার্যকর করা হবে।
-
tf.py_func
TPU তে সমর্থিত নয়।
4. [তথ্য] নিউরাল নেটওয়ার্ক ক্লাসিফায়ার 101
সংক্ষেপে
যদি পরবর্তী অনুচ্ছেদে গাঢ় সব পদ আপনার কাছে ইতিমধ্যেই পরিচিত হয়, তাহলে আপনি পরবর্তী অনুশীলনে যেতে পারেন। আপনি যদি সবেমাত্র গভীর শিক্ষা শুরু করেন তাহলে স্বাগতম, এবং অনুগ্রহ করে পড়ুন।
স্তরগুলির একটি ক্রম হিসাবে নির্মিত মডেলগুলির জন্য কেরাস অনুক্রমিক API অফার করে। উদাহরণস্বরূপ, তিনটি ঘন স্তর ব্যবহার করে একটি ইমেজ ক্লাসিফায়ার কেরাসে এভাবে লেখা যেতে পারে:
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 বলা হয়। এটি একটি খুব সাধারণ ফাংশন যা আপনি উপরের গ্রাফে দেখতে পাচ্ছেন।
সফটম্যাক্স অ্যাক্টিভেশন
উপরের নেটওয়ার্কটি একটি 5-নিউরন স্তর দিয়ে শেষ হয় কারণ আমরা ফুলকে 5টি বিভাগে শ্রেণীবদ্ধ করছি (গোলাপ, টিউলিপ, ড্যান্ডেলিয়ন, ডেইজি, সূর্যমুখী)। মধ্যবর্তী স্তরের নিউরনগুলি ক্লাসিক RELU অ্যাক্টিভেশন ফাংশন ব্যবহার করে সক্রিয় করা হয়। যদিও শেষ স্তরে, আমরা 0 এবং 1 এর মধ্যে সংখ্যা গণনা করতে চাই যা এই ফুলটি গোলাপ, একটি টিউলিপ ইত্যাদি হওয়ার সম্ভাবনার প্রতিনিধিত্ব করে। এর জন্য, আমরা "softmax" নামে একটি অ্যাক্টিভেশন ফাংশন ব্যবহার করব।
একটি ভেক্টরে সফটম্যাক্স প্রয়োগ করা হয় প্রতিটি উপাদানের সূচক নিয়ে এবং তারপর ভেক্টরটিকে স্বাভাবিক করার মাধ্যমে, সাধারণত L1 আদর্শ (পরম মানের সমষ্টি) ব্যবহার করে যাতে মানগুলি 1 পর্যন্ত যোগ হয় এবং সম্ভাব্যতা হিসাবে ব্যাখ্যা করা যায়।
ক্রস-এনট্রপি ক্ষতি
এখন যেহেতু আমাদের নিউরাল নেটওয়ার্ক ইনপুট ইমেজগুলি থেকে ভবিষ্যদ্বাণী তৈরি করে, আমাদের সেগুলি কতটা ভাল তা পরিমাপ করতে হবে, অর্থাৎ নেটওয়ার্ক আমাদের যা বলে এবং সঠিক উত্তরগুলির মধ্যে দূরত্ব, প্রায়ই "লেবেল" বলা হয়। মনে রাখবেন যে ডেটাসেটের সমস্ত ছবির জন্য আমাদের কাছে সঠিক লেবেল রয়েছে।
যেকোনো দূরত্ব কাজ করবে, কিন্তু শ্রেণীবিভাগের সমস্যার জন্য তথাকথিত "ক্রস-এনট্রপি দূরত্ব" সবচেয়ে কার্যকর । আমরা এটিকে আমাদের ত্রুটি বা "ক্ষতি" ফাংশন বলব:
গ্রেডিয়েন্ট ডিসেন্ট
নিউরাল নেটওয়ার্কের "প্রশিক্ষণ" আসলে বোঝায় ওজন এবং পক্ষপাতগুলি সামঞ্জস্য করার জন্য প্রশিক্ষণের চিত্র এবং লেবেল ব্যবহার করা যাতে ক্রস-এনট্রপি লস ফাংশন কম করা যায়। এটি কিভাবে কাজ করে তা এখানে।
ক্রস-এনট্রপি হল ওজন, পক্ষপাত, প্রশিক্ষণ চিত্রের পিক্সেল এবং এর পরিচিত শ্রেণির একটি ফাংশন।
যদি আমরা ক্রস-এনট্রপির আংশিক ডেরিভেটিভগুলিকে তুলনা করি সমস্ত ওজন এবং সমস্ত পক্ষপাতের সাথে তুলনা করে আমরা একটি "গ্রেডিয়েন্ট" পাই, একটি প্রদত্ত চিত্র, লেবেল এবং ওজন এবং পক্ষপাতের বর্তমান মানের জন্য গণনা করা হয়। মনে রাখবেন যে আমাদের লক্ষ লক্ষ ওজন এবং পক্ষপাত থাকতে পারে তাই গ্রেডিয়েন্ট কম্পিউট করা অনেক কাজের মত মনে হয়। ভাগ্যক্রমে, টেনসরফ্লো আমাদের জন্য এটি করে। একটি গ্রেডিয়েন্টের গাণিতিক বৈশিষ্ট্য হল এটি "উপর" নির্দেশ করে। যেহেতু আমরা যেতে চাই যেখানে ক্রস-এনট্রপি কম, আমরা বিপরীত দিকে যাই। আমরা গ্রেডিয়েন্টের একটি ভগ্নাংশ দ্বারা ওজন এবং পক্ষপাত আপডেট করি। তারপরে আমরা ট্রেনিং লুপে পরবর্তী ব্যাচের ট্রেনিং ইমেজ এবং লেবেল ব্যবহার করে একই জিনিস বার বার করি। আশা করা যায়, এটি এমন একটি জায়গায় রূপান্তরিত হয় যেখানে ক্রস-এনট্রপি ন্যূনতম যদিও কিছুই গ্যারান্টি দেয় না যে এই ন্যূনতমটি অনন্য।
মিনি-ব্যাচিং এবং ভরবেগ
আপনি শুধুমাত্র একটি উদাহরণ চিত্রের উপর আপনার গ্রেডিয়েন্ট গণনা করতে পারেন এবং ওজন এবং পক্ষপাতগুলি অবিলম্বে আপডেট করতে পারেন, কিন্তু এটি একটি ব্যাচে, উদাহরণস্বরূপ, 128টি চিত্র একটি গ্রেডিয়েন্ট দেয় যা বিভিন্ন উদাহরণ চিত্র দ্বারা আরোপিত সীমাবদ্ধতাগুলিকে আরও ভালভাবে উপস্থাপন করে এবং তাই একত্রিত হওয়ার সম্ভাবনা রয়েছে দ্রুত সমাধানের দিকে। মিনি-ব্যাচের আকার একটি সামঞ্জস্যযোগ্য পরামিতি।
এই কৌশলটি, যাকে কখনও কখনও "স্টোকাস্টিক গ্রেডিয়েন্ট ডিসেন্ট" বলা হয়, এর আরও একটি, আরও বাস্তবসম্মত সুবিধা রয়েছে: ব্যাচগুলির সাথে কাজ করার অর্থ আরও বড় ম্যাট্রিক্সের সাথে কাজ করা এবং এগুলি সাধারণত GPU এবং TPU-তে অপ্টিমাইজ করা সহজ।
কনভারজেন্স এখনও একটু বিশৃঙ্খল হতে পারে এবং গ্রেডিয়েন্ট ভেক্টর সব শূন্য হলে এটি থামতে পারে। যে আমরা একটি ন্যূনতম পাওয়া গেছে যে মানে? সবসময় নয়। একটি গ্রেডিয়েন্ট উপাদান সর্বনিম্ন বা সর্বোচ্চ শূন্য হতে পারে। লক্ষ লক্ষ উপাদান সহ একটি গ্রেডিয়েন্ট ভেক্টরের সাথে, যদি সেগুলি সব শূন্য হয়, সম্ভাব্যতা যে প্রতিটি শূন্য একটি ন্যূনতম এবং কোনটি সর্বাধিক বিন্দুর সাথে সামঞ্জস্যপূর্ণ নয়। অনেক মাত্রার জায়গায়, স্যাডল পয়েন্টগুলি বেশ সাধারণ এবং আমরা সেগুলিতে থামতে চাই না।
উদাহরণ: একটি স্যাডল পয়েন্ট। গ্রেডিয়েন্ট 0 কিন্তু এটি সব দিক থেকে ন্যূনতম নয়। (ইমেজ অ্যাট্রিবিউশন উইকিমিডিয়া: নিকোগুয়ারো দ্বারা - নিজের কাজ, CC BY 3.0 )
সমাধান হল অপ্টিমাইজেশান অ্যালগরিদমে কিছু গতিবেগ যোগ করা যাতে এটি থেমে না গিয়ে অতীতের স্যাডল পয়েন্টে যেতে পারে।
শব্দকোষ
ব্যাচ বা মিনি-ব্যাচ : প্রশিক্ষণ সর্বদা প্রশিক্ষণ ডেটা এবং লেবেলের ব্যাচে সঞ্চালিত হয়। এটি করা অ্যালগরিদমকে একত্রিত করতে সহায়তা করে। "ব্যাচ" মাত্রা সাধারণত ডেটা টেনসরের প্রথম মাত্রা। উদাহরণস্বরূপ আকৃতির একটি টেনসর [100, 192, 192, 3] প্রতি পিক্সেল (RGB) তিনটি মান সহ 192x192 পিক্সেলের 100টি চিত্র রয়েছে।
ক্রস-এনট্রপি লস : একটি বিশেষ ক্ষতি ফাংশন যা প্রায়ই ক্লাসিফায়ারে ব্যবহৃত হয়।
ঘন স্তর : নিউরনের একটি স্তর যেখানে প্রতিটি নিউরন পূর্ববর্তী স্তরের সমস্ত নিউরনের সাথে সংযুক্ত থাকে।
বৈশিষ্ট্য : একটি নিউরাল নেটওয়ার্কের ইনপুট কখনও কখনও "বৈশিষ্ট্য" বলা হয়। ভাল ভবিষ্যদ্বাণী পেতে একটি ডেটাসেটের কোন অংশগুলি (বা অংশগুলির সংমিশ্রণ) একটি নিউরাল নেটওয়ার্কে ফিড করতে হবে তা খুঁজে বের করার শিল্পকে "ফিচার ইঞ্জিনিয়ারিং" বলা হয়।
লেবেল : তত্ত্বাবধানে শ্রেণীবিভাগের সমস্যায় "ক্লাস" বা সঠিক উত্তরের অন্য নাম
শেখার হার : গ্রেডিয়েন্টের ভগ্নাংশ যার দ্বারা প্রশিক্ষণ লুপের প্রতিটি পুনরাবৃত্তিতে ওজন এবং পক্ষপাতগুলি আপডেট করা হয়।
logits : অ্যাক্টিভেশন ফাংশন প্রয়োগ করার আগে নিউরনের একটি স্তরের আউটপুটকে "লগিট" বলা হয়। শব্দটি "লজিস্টিক ফাংশন" ওরফে "সিগময়েড ফাংশন" থেকে এসেছে যা সবচেয়ে জনপ্রিয় অ্যাক্টিভেশন ফাংশন হিসাবে ব্যবহৃত হত। "লজিস্টিক ফাংশনের আগে নিউরন আউটপুট" কে সংক্ষিপ্ত করে "লজিট" করা হয়েছিল।
ক্ষতি : সঠিক উত্তরের সাথে নিউরাল নেটওয়ার্ক আউটপুট তুলনা করার ত্রুটি ফাংশন
নিউরন : এর ইনপুটগুলির ওজনযুক্ত যোগফল গণনা করে, একটি পক্ষপাত যোগ করে এবং একটি সক্রিয়করণ ফাংশনের মাধ্যমে ফলাফলকে ফিড করে।
ওয়ান-হট এনকোডিং : 5 এর মধ্যে 3 ক্লাস 5টি উপাদানের ভেক্টর হিসাবে এনকোড করা হয়েছে, 3য়টি ব্যতীত সমস্ত শূন্য যা 1।
relu : সংশোধনকৃত লিনিয়ার ইউনিট। নিউরনের জন্য একটি জনপ্রিয় অ্যাক্টিভেশন ফাংশন।
সিগমায়েড : আরেকটি অ্যাক্টিভেশন ফাংশন যা জনপ্রিয় ছিল এবং এখনও বিশেষ ক্ষেত্রে কার্যকর।
সফটম্যাক্স : একটি বিশেষ অ্যাক্টিভেশন ফাংশন যা একটি ভেক্টরের উপর কাজ করে, বৃহত্তম উপাদান এবং অন্য সকলের মধ্যে পার্থক্য বাড়ায় এবং ভেক্টরটিকে 1 এর সমষ্টিতে স্বাভাবিক করে তোলে যাতে এটি সম্ভাব্যতার ভেক্টর হিসাবে ব্যাখ্যা করা যায়। ক্লাসিফায়ারে শেষ ধাপ হিসেবে ব্যবহৃত হয়।
tensor : একটি "টেনসর" একটি ম্যাট্রিক্সের মত কিন্তু মাত্রার একটি ইচ্ছামত সংখ্যা সহ। একটি 1-মাত্রিক টেনসর একটি ভেক্টর। একটি 2-মাত্রা টেনসর একটি ম্যাট্রিক্স। এবং তারপরে আপনার 3, 4, 5 বা তার বেশি মাত্রা সহ টেনসর থাকতে পারে।
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'])
কনভোল্যুশনাল নিউরাল নেট 101
একটি কনভোল্যুশনাল নেটওয়ার্কের একটি স্তরে, একটি "নিউরন" শুধুমাত্র ছবির একটি ছোট অঞ্চল জুড়ে পিক্সেলগুলির একটি ওজনযুক্ত সমষ্টি করে। এটি একটি পক্ষপাত যোগ করে এবং একটি সক্রিয়করণ ফাংশনের মাধ্যমে যোগফলকে ফিড করে, ঠিক যেমন একটি নিয়মিত ঘন স্তরে একটি নিউরন করে। এই অপারেশন তারপর একই ওজন ব্যবহার করে সমগ্র ইমেজ জুড়ে পুনরাবৃত্তি হয়. মনে রাখবেন যে ঘন স্তরগুলিতে, প্রতিটি নিউরনের নিজস্ব ওজন ছিল। এখানে, ওজনের একটি একক "প্যাচ" উভয় দিকে চিত্র জুড়ে স্লাইড করে (একটি "আবর্তন")। ছবিতে পিক্সেলের মতো আউটপুটটির মান রয়েছে (যদিও প্রান্তে কিছু প্যাডিং প্রয়োজন)। এটি একটি ফিল্টারিং অপারেশন, 4x4x3=48 ওজনের একটি ফিল্টার ব্যবহার করে।
যাইহোক, 48 ওজন যথেষ্ট হবে না। স্বাধীনতার আরও ডিগ্রী যোগ করতে, আমরা ওজনের একটি নতুন সেটের সাথে একই অপারেশনটি পুনরাবৃত্তি করি। এটি ফিল্টার আউটপুটগুলির একটি নতুন সেট তৈরি করে। ইনপুট ইমেজে R,G,B চ্যানেলের সাথে সাদৃশ্য দিয়ে এটিকে আউটপুটগুলির একটি "চ্যানেল" বলি।
একটি নতুন মাত্রা যোগ করে ওজনের দুটি (বা তার বেশি) সেটকে একটি টেনসর হিসাবে যোগ করা যেতে পারে। এটি আমাদের একটি কনভোল্যুশনাল লেয়ারের জন্য ওজন টেনসরের জেনেরিক আকৃতি দেয়। যেহেতু ইনপুট এবং আউটপুট চ্যানেলের সংখ্যা পরামিতি, তাই আমরা কনভোলিউশনাল স্তরগুলিকে স্ট্যাকিং এবং চেইন করা শুরু করতে পারি।
দৃষ্টান্ত: একটি কনভোলিউশনাল নিউরাল নেটওয়ার্ক ডেটার "কিউবস" কে ডেটার অন্যান্য "কিউব"-এ রূপান্তরিত করে।
স্ট্রাইডেড কনভোলিউশন, সর্বোচ্চ পুলিং
2 বা 3 স্ট্রাইডের সাথে কনভোলিউশনগুলি সম্পাদন করে, আমরা ফলস্বরূপ ডেটা কিউবকে এর অনুভূমিক মাত্রায় সঙ্কুচিত করতে পারি। এটি করার দুটি সাধারণ উপায় রয়েছে:
- স্ট্রাইডেড কনভোলিউশন: উপরের মত একটি স্লাইডিং ফিল্টার কিন্তু স্ট্রাইড >1 সহ
- সর্বোচ্চ পুলিং: একটি স্লাইডিং উইন্ডো MAX অপারেশন প্রয়োগ করে (সাধারণত 2x2 প্যাচে, প্রতি 2 পিক্সেলে পুনরাবৃত্তি হয়)
দৃষ্টান্ত: কম্পিউটিং উইন্ডোটি 3 পিক্সেল দ্বারা স্লাইড করার ফলে আউটপুট মান কম হয়। স্ট্রাইডেড কনভোলিউশন বা ম্যাক্স পুলিং (একটি 2x2 উইন্ডোতে সর্বাধিক 2 স্ট্রাইড দ্বারা স্লাইডিং) হল অনুভূমিক মাত্রায় ডেটা কিউবকে সঙ্কুচিত করার একটি উপায়।
সি অনভোলুশনাল ক্লাসিফায়ার
অবশেষে, আমরা শেষ ডেটা কিউবকে চ্যাপ্টা করে এবং একটি ঘন, সফটম্যাক্স-অ্যাক্টিভেটেড লেয়ারের মাধ্যমে খাওয়ানোর মাধ্যমে একটি শ্রেণিবিন্যাস মাথা সংযুক্ত করি। একটি সাধারণ কনভোল্যুশনাল ক্লাসিফায়ার এইরকম দেখতে পারে:
ইলাস্ট্রেশন: কনভোলিউশনাল এবং সফটম্যাক্স লেয়ার ব্যবহার করে একটি ইমেজ ক্লাসিফায়ার। এটি 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'])
6. আপনার কাস্টম কনভনেট
হাতে-কলমে
আসুন আমরা স্ক্র্যাচ থেকে একটি কনভোলিউশনাল নিউরাল নেটওয়ার্ক তৈরি এবং প্রশিক্ষণ দিই। একটি TPU ব্যবহার করা আমাদেরকে খুব দ্রুত পুনরাবৃত্তি করতে দেয়। অনুগ্রহ করে নিচের নোটবুকটি খুলুন, সেলগুলি চালান (Shift-ENTER) এবং নির্দেশাবলী অনুসরণ করুন যেখানেই আপনি একটি "ওয়ার্ক রিকোয়ারড" লেবেল দেখতে পান৷
Keras_Flowers_TPU (playground).ipynb
লক্ষ্য হ'ল স্থানান্তর শেখার মডেলের 75% নির্ভুলতাকে হারানো। এই মডেলটির একটি সুবিধা ছিল, লক্ষ লক্ষ ছবির ডেটাসেটে প্রাক-প্রশিক্ষিত থাকাকালীন আমাদের এখানে মাত্র 3670টি ছবি রয়েছে৷ আপনি অন্তত এটি মেলাতে পারেন?
অতিরিক্ত তথ্য
কত স্তর, কত বড়?
স্তরের আকার নির্বাচন করা একটি বিজ্ঞানের চেয়ে একটি শিল্প বেশি। খুব কম এবং অনেক বেশি প্যারামিটার (ওজন এবং পক্ষপাত) থাকার মধ্যে আপনাকে সঠিক ভারসাম্য খুঁজে বের করতে হবে। খুব কম ওজনের সাথে, নিউরাল নেটওয়ার্ক ফুলের আকারের জটিলতা উপস্থাপন করতে পারে না। অনেকের সাথে, এটি "ওভারফিটিং" প্রবণ হতে পারে, অর্থাৎ প্রশিক্ষণের চিত্রগুলিতে বিশেষীকরণ এবং সাধারণীকরণ করতে সক্ষম না হওয়া। অনেক পরামিতি সহ, মডেলটি প্রশিক্ষণের জন্যও ধীর হবে। কেরাসে, 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
_________________________________________________________________
কয়েকটি টিপস:
- একাধিক স্তর থাকাই "গভীর" নিউরাল নেটওয়ার্কগুলিকে কার্যকর করে তোলে। এই সহজ ফুল শনাক্তকরণ সমস্যার জন্য, 5 থেকে 10 স্তরগুলি বোঝায়।
- ছোট ফিল্টার ব্যবহার করুন। সাধারণত 3x3 ফিল্টার সব জায়গায় ভাল।
- 1x1 ফিল্টারগুলিও ব্যবহার করা যেতে পারে এবং সস্তা। তারা চ্যানেলগুলির রৈখিক সংমিশ্রণগুলি গণনা করা ছাড়া আর কিছুই "ফিল্টার" করে না। বাস্তব ফিল্টার সঙ্গে তাদের বিকল্প. (পরবর্তী বিভাগে "1x1 কনভোলিউশন" সম্পর্কে আরও।)
- এই ধরনের শ্রেণীবিভাগের সমস্যার জন্য, সর্বাধিক-পুলিং স্তরগুলির সাথে ঘন ঘন নমুনা নিন (অথবা স্ট্রাইড >1 সহ কনভোলিউশন)। ফুলটি কোথায় আছে তা আপনি চিন্তা করেন না, শুধুমাত্র এটি একটি গোলাপ বা একটি ড্যান্ডেলিয়ন তাই x এবং y তথ্য হারানো গুরুত্বপূর্ণ নয় এবং ছোট অঞ্চলগুলি ফিল্টার করা সস্তা।
- ফিল্টারের সংখ্যা সাধারণত নেটওয়ার্কের শেষে ক্লাসের সংখ্যার সমান হয় (কেন? নীচে "গ্লোবাল এভারেজ পুলিং" ট্রিক দেখুন)। আপনি যদি শত শত শ্রেণীতে শ্রেণীবদ্ধ করেন, পরপর স্তরে ফিল্টার গণনা ক্রমান্বয়ে বৃদ্ধি করুন। 5টি ক্লাস সহ ফুলের ডেটাসেটের জন্য, শুধুমাত্র 5টি ফিল্টার দিয়ে ফিল্টার করা যথেষ্ট হবে না। আপনি বেশিরভাগ স্তরে একই ফিল্টার গণনা ব্যবহার করতে পারেন, উদাহরণস্বরূপ 32 এবং শেষের দিকে এটি হ্রাস করুন।
- চূড়ান্ত ঘন স্তর(গুলি) ব্যয়বহুল। এটি/তাদের একত্রিত সমস্ত কনভোলিউশনাল স্তরের চেয়ে বেশি ওজন থাকতে পারে। উদাহরণস্বরূপ, এমনকি 24x24x10 ডেটা পয়েন্টের শেষ ডেটা কিউব থেকে খুব যুক্তিসঙ্গত আউটপুট সহ, একটি 100 নিউরন ঘন স্তরের জন্য 24x24x10x100=576,000 ওজন খরচ হবে!!! চিন্তাশীল হওয়ার চেষ্টা করুন, অথবা বিশ্বব্যাপী গড় পুলিং চেষ্টা করুন (নীচে দেখুন)।
বিশ্বব্যাপী গড় পুলিং
কনভোল্যুশনাল নিউরাল নেটওয়ার্কের শেষে একটি ব্যয়বহুল ঘন স্তর ব্যবহার করার পরিবর্তে, আপনি ইনকামিং ডেটা "কিউব" কে আপনার ক্লাসের মতো অনেক অংশে বিভক্ত করতে পারেন, তাদের মান গড় করতে পারেন এবং একটি সফটম্যাক্স অ্যাক্টিভেশন ফাংশনের মাধ্যমে এইগুলি খাওয়াতে পারেন। শ্রেণীবিভাগের মাথা নির্মাণের এই পদ্ধতিতে 0 ওজন খরচ হয়। কেরাসে, সিনট্যাক্স হল tf.keras.layers.GlobalAveragePooling2D().
সমাধান
এখানে সমাধান নোটবুক. আপনি আটকে থাকলে আপনি এটি ব্যবহার করতে পারেন।
Keras_Flowers_TPU (solution).ipynb
আমরা কভার করেছি কি
- 🤔 কনভোলিউশনাল লেয়ার দিয়ে খেলা হয়েছে
- 🤓 সর্বোচ্চ পুলিং, স্ট্রাইডস, গ্লোবাল এভারেজ পুলিং, ... নিয়ে পরীক্ষা করা হয়েছে
- 😀 TPU-তে একটি বাস্তব-বিশ্বের মডেলে দ্রুত পুনরাবৃত্তি করা হয়েছে
আপনার মাথায় এই চেকলিস্টের মধ্য দিয়ে যাওয়ার জন্য অনুগ্রহ করে একটু সময় নিন।
7. অভিনন্দন!
আপনি আপনার প্রথম আধুনিক কনভোলিউশনাল নিউরাল নেটওয়ার্ক তৈরি করেছেন এবং এটিকে 80% + নির্ভুলতার জন্য প্রশিক্ষিত করেছেন, TPU গুলিকে ধন্যবাদ মাত্র কয়েক মিনিটের মধ্যে এর আর্কিটেকচারে পুনরাবৃত্তি করে। আধুনিক কনভোলিউশনাল আর্কিটেকচার সম্পর্কে জানতে অনুগ্রহ করে পরবর্তী ল্যাবে চালিয়ে যান:
- TPU-গতির ডেটা পাইপলাইন: tf.data.Dataset এবং TFRecords
- ট্রান্সফার লার্নিং সহ আপনার প্রথম কেরাস মডেল
- [এই ল্যাব] কেরাস এবং টিপিইউ সহ কনভোল্যুশনাল নিউরাল নেটওয়ার্ক
- কেরাস এবং টিপিইউ সহ আধুনিক কনভনেট, স্কুইজেনেট, এক্সসেপশন
অনুশীলনে TPUs
ক্লাউড এআই প্ল্যাটফর্মে টিপিইউ এবং জিপিইউ পাওয়া যায়:
অবশেষে, আমরা প্রতিক্রিয়া পছন্দ করি। আপনি যদি এই ল্যাবে কিছু ভুল দেখেন বা আপনি যদি মনে করেন এটি উন্নত করা উচিত তাহলে অনুগ্রহ করে আমাদের বলুন৷ গিটহাব ইস্যুগুলির মাধ্যমে প্রতিক্রিয়া সরবরাহ করা যেতে পারে [ প্রতিক্রিয়া লিঙ্ক ]।
|