Pytorch ব্যবহার করে Resnet-34 মডেল তৈরি করা - নতুনদের জন্য একটি গাইড

উত্স নোড: 1075632

এই নিবন্ধটি একটি অংশ হিসাবে প্রকাশিত হয়েছিল ডেটা সায়েন্স ব্লগাথন

ভূমিকা

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

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

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

অদৃশ্য গ্রেডিয়েন্ট সমস্যা Resnet-34
চিত্র 1

উপরে আলোচনা করা এই চিত্রটি আমাদের অদৃশ্য গ্রেডিয়েন্ট সমস্যা দেখায়। সিগময়েড ফাংশনগুলির ডেরিভেটিভগুলি 0.25 এর নীচে স্কেল-ডাউন করা হয় এবং গ্রেডিয়েন্টগুলি আপডেট করার সময় এটি প্রচুর তথ্য হারায়।

প্লেন নেটওয়ার্কের সমস্যা

সাধারণ নেটওয়ার্কের সাথে সমস্যা
চিত্র 2

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

Resnet-34 এর আর্কিটেকচার

Resnet-34 এর আর্কিটেকচার
চিত্র 3

প্রাথমিকভাবে, আমাদের একটি কনভোলিউশনাল লেয়ার আছে যেখানে 64টি ফিল্টার রয়েছে যার কার্নেল সাইজ 7×7 এটি হল প্রথম আবর্তন, তারপর একটি সর্বোচ্চ-পুলিং স্তর দ্বারা অনুসরণ করা হয়. আমরা স্ট্রাইড হিসাবে নির্দিষ্ট আছে 2 উভয় ক্ষেত্রেই. পরবর্তী, মধ্যে conv2_x আমাদের পুলিং লেয়ার এবং নিম্নলিখিত কনভোল্যুশন লেয়ার রয়েছে। এই স্তরগুলি সাধারণত জোড়ায় গোষ্ঠীবদ্ধ হয় কারণ অবশিষ্টাংশগুলি যেভাবে সংযুক্ত থাকে (তীরগুলি দেখায় যে প্রতি দুটি স্তরে লাফানো হয়)।

এখানে, আমাদের কাছে 2টি স্তর রয়েছে যার একটি কার্নেল_সাইজ 3×3, 64-এর num_filters, এবং এগুলি সবই পুনরাবৃত্তি করা x3, যা পুল,/2 এবং ফিল্টার 128টি, মোট 6টি স্তর (একটি জোড়া বার 3)। এই 2টি স্তর হল 3×3 এর kernel_size, num_filters হল 128, এবং এগুলোও পুনরাবৃত্তি হয় কিন্তু এই সময়ে 4. এটি avg_pooling এবং softmax ফাংশন পর্যন্ত চলতে থাকে। প্রতিবার ফিল্টারের সংখ্যা দ্বিগুণ হয়ে গেলে আমরা প্রথম স্তরটি নির্দিষ্ট করে দেখতে পারি num_filters/2.

Pytorch-এ Resnet-34 সংজ্ঞায়িত করার জন্য কোড:

ক্লাস ResNet34(nn.Module): def __init__(self): super(ResNet34,self).__init__() self.block1 = nn.Sequential( nn.Conv2d(1,64,kernel_size=2,stride=2,padding= 3,bias=False), nn.BatchNorm2d(64), nn.ReLU(True) ) self.block2 = nn.Sequential( nn.MaxPool2d(1,1), ResidualBlock(64,64), ResidualBlock(64,64,2) ,3) ) self.block64,128 = nn.Sequential( ResidualBlock(128,128,2), ResidualBlock(4) ) self.block128,256 = nn.Sequential( ResidualBlock(256,256,2), ResidualBlock(5) self.256,512 ) অনুক্রমিক( অবশিষ্ট ব্লক(512,512,2), অবশিষ্ট ব্লক(2) ) self.avgpool = nn.AvgPool2d(1) # vowel_diacritic self.fc512,11 = nn.Linear(2) # grapheme_root = self.512,168,L3,L512,7 # consonant_diacritic self.fc1 = nn.Linear(2) def forward(self,x): x = self.block3(x) x = self.block4(x) x = self.block5(x) x = self। block0(x) x = self.block1(x) x = self.avgpool(x) x = x.view(x.size(1),-1) x2 = self.fc2(x) x3 = self.fc3( x) x1 = self.fc2(x) রিটার্ন x3,xXNUMX,xXNUMX

এই কোডটি আমাদের Resnet-34-এর জন্য একটি মডিউলের সম্পূর্ণ বাস্তবায়ন দেয়। এখন আসুন প্রতিটি লাইন কীভাবে কাজ করে তা বোঝার গভীরে ডুব দেওয়া যাক। এর জন্য আসুন আমরা আগে দেখেছি স্থাপত্যটিকে সংক্ষিপ্ত করা যাক। নীচের 34টি স্তরযুক্ত চিত্র দেখুন।

কোডের আউটপুট
চিত্র 4

আমরা দেখতে পাচ্ছি যে আমাদের 5টি ব্লকে যেকোনো Resnet আর্কিটেকচার বাস্তবায়ন করতে হবে। প্রথম ব্লকে 64 এর স্ট্রাইড সহ 2টি ফিল্টার রয়েছে। তারপরে 2 এর সাথে সর্বাধিক-পুলিং করা হয়েছে। আর্কিটেকচারটি 3 এর প্যাডিং ব্যবহার করে। যেহেতু অভ্যন্তরীণ কোভেরিয়েট শিফটের একটি সুযোগ রয়েছে আমাদের ব্যাচ স্বাভাবিককরণের মাধ্যমে নেটওয়ার্কটিকে স্থিতিশীল করতে হবে। আমরা শেষে ReLU অ্যাক্টিভেশন ব্যবহার করি। প্রথম ব্লকটি যেকোনো আর্কিটেকচারের জন্য একই এবং বাকি ব্লকগুলি বিভিন্ন স্তরের জন্য পরিবর্তিত হয় এবং একটি নির্দিষ্ট প্যাটার্নে পুনরাবৃত্তি হয়। 1 ম ব্লক এইভাবে প্রয়োগ করা যেতে পারে:

nn.Conv2d(1,64,kernel_size=2,stride=2,padding=3,bias=False),
nn.BatchNorm2d(64),
nn.ReLU(True)

এই মুহুর্তে, আমাদের একটি স্কিপ সংযোগ আছে। যা অবশিষ্ট নেটওয়ার্কের মূল ধারণা। আমরা আগে যে আর্কিটেকচার ডায়াগ্রামটি দেখেছি তাতে বিন্দুযুক্ত এবং গাঢ় তীরগুলির সাথে সংযোগগুলি বাদ দেওয়া হয়েছে৷ বিন্দুযুক্ত লাইন হল এখানে যা ঘটছে কারণ আমরা আগেরটির চেয়ে বেশি আকারের একটি চ্যানেলে চলে যাচ্ছি। দ্বিতীয় ব্লকে 1 * 1 কার্নেলের আকার সহ 3 * 3 এর একটি প্রাথমিক সর্বোচ্চ পুল এবং নীচের কোডে দেখানো দুটি অবশিষ্ট ব্লকের বাস্তবায়ন রয়েছে। এই দুটি ইনপুট এবং আউটপুট চ্যানেল হিসাবে 64 গ্রহণ করে এবং আর্কিটেকচারে দেখানো হিসাবে 3 বার পুনরাবৃত্তি হয়। শেষ পর্যন্ত, শেষটি পরবর্তী ব্লকের সাথে 2 এর স্ট্রাইডের সাথে সংযুক্ত করা হয়েছে।

nn.MaxPool2d(1,1), ResidualBlock(64,64), ResidualBlock(64,64,2)

শেষ ব্লকের বিষয়বস্তুটি 3 বার পুনরাবৃত্তি হয়েছে এবং আমরা নির্দেশ করেছি যে আর্কিটেকচার ডায়াগ্রামে অন্ধকার তীর এবং ইনপুট এবং আউটপুট চ্যানেলের আকার একই থাকে। আর্কিটেকচার ডায়াগ্রামে দেখানো '/2' আমাদের ব্যবহৃত স্ট্রাইড সম্পর্কে বলে।

তৃতীয় ব্লকটি 3 * 3 এর কার্নেল আকার নেয় এবং 64 এর শেষ ব্লক থেকে একটি ইনপুট চ্যানেল আসে এবং 128 এর একটি আউটপুট চ্যানেল দেয়। তারপর আমরা একই 128 ইনপুট হিসাবে এবং 128 কে আউটপুট চ্যানেল হিসাবে নিই। আগের আর্কিটেকচার ডায়াগ্রামে দেখানো হিসাবে আমরা এটি 4 বার পুনরাবৃত্তি করি।

অবশিষ্ট ব্লক(64,128), অবশিষ্ট ব্লক(128,128,2)

একইভাবে, আমরা আমাদের 4র্থ এবং 5ম ব্লক তৈরি করি যার কার্নেলের আকার 256 এবং 512 আছে।

অবশিষ্ট ব্লক(128,256), অবশিষ্ট ব্লক(256,256,2)
অবশিষ্ট ব্লক(256,512), অবশিষ্ট ব্লক(512,512,2)

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

উপসংহার:

রেফারেন্স:

  1. https://www.kaggle.com/khoongweihao/resnet-34-pytorch-starter-kit
  2. https://datascience.stackexchange.com/questions/33022/how-to-interpert-resnet50-layer-types

আমার সম্পর্কে: আমি গভীর শিক্ষা এবং প্রাকৃতিক ভাষা প্রক্রিয়াকরণের ক্ষেত্রে আগ্রহী একজন গবেষণা ছাত্র এবং বর্তমানে কৃত্রিম বুদ্ধিমত্তায় স্নাতকোত্তর অনুসরণ করছি।

চিত্র উত্স

  1. ছবি 1,2: https://towardsdatascience.com/the-vanishing-gradient-problem-69bf08b15484
  2. ছবি 3,4: https://datascience.stackexchange.com/questions/33022/how-to-interpert-resnet50-layer-types
  3. পূর্বরূপ চিত্র: https://www.zdnet.com/pictures/10-cool-robots-at-this-years-robobusiness-conference/2/

আমার সাথে সংযোগ করতে নির্দ্বিধায়:

  1. লিঙ্কডইন: https://www.linkedin.com/in/siddharth-m-426a9614a/
  2. Github: https://github.com/Siddharth1698

ResNet-34-এর এই নিবন্ধে দেখানো মিডিয়া Analytics বিদ্যার মালিকানাধীন নয় এবং লেখকের বিবেচনার ভিত্তিতে ব্যবহার করা হয়।

সূত্র: https://www.analyticsvidhya.com/blog/2021/09/building-resnet-34-model-using-pytorch-a-guide-for-beginners/

সময় স্ট্যাম্প:

থেকে আরো বিশ্লেষণ বিদ্যা