কেরাস এবং টিপিইউ সহ আধুনিক কনভনেট, স্কুইজেনেট, এক্সসেপশন

1. ওভারভিউ

এই ল্যাবে, আপনি আধুনিক কনভোলিউশনাল আর্কিটেকচার সম্পর্কে শিখবেন এবং আপনার জ্ঞান ব্যবহার করে "স্কুইজেনেট" নামক একটি সহজ কিন্তু কার্যকর কনভনেট বাস্তবায়ন করতে পারবেন।

এই ল্যাবটিতে কনভোল্যুশনাল নিউরাল নেটওয়ার্ক সম্পর্কে প্রয়োজনীয় তাত্ত্বিক ব্যাখ্যা রয়েছে এবং এটি গভীর শিক্ষা সম্পর্কে শেখার বিকাশকারীদের জন্য একটি ভাল সূচনা পয়েন্ট।

এই ল্যাবটি "Keras on TPU" সিরিজের পার্ট 4। আপনি সেগুলি নিম্নলিখিত ক্রমে বা স্বাধীনভাবে করতে পারেন।

ca8cc21f6838eccc.png

আপনি কি শিখবেন

  • কেরাস কার্যকরী শৈলী আয়ত্ত করতে
  • স্কুইজেনেট আর্কিটেকচার ব্যবহার করে একটি মডেল তৈরি করা
  • আপনার আর্কিটেকচারে দ্রুত প্রশিক্ষণ এবং পুনরাবৃত্তি করার জন্য TPUs ব্যবহার করতে
  • tf.data.dataset এর সাথে ডেটা অগমেন্টেশন বাস্তবায়ন করা
  • টিপিইউতে একটি পূর্বপ্রশিক্ষিত বড় মডেল (এক্সেপশন) সূক্ষ্ম-টিউন করতে

প্রতিক্রিয়া

আপনি যদি এই কোড ল্যাবে কিছু ভুল দেখতে পান, দয়া করে আমাদের বলুন। গিটহাব সমস্যার মাধ্যমে প্রতিক্রিয়া প্রদান করা যেতে পারে [ প্রতিক্রিয়া লিঙ্ক ]।

2. Google Colaboratory দ্রুত শুরু

এই ল্যাবটি Google Collaboratory ব্যবহার করে এবং আপনার পক্ষ থেকে কোন সেটআপের প্রয়োজন নেই৷ Colaboratory হল শিক্ষার উদ্দেশ্যে একটি অনলাইন নোটবুক প্ল্যাটফর্ম। এটি বিনামূল্যে CPU, GPU এবং TPU প্রশিক্ষণ প্রদান করে।

688858c21e3beff2.png

আপনি এই নমুনা নোটবুকটি খুলতে পারেন এবং Colaboratory এর সাথে নিজেকে পরিচিত করতে কয়েকটি কক্ষের মাধ্যমে চালাতে পারেন।

c3df49e90e5a654f.png Welcome to Colab.ipynb

একটি TPU ব্যাকএন্ড নির্বাচন করুন

8832c6208c99687d.png

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

নোটবুক এক্সিকিউশন

76d05caa8b4db6da.png

একটি কক্ষে ক্লিক করে এবং Shift-ENTER ব্যবহার করে এক সময়ে সেলগুলি চালান৷ আপনি রানটাইম > সমস্ত চালান দিয়ে পুরো নোটবুক চালাতে পারেন

বিষয়বস্তুর সারণী

429f106990037ec4.png

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

লুকানো কোষ

edc3dba45d26f12a.png

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

প্রমাণীকরণ

cdd4b41413100543.png

Colab-এর পক্ষে আপনার ব্যক্তিগত Google ক্লাউড স্টোরেজ বালতি অ্যাক্সেস করা সম্ভব যদি আপনি একটি অনুমোদিত অ্যাকাউন্টের মাধ্যমে প্রমাণীকরণ করেন। উপরের কোড স্নিপেট একটি প্রমাণীকরণ প্রক্রিয়া ট্রিগার করবে।

3. [তথ্য] টেনসর প্রসেসিং ইউনিট (TPUs) কি?

সংক্ষেপে

f88cf6facfc70166.png

কেরাসে টিপিইউতে একটি মডেলকে প্রশিক্ষণের জন্য কোড (এবং যদি একটি টিপিইউ উপলব্ধ না হয় তবে জিপিইউ বা সিপিইউতে ফিরে আসে):

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 ব্যবহার করব।

688858c21e3beff2.png

কেন টিপিইউ?

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

8eb3e718b8e2ed08.png

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

হার্ডওয়্যার

MXU এবং VPU

একটি TPU v2 কোর একটি ম্যাট্রিক্স মাল্টিপ্লাই ইউনিট (MXU) দিয়ে তৈরি যা ম্যাট্রিক্স গুণন চালায় এবং একটি ভেক্টর প্রসেসিং ইউনিট (VPU) অন্যান্য সমস্ত কাজ যেমন অ্যাক্টিভেশন, সফটম্যাক্স ইত্যাদির জন্য। VPU float32 এবং int32 গণনা পরিচালনা করে। অন্যদিকে MXU একটি মিশ্র নির্ভুলতা 16-32 বিট ফ্লোটিং পয়েন্ট ফর্ম্যাটে কাজ করে।

7d68944718f76b18.png

মিশ্র স্পষ্টতা ভাসমান বিন্দু এবং bfloat16

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

19c5fc432840c714.png

নিউরাল নেটওয়ার্ক প্রশিক্ষণ সাধারণত কম ফ্লোটিং পয়েন্ট নির্ভুলতা দ্বারা প্রবর্তিত গোলমাল প্রতিরোধী। এমন কিছু ক্ষেত্রে আছে যেখানে শব্দ এমনকি অপ্টিমাইজারকে একত্রিত হতে সাহায্য করে। 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 প্রয়োগ করতে পারে এবং এই ম্যাট্রিক্স গুণকে একবারে প্রক্রিয়া করতে পারে।

f1b283fc45966717.gif

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

তা ছাড়াও, যখন ডট পণ্যগুলি একটি MXU-তে গণনা করা হচ্ছে, তখন মধ্যবর্তী সমষ্টিগুলি কেবল সংলগ্ন কম্পিউট ইউনিটগুলির মধ্যে প্রবাহিত হয়। এগুলিকে মেমরিতে/ থেকে এমনকি একটি রেজিস্টার ফাইল সংরক্ষণ এবং পুনরুদ্ধার করার দরকার নেই। শেষ ফলাফল হল যে TPU সিস্টোলিক অ্যারে আর্কিটেকচারের একটি উল্লেখযোগ্য ঘনত্ব এবং পাওয়ার সুবিধা রয়েছে, সেইসাথে একটি GPU-এর তুলনায় একটি নগণ্য গতির সুবিধা রয়েছে, যখন ম্যাট্রিক্স গুণনগুলি গণনা করা হয়।

মেঘ TPU

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

dfce5522ed644ece.png

উদাহরণ: নেটওয়ার্ক-সংযুক্ত "ক্লাউড টিপিইউ" অ্যাক্সিলারেটরের সাথে আপনার ভিএম। "দ্য ক্লাউড টিপিইউ" নিজেই একটি পিসিআই-সংযুক্ত টিপিইউ বোর্ড সহ একটি ভিএম দিয়ে তৈরি যার উপরে চারটি ডুয়াল-কোর টিপিইউ চিপ রয়েছে৷

TPU শুঁটি

Google-এর ডেটা সেন্টারগুলিতে, TPU গুলি একটি উচ্চ-পারফরম্যান্স কম্পিউটিং (HPC) আন্তঃসংযোগের সাথে সংযুক্ত থাকে যা তাদের একটি খুব বড় অ্যাক্সিলারেটর হিসাবে দেখাতে পারে। গুগল তাদের পড বলে এবং তারা 512 টিপিইউ ভি2 কোর বা 2048 টিপিইউ ভি3 কোর পর্যন্ত অন্তর্ভুক্ত করতে পারে।

2ec1e0d341e7fc34.jpeg

উদাহরণ: একটি TPU v3 পড। TPU বোর্ড এবং র্যাকগুলি HPC আন্তঃসংযোগের মাধ্যমে সংযুক্ত।

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

d97b9cc5d40fdb1d.gif

উদাহরণ: Google TPU-এর 2-D টরয়েডাল মেশ HPC নেটওয়ার্কে অল-রিডুস অ্যালগরিদম ব্যবহার করে প্রশিক্ষণের সময় গ্রেডিয়েন্টের সিঙ্ক্রোনাইজেশন।

সফটওয়্যার

বড় ব্যাচ আকারের প্রশিক্ষণ

TPU-গুলির জন্য আদর্শ ব্যাচের আকার হল প্রতি TPU কোরে 128টি ডেটা আইটেম কিন্তু হার্ডওয়্যারটি ইতিমধ্যেই প্রতি TPU কোরে 8টি ডেটা আইটেম থেকে ভাল ব্যবহার দেখাতে পারে। মনে রাখবেন যে একটি ক্লাউড টিপিইউতে 8টি কোর রয়েছে।

এই কোড ল্যাবে, আমরা Keras API ব্যবহার করব। কেরাসে, আপনি যে ব্যাচটি নির্দিষ্ট করেছেন তা হল সমগ্র TPU-এর জন্য বিশ্বব্যাপী ব্যাচের আকার। আপনার ব্যাচগুলি স্বয়ংক্রিয়ভাবে 8-এ বিভক্ত হবে এবং TPU-এর 8টি কোরে চলবে।

da534407825f01e3.png

অতিরিক্ত পারফরম্যান্স টিপসের জন্য TPU পারফরম্যান্স গাইড দেখুন। খুব বড় ব্যাচের আকারের জন্য, কিছু মডেলে বিশেষ যত্নের প্রয়োজন হতে পারে, আরও বিস্তারিত জানার জন্য LARSOptimizer দেখুন।

হুড অধীনে: XLA

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

edce61112cd57972.png

উদাহরণ: 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, ... )

688858c21e3beff2.png

ঘন নিউরাল নেটওয়ার্ক

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

c21bae6dade487bc.png

আপনি একটি ছবিকে এই জাতীয় নেটওয়ার্কে ফিড করতে পারেন এর সমস্ত পিক্সেলের RGB মানগুলিকে একটি লম্বা ভেক্টরে সমতল করে এবং এটিকে ইনপুট হিসাবে ব্যবহার করে৷ এটি ইমেজ শনাক্তকরণের জন্য সর্বোত্তম কৌশল নয় তবে আমরা পরে এটিতে উন্নতি করব।

নিউরন, অ্যাক্টিভেশন, RELU

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

644f4213a4ee70e5.png

সবচেয়ে জনপ্রিয় অ্যাক্টিভেশন ফাংশনটিকে রেক্টিফায়েড লিনিয়ার ইউনিটের জন্য RELU বলা হয়। এটি একটি খুব সাধারণ ফাংশন যা আপনি উপরের গ্রাফে দেখতে পাচ্ছেন।

সফটম্যাক্স অ্যাক্টিভেশন

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

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

ef0d98c0952c262d.pngd51252f75894479e.gif

ক্রস-এনট্রপি ক্ষতি

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

যেকোনো দূরত্ব কাজ করবে, কিন্তু শ্রেণীবিভাগের সমস্যার জন্য তথাকথিত "ক্রস-এনট্রপি দূরত্ব" সবচেয়ে কার্যকর । আমরা এটিকে আমাদের ত্রুটি বা "ক্ষতি" ফাংশন বলব:

7bdf8753d20617fb.png

গ্রেডিয়েন্ট ডিসেন্ট

নিউরাল নেটওয়ার্কের "প্রশিক্ষণ" আসলে বোঝায় ওজন এবং পক্ষপাতগুলি সামঞ্জস্য করার জন্য প্রশিক্ষণের চিত্র এবং লেবেল ব্যবহার করা যাতে ক্রস-এনট্রপি লস ফাংশন কম করা যায়। এটি কিভাবে কাজ করে তা এখানে।

ক্রস-এনট্রপি হল ওজন, পক্ষপাত, প্রশিক্ষণ চিত্রের পিক্সেল এবং এর পরিচিত শ্রেণির একটি ফাংশন।

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

গ্রেডিয়েন্ট ডিসেন্ট2.png

মিনি-ব্যাচিং এবং ভরবেগ

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

এই কৌশলটি, যাকে কখনও কখনও "স্টোকাস্টিক গ্রেডিয়েন্ট ডিসেন্ট" বলা হয়, এর আরও একটি, আরও বাস্তবসম্মত সুবিধা রয়েছে: ব্যাচগুলির সাথে কাজ করার অর্থ আরও বড় ম্যাট্রিক্সের সাথে কাজ করা এবং এগুলি সাধারণত GPU এবং TPU-তে অপ্টিমাইজ করা সহজ।

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

52e824fe4716c4a0.png

উদাহরণ: একটি স্যাডল পয়েন্ট। গ্রেডিয়েন্ট 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. [তথ্য] কনভোল্যুশনাল নিউরাল নেটওয়ার্ক

সংক্ষেপে

যদি পরবর্তী অনুচ্ছেদে গাঢ় সব পদ আপনার কাছে ইতিমধ্যেই পরিচিত হয়, তাহলে আপনি পরবর্তী অনুশীলনে যেতে পারেন। আপনি যদি কনভোল্যুশনাল নিউরাল নেটওয়ার্ক দিয়ে শুরু করেন তাহলে অনুগ্রহ করে পড়ুন।

convolutional.gif

দৃষ্টান্ত: 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'])

688858c21e3beff2.png

কনভোল্যুশনাল নিউরাল নেট 101

একটি কনভোল্যুশনাল নেটওয়ার্কের একটি স্তরে, একটি "নিউরন" শুধুমাত্র ছবির একটি ছোট অঞ্চল জুড়ে পিক্সেলগুলির একটি ওজনযুক্ত সমষ্টি করে। এটি একটি পক্ষপাত যোগ করে এবং একটি সক্রিয়করণ ফাংশনের মাধ্যমে যোগফলকে ফিড করে, ঠিক যেমন একটি নিয়মিত ঘন স্তরে একটি নিউরন করে। এই অপারেশন তারপর একই ওজন ব্যবহার করে সমগ্র ইমেজ জুড়ে পুনরাবৃত্তি হয়. মনে রাখবেন যে ঘন স্তরগুলিতে, প্রতিটি নিউরনের নিজস্ব ওজন ছিল। এখানে, ওজনের একটি একক "প্যাচ" উভয় দিকে চিত্র জুড়ে স্লাইড করে (একটি "আবর্তন")। ছবিতে পিক্সেলের মতো আউটপুটটির মান রয়েছে (যদিও প্রান্তে কিছু প্যাডিং প্রয়োজন)। এটি একটি ফিল্টারিং অপারেশন, 4x4x3=48 ওজনের একটি ফিল্টার ব্যবহার করে।

যাইহোক, 48 ওজন যথেষ্ট হবে না। স্বাধীনতার আরও ডিগ্রী যোগ করতে, আমরা ওজনের একটি নতুন সেটের সাথে একই অপারেশনটি পুনরাবৃত্তি করি। এটি ফিল্টার আউটপুটগুলির একটি নতুন সেট তৈরি করে। ইনপুট ইমেজে R,G,B চ্যানেলের সাথে সাদৃশ্য দিয়ে এটিকে আউটপুটগুলির একটি "চ্যানেল" বলি।

স্ক্রীন শট 2016-07-29 16.02.37.png এ

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

d1b557707bcd1cb9.png

দৃষ্টান্ত: একটি কনভোলিউশনাল নিউরাল নেটওয়ার্ক ডেটার "কিউবস" কে ডেটার অন্যান্য "কিউব"-এ রূপান্তরিত করে।

স্ট্রাইডেড কনভোলিউশন, সর্বোচ্চ পুলিং

2 বা 3 স্ট্রাইডের সাথে কনভোলিউশনগুলি সম্পাদন করে, আমরা ফলস্বরূপ ডেটা কিউবকে এর অনুভূমিক মাত্রায় সঙ্কুচিত করতে পারি। এটি করার দুটি সাধারণ উপায় রয়েছে:

  • স্ট্রাইডেড কনভোলিউশন: উপরের মত একটি স্লাইডিং ফিল্টার কিন্তু স্ট্রাইড >1 সহ
  • সর্বোচ্চ পুলিং: একটি স্লাইডিং উইন্ডো MAX অপারেশন প্রয়োগ করে (সাধারণত 2x2 প্যাচে, প্রতি 2 পিক্সেলে পুনরাবৃত্তি হয়)

2b2d4263bb8470b.gif

দৃষ্টান্ত: কম্পিউটিং উইন্ডোটি 3 পিক্সেল দ্বারা স্লাইড করার ফলে আউটপুট মান কম হয়। স্ট্রাইডেড কনভোলিউশন বা ম্যাক্স পুলিং (একটি 2x2 উইন্ডোতে সর্বাধিক 2 স্ট্রাইড দ্বারা স্লাইডিং) হল অনুভূমিক মাত্রায় ডেটা কিউবকে সঙ্কুচিত করার একটি উপায়।

সি অনভোলুশনাল ক্লাসিফায়ার

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

4a61aaffb6cba3d1.png

ইলাস্ট্রেশন: কনভোলিউশনাল এবং সফটম্যাক্স লেয়ার ব্যবহার করে একটি ইমেজ ক্লাসিফায়ার। এটি 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. [নতুন তথ্য] আধুনিক কনভোলিউশনাল আর্কিটেকচার

সংক্ষেপে

7968830b57b708c0.png

দৃষ্টান্ত: একটি বিবর্তনীয় "মডিউল"। এই সময়ে সেরা কি? একটি সর্বোচ্চ-পুল স্তর একটি 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)

688858c21e3beff2.png

অন্যান্য সস্তা কৌশল

ছোট 3x3 ফিল্টার

40a7b15fb7dbe75c.png

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

1x1 convolutions?

fd7cac16f8ecb423.png

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

7. স্কুইজেনেট

এই ধারণাগুলিকে একসাথে রাখার একটি সহজ উপায় "Squeeznet" কাগজে দেখানো হয়েছে। লেখকরা শুধুমাত্র 1x1 এবং 3x3 কনভোলিউশনাল লেয়ার ব্যবহার করে একটি খুব সাধারণ কনভোলিউশনাল মডিউল ডিজাইনের পরামর্শ দেন।

1730ac375379269b.png

উদাহরণ: "ফায়ার মডিউল" এর উপর ভিত্তি করে স্কুইজেনেট আর্কিটেকচার। তারা একটি 1x1 স্তর বিকল্প করে যা উল্লম্ব মাত্রায় আগত ডেটাকে "নিচু করে" এবং তারপরে দুটি সমান্তরাল 1x1 এবং 3x3 কনভোলিউশনাল স্তর যা আবার ডেটার গভীরতাকে "প্রসারিত" করে।

হাতে-কলমে

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

c3df49e90e5a654f.png 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)

এবারের লক্ষ্য হল 80% নির্ভুলতা আঘাত করা।

চেষ্টা করার জিনিস

একটি একক কনভোলিউশনাল লেয়ার দিয়ে শুরু করুন, তারপরে MaxPooling2D(pool_size=2) স্তরগুলির সাথে পর্যায়ক্রমে " fire_modules " অনুসরণ করুন। আপনি নেটওয়ার্কে 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)

এই মুহুর্তে, আপনি লক্ষ্য করতে পারেন যে আপনার পরীক্ষাগুলি এত ভাল যাচ্ছে না এবং 80% নির্ভুলতার উদ্দেশ্য দূরবর্তী বলে মনে হচ্ছে। আরো কিছু সস্তা কৌশল জন্য সময়.

ব্যাচ স্বাভাবিককরণ

ব্যাচের আদর্শ আপনি যে কনভারজেন্স সমস্যার সম্মুখীন হচ্ছেন তাতে সাহায্য করবে। পরবর্তী কর্মশালায় এই কৌশল সম্পর্কে বিশদ ব্যাখ্যা থাকবে, আপাতত, আপনার 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

মোমেন্টাম প্যারামিটারটিকে তার ডিফল্ট মান 0.99 থেকে 0.9 এ হ্রাস করতে হবে কারণ আমাদের ডেটাসেটটি ছোট। আপাতত এই বিস্তারিত কিছু মনে করবেন না.

তথ্য বৃদ্ধি

আপনি স্যাচুরেশন পরিবর্তনের বাম-ডান ফ্লিপের মতো সহজ রূপান্তর সহ ডেটা বৃদ্ধি করে আরও কয়েক শতাংশ পয়েন্ট পাবেন:

4ed2958e09b487ca.png

ad795b70334e0d6b.png

tf.data.Dataset API-এর সাথে Tensorflow-এ এটি করা খুবই সহজ। আপনার ডেটার জন্য একটি নতুন রূপান্তর ফাংশন সংজ্ঞায়িত করুন:

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

ডেটা অগমেন্টেশনকে ঐচ্ছিক করতে ভুলবেন না এবং শুধুমাত্র প্রশিক্ষণ ডেটাসেটটি পরিবর্ধিত হয়েছে তা নিশ্চিত করতে প্রয়োজনীয় কোড যোগ করতে ভুলবেন না। বৈধতা ডেটাসেট বাড়ানোর কোন মানে হয় না।

35টি যুগে 80% নির্ভুলতা এখন নাগালের মধ্যে থাকা উচিত।

সমাধান

এখানে সমাধান নোটবুক. আপনি আটকে থাকলে আপনি এটি ব্যবহার করতে পারেন।

c3df49e90e5a654f.png Keras_Flowers_TPU_squeezenet.ipynb

আমরা কভার করেছি কি

  • 🤔 কেরাস "কার্যকরী শৈলী" মডেল
  • 🤓 স্কুইজেনেট আর্কিটেকচার
  • 🤓 tf.data.datset সহ ডেটা বৃদ্ধি

আপনার মাথায় এই চেকলিস্টের মধ্য দিয়ে যাওয়ার জন্য অনুগ্রহ করে একটু সময় নিন।

8. এক্সসেপশন ফাইন-টিউনড

বিভাজ্য convolutions

কনভোলিউশনাল লেয়ার বাস্তবায়নের একটি ভিন্ন উপায় সম্প্রতি জনপ্রিয়তা লাভ করেছে: গভীরতা-বিভাজ্য কনভোলিউশন। আমি জানি, এটি একটি মুখের, কিন্তু ধারণাটি বেশ সহজ। এগুলি টেনসরফ্লো এবং কেরাসে tf.keras.layers.SeparableConv2D হিসাবে প্রয়োগ করা হয়েছে।

একটি বিভাজ্য কনভোলিউশন ছবিটিতে একটি ফিল্টারও চালায় তবে এটি ইনপুট চিত্রের প্রতিটি চ্যানেলের জন্য ওজনের একটি স্বতন্ত্র সেট ব্যবহার করে। এটি একটি "1x1 কনভোলিউশন" সহ অনুসরণ করে, ডট পণ্যগুলির একটি সিরিজ যার ফলে ফিল্টার করা চ্যানেলগুলির একটি ওজনযুক্ত যোগফল। প্রতিবার নতুন ওজনের সাথে, চ্যানেলগুলির যতগুলি ওজনযুক্ত পুনর্মিলন প্রয়োজন ততগুলি গণনা করা হয়।

615720b803bf8dda.gif

দৃষ্টান্ত: বিভাজ্য কনভোলিউশন। পর্যায় 1: প্রতিটি চ্যানেলের জন্য একটি পৃথক ফিল্টার সহ কনভল্যুশন। পর্যায় 2: চ্যানেলগুলির রৈখিক পুনর্মিলন। আউটপুট চ্যানেলের পছন্দসই সংখ্যায় পৌঁছানো পর্যন্ত ওজনের একটি নতুন সেটের সাথে পুনরাবৃত্তি করা হয়। পর্যায় 1 প্রতিবার নতুন ওজনের সাথেও পুনরাবৃত্তি করা যেতে পারে কিন্তু বাস্তবে এটি খুব কমই হয়।

বিভাজ্য কনভোলিউশনগুলি সাম্প্রতিক কনভোল্যুশনাল নেটওয়ার্ক আর্কিটেকচারে ব্যবহৃত হয়: MobileNetV2, Xception, EfficientNet। যাইহোক, MobileNetV2 যা আপনি আগে ট্রান্সফার শেখার জন্য ব্যবহার করেছিলেন।

এগুলি নিয়মিত কনভল্যুশনের চেয়ে সস্তা এবং অনুশীলনে ঠিক ততটাই কার্যকর বলে প্রমাণিত হয়েছে। উপরে চিত্রিত উদাহরণের জন্য এখানে ওজন গণনা রয়েছে:

আবর্তিত স্তর: 4 x 4 x 3 x 5 = 240

বিভাজ্য কনভোলিউশনাল লেয়ার: 4 x 4 x 3 + 3 x 5 = 48 + 15 = 63

প্রতিটি শৈলী কনভোলিউশনাল লেয়ার স্কেলের অনুরূপভাবে প্রয়োগ করার জন্য প্রয়োজনীয় গুণের সংখ্যার চেয়ে পাঠকের গণনা করার অনুশীলন হিসাবে এটি রেখে দেওয়া হয়। বিভাজ্য কনভোলিউশনগুলি ছোট এবং অনেক বেশি গণনাগতভাবে কার্যকর।

হাতে-কলমে

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

c3df49e90e5a654f.png Keras Flowers transfer learning (playground).ipynb

লক্ষ্য: নির্ভুলতা > 95% (না, সিরিয়াসলি, এটা সম্ভব!)

এটি চূড়ান্ত অনুশীলন, এটির জন্য আরও কিছুটা কোড এবং ডেটা বিজ্ঞানের কাজ প্রয়োজন।

সূক্ষ্ম টিউনিং অতিরিক্ত তথ্য

এক্সসেপশন tf.keras.application-এ প্রি-প্রশিক্ষিত মডেলগুলিতে উপলব্ধ।* এই সময়ে সমস্ত ওজন প্রশিক্ষণযোগ্য রাখতে ভুলবেন না।

pretrained_model = tf.keras.applications.Xception(input_shape=[*IMAGE_SIZE, 3],
                                                  include_top=False)
pretrained_model.trainable = True

একটি মডেল ফাইন-টিউনিং করার সময় ভাল ফলাফল পেতে, আপনাকে শেখার হারের দিকে মনোযোগ দিতে হবে এবং একটি র‌্যাম্প-আপ পিরিয়ড সহ শেখার হারের সময়সূচী ব্যবহার করতে হবে। এই মত:

9b1af213b2b36d47.png

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

কেরাসে, শিক্ষার হার একটি কলব্যাকের মাধ্যমে নির্দিষ্ট করা হয় যেখানে আপনি প্রতিটি যুগের জন্য উপযুক্ত শিক্ষার হার গণনা করতে পারেন। কেরাস প্রতিটি যুগের জন্য অপ্টিমাইজারের কাছে সঠিক শিক্ষার হার পাস করবে।

def lr_fn(epoch):
  lr = ...
  return lr

lr_callback = tf.keras.callbacks.LearningRateScheduler(lr_fn, verbose=True)

model.fit(..., callbacks=[lr_callback])

সমাধান

এখানে সমাধান নোটবুক. আপনি আটকে থাকলে আপনি এটি ব্যবহার করতে পারেন।

c3df49e90e5a654f.png 07_Keras_Flowers_TPU_xception_fine_tuned_best.ipynb

আমরা কভার করেছি কি

  • 🤔 গভীরতা-বিভাজ্য কনভোলিউশন
  • 🤓 শেখার হারের সময়সূচী
  • 😈 একটি প্রাক-প্রশিক্ষিত মডেল ফাইন-টিউনিং।

আপনার মাথায় এই চেকলিস্টের মধ্য দিয়ে যাওয়ার জন্য অনুগ্রহ করে একটু সময় নিন।

9. অভিনন্দন!

আপনি আপনার প্রথম আধুনিক কনভোলিউশনাল নিউরাল নেটওয়ার্ক তৈরি করেছেন এবং এটিকে 90% + নির্ভুলতায় প্রশিক্ষিত করেছেন, TPU-কে ধন্যবাদ মাত্র কয়েক মিনিটের মধ্যে ধারাবাহিক প্রশিক্ষণের পুনরাবৃত্তি করে। এটি 4টি "কেরাস অন TPU কোডল্যাব" সমাপ্ত করে:

অনুশীলনে TPUs

ক্লাউড এআই প্ল্যাটফর্মে টিপিইউ এবং জিপিইউ পাওয়া যায়:

অবশেষে, আমরা প্রতিক্রিয়া পছন্দ করি। আপনি যদি এই ল্যাবে কিছু ভুল দেখেন বা আপনি যদি মনে করেন এটি উন্নত করা উচিত তাহলে অনুগ্রহ করে আমাদের বলুন৷ গিটহাব সমস্যার মাধ্যমে প্রতিক্রিয়া প্রদান করা যেতে পারে [ প্রতিক্রিয়া লিঙ্ক ]।

HR.png

Martin Görner ID small.jpg
লেখক: মার্টিন গোর্নার
টুইটার: @martin_gorner

tensorflow logo.jpg
www.tensorflow.org