Polkadot মূল্য বিশ্লেষণ 13 সেপ্ট

কনভোলিউশনাল নিউরাল নেটওয়ার্ক-সিআইএফএআর -10 ডেটাসেটে পাই-টর্চ বাস্তবায়ন

উত্স নোড: 1866263

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

ভূমিকা

সিফার 10 | কনভোল্যুশনাল নিউরাল নেটওয়ার্ক পাইটর্চ
                                    চিত্র 1

কনভোল্যুশনাল নিউরাল নেটওয়ার্ক, যাকে কনভনেটও বলা হয়, প্রথম 1980-এর দশকে ইয়ান লেকুন, একজন কম্পিউটার বিজ্ঞান গবেষক যিনি পটভূমিতে কাজ করেছিলেন, দ্বারা প্রবর্তন করা হয়েছিল। LeCun একজন জাপানি বিজ্ঞানী কুনিহিকো ফুকুশিমার কাজের উপর নির্মিত, ছবি স্বীকৃতির জন্য একটি মৌলিক নেটওয়ার্ক।

CNN-এর পুরানো সংস্করণ, LeNet নামে পরিচিত (LeCun পরে), হাতে লেখা অঙ্ক দেখতে পারে। সিএনএন পোস্টাল থেকে পিন কোড খুঁজে পেতে সাহায্য করে। কিন্তু তাদের দক্ষতা থাকা সত্ত্বেও, ConvNets কম্পিউটার দৃষ্টি এবং কৃত্রিম বুদ্ধিমত্তার কাছাকাছি ছিল কারণ তারা একটি বড় সমস্যার সম্মুখীন হয়েছিল: তারা খুব বেশি মাপতে পারেনি। CNN-এর প্রচুর ডেটার প্রয়োজন হয় এবং বড় ছবিগুলির জন্য ভালভাবে কাজ করার জন্য সংস্থানগুলিকে একীভূত করে৷

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

কনভোল্যুশনাল নিউরাল নেটওয়ার্ক পাইটর্চ
চিত্র 2

উপরের চিত্রটি আমাদের একটি CNN মডেল দেখায় যা 2-এর মতো একটি অঙ্কের চিত্র নেয় এবং আমাদেরকে একটি সংখ্যা হিসাবে চিত্রটিতে কোন সংখ্যাটি দেখানো হয়েছিল তার ফলাফল দেয়৷ আমরা এই নিবন্ধে এটি কিভাবে পেতে বিস্তারিত আলোচনা করা হবে.

CIFAR-10 হল একটি ডেটাসেট যাতে 10টি ভিন্ন শ্রেণীর চিত্রের সংগ্রহ রয়েছে। এই ডেটাসেটটি গবেষণার উদ্দেশ্যে বিভিন্ন মেশিন লার্নিং মডেল পরীক্ষা করার জন্য এবং বিশেষ করে কম্পিউটার দৃষ্টি সমস্যার জন্য ব্যাপকভাবে ব্যবহৃত হয়। এই নিবন্ধে, আমরা Pytorch ব্যবহার করে একটি নিউরাল নেটওয়ার্ক মডেল তৈরি করার চেষ্টা করব এবং এটিকে CIFAR-10 ডেটাসেটে পরীক্ষা করব যাতে ভবিষ্যদ্বাণীর সঠিকতা পাওয়া যায়।

পাইটর্চ লাইব্রেরি আমদানি করা হচ্ছে 

np হিসাবে numpy আমদানি করুন, pd হিসাবে পান্ডা আমদানি করুন
টর্চ ইমপোর্ট torch.nn.ফাংশনাল টর্চভিশন ইম্পোর্ট ডেটাসেট থেকে F হিসাবে, টর্চ ইম্পোর্ট থেকে ট্রান্সফর্মস nn ইম্পোর্ট matplotlib.pyplot plt ইম্পোর্ট numpy হিসাবে np ইম্পোর্ট সিবোর্ন হিসাবে sns #from tqdm. নোটবুক tqdm থেকে tqdm আমদানি করুন

এই ধাপে, আমরা প্রয়োজনীয় লাইব্রেরি আমদানি করি। আমরা দেখতে পাচ্ছি আমরা সংখ্যাসূচক অপারেশনের জন্য NumPy ব্যবহার করি এবং ডাটা ফ্রেম অপারেশনের জন্য পান্ডা ব্যবহার করি। টর্চ লাইব্রেরি Pytorch আমদানি করতে ব্যবহৃত হয়।

Pytorch এর একটি nn উপাদান রয়েছে যা মেশিন লার্নিং অপারেশন এবং ফাংশনগুলির বিমূর্তকরণের জন্য ব্যবহৃত হয়। এটি F হিসাবে আমদানি করা হয়। টর্চভিশন লাইব্রেরি ব্যবহার করা হয় যাতে আমরা CIFAR-10 ডেটাসেট আমদানি করতে পারি। এই লাইব্রেরিতে অনেক ইমেজ ডেটাসেট রয়েছে এবং এটি গবেষণার জন্য ব্যাপকভাবে ব্যবহৃত হয়। রূপান্তরগুলি আমদানি করা যেতে পারে যাতে আমরা সমস্ত চিত্রের জন্য চিত্রটিকে সমান আকারে পুনরায় আকার দিতে পারি। tqdm ব্যবহার করা হয় যাতে আমরা প্রশিক্ষণের সময় অগ্রগতির ট্র্যাক রাখতে পারি এবং ভিজ্যুয়ালাইজেশনের জন্য ব্যবহার করা হয়।

প্রয়োজনীয় ডেটাসেট পড়ুন

trainData = pd.read_csv('cifar-10/trainLabels.csv') trainData.head()

একবার আমরা ডেটাসেটটি পড়লে আমরা ব্যাঙ, ট্রাক, হরিণ, অটোমোবাইল ইত্যাদির মতো বিভিন্ন লেবেল দেখতে পাব।

PyTorch দিয়ে ডেটা বিশ্লেষণ করা হচ্ছে

প্রিন্ট("বিন্দুর সংখ্যা:",trainData.shape[0]) প্রিন্ট ("বৈশিষ্ট্যের সংখ্যা:",trainData.shape[1]) প্রিন্ট ("বৈশিষ্ট্য:",trainData.columns.values) প্রিন্ট ("সংখ্যা ট্রেনডেটাতে কলের জন্য অনন্য মান"): print(col,":",len(trainData[col].unique())) plt.figure(figsize=(12,8))

আউটপুট:

পয়েন্ট সংখ্যা: 50000 বৈশিষ্ট্যের সংখ্যা: 2 বৈশিষ্ট্য: ['আইডি' 'লেবেল'] অনন্য মানগুলির সংখ্যা আইডি : 50000 লেবেল : 10

এই ধাপে, আমরা ডেটাসেট বিশ্লেষণ করি এবং দেখি যে আমাদের ট্রেনের ডেটাতে তাদের আইডি এবং সংশ্লিষ্ট লেবেল সহ প্রায় 50000 সারি রয়েছে। CIFAR-10 নামে মোট 10টি ক্লাস রয়েছে।

PyTorch ব্যবহার করে বৈধতা সেট করা হচ্ছে

torch.utils.data থেকে আমদানি random_split val_size = 5000 train_size = len(dataset) - val_size train_ds, val_ds = random_split(dataset, [train_size, val_size]) len(train_ds), len(val_ds)

এই ধাপটি প্রশিক্ষণের ধাপের মতোই, তবে আমরা ডেটাকে ট্রেন এবং বৈধতা সেটে বিভক্ত করতে চাই।

(45000, 5000)
torch.utils.data.dataloader থেকে DataLoader batch_size=64 train_dl = DataLoader(train_ds, batch_size, shuffle=True, num_workers=4, pin_memory=True) val_dl = DataLoader(val_dl=DataLoader(s_dl=batch_size, batch_size=4,)

torch.utils-এ একটি ডেটা লোডার রয়েছে যা কর্মী নম্বর বা ব্যাচের আকারের মতো বিভিন্ন প্যারামগুলিকে বাইপাস করে প্রয়োজনীয় ডেটা লোড করতে আমাদের সাহায্য করতে পারে।

প্রয়োজনীয় ফাংশন সংজ্ঞায়িত করা

@torch.no_grad() def নির্ভুলতা(আউটপুট, লেবেল): _, preds = torch.max(outputs, dim=1) return torch.tensor(torch.sum(preds == labels).item() / len(preds )) class ImageClassificationBase(nn.Module): def training_step(self, batch): images, labels = batch out = self(images) # Generate predictions loss = F.cross_entropy(out, labels) # হিসেব করুন ক্ষতি = accuracy(out) ,লেবেল) রিটার্ন লস,accu def validation_step(self, batch): images, labels = batch out = self(images) # Generate predictions loss = F.cross_entropy(out, labels) # ক্ষতি গণনা করুন acc = নির্ভুলতা(আউট, লেবেল) # নির্ভুলতা রিটার্ন হিসাব করুন {'লস': loss.detach(), 'Accuracy': acc} def validation_epoch_end(self, outputs): batch_losses = [x['Loss'] for x in outputs] epoch_loss = torch.stack(batch_losses) .mean() # আউটপুটগুলিতে x এর জন্য ক্ষতিগুলি ব্যাচ_accs = [x['Accuracy'] একত্রিত করুন] epoch_acc = torch.stack(batch_accs).mean() # একত্রিত নির্ভুলতা রিটার্ন {'লস': epoch_loss.item(), ' সঠিকতা': epoch_acc.item()} def epoch_end(self, epoch, result): pr int("Epoch :", epoch + 1) print(f'Train Accuracy:{result["train_accuracy"]*100:.2f}% যাচাইকরণ নির্ভুলতা:{result["Accuracy"]*100:.2f}%' ) প্রিন্ট (f'ট্রেন লস:{ফলাফল["ট্রেন_লস"]:.4f} বৈধতা ক্ষতি:{ফলাফল["ক্ষতি"]:.4f}')

যেমনটি আমরা দেখতে পাচ্ছি এখানে আমরা ImageClassification এর ক্লাস ইমপ্লিমেন্টেশন ব্যবহার করেছি এবং এটি একটি প্যারামিটার নেয় যা হল nn.Module। এই ক্লাসের মধ্যে, আমরা বিভিন্ন ফাংশন বা বিভিন্ন ধাপ যেমন প্রশিক্ষণ, যাচাইকরণ ইত্যাদি বাস্তবায়ন করতে পারি। এখানে ফাংশনগুলি হল সাধারণ পাইথন বাস্তবায়ন।

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

কনভোলিউশনাল নিউরাল নেটওয়ার্ক মডিউল বাস্তবায়ন

ক্লাস Cifar10CnnModel(ImageClassificationBase): def __init__(self): super().__init__() self.network = nn.Sequential( nn.Conv2d(3, 32, kernel_size=3, padding=1), nn.ReLU(), nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1), nn.ReLU(), nn.MaxPool2d(2, 2), # আউটপুট: 64 x 16 x 16 nn.BatchNorm2d(64) , nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1), nn.ReLU(), nn.Conv2d(128, 128, kernel_size=3, স্ট্রাইড=1, প্যাডিং=1), nn .ReLU(), nn.MaxPool2d(2, 2), # আউটপুট: 128 x 8 x 8 nn.BatchNorm2d(128), nn.Conv2d(128, 256, kernel_size=3, স্ট্রাইড=1, প্যাডিং=1), nn.ReLU(), nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1), nn.ReLU(), nn.MaxPool2d(2, 2), # আউটপুট: 256 x 4 x 4 nn.BatchNorm2d(256), nn.Flatten(), nn.Linear(256*4*4, 1024), nn.ReLU(), nn.Linear(1024, 512), nn.ReLU(), nn.লিনিয়ার (512, 10)) ডেফ ফরোয়ার্ড(সেল্ফ, এক্সবি): স্বয়ং নেটওয়ার্ক (এক্সবি) ফেরত দিন

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

32 হল প্রাথমিক আউটপুট চ্যানেলের আকার এবং আমরা যখন পরবর্তী conv2d লেয়ারে যাই তখন আমাদের কাছে এই 32টি ইনপুট চ্যানেল হিসেবে এবং 64টি আউটপুট চ্যানেল হিসেবে থাকবে।

প্রথম লাইনের 3য় প্যারামিটারটিকে কার্নেল আকার বলা হয় এবং এটি আমাদের ব্যবহৃত ফিল্টারগুলির যত্ন নিতে সাহায্য করে। প্যাডিং অপারেশন শেষ পরামিতি।

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

মডেল প্রশিক্ষণ

@torch.no_grad() def evaluate(model, data_loader): model.eval() outputs = [model.validation_step(batch) in data_loader] return model.validation_epoch_end(outputs) def fit(model, train_loader, val_loader,epochs) =10,learning_rate=0.001): best_valid = None history = [] optimizer = torch.optim.Adam(model.parameters(), learning_rate,weight_decay=0.0005) পরিসরে যুগের জন্য (epochs): # Training Fase model.train( ) train_losses = [] train_accuracy = [] tqdm(train_loader) ব্যাচের জন্য: loss,accu = model.training_step(batch) train_losses.append(loss) train_accuracy.append(accu) loss.backward() optimizer.step() অপ্টিমাইজার .zero_grad() # বৈধকরণ পর্বের ফলাফল = মূল্যায়ন(মডেল, ভাল_লোডার) ফলাফল['train_loss'] = torch.stack(train_losses).mean().item() ফলাফল['train_accuracy'] = torch.stack(train_accuracy)। গড়
ইতিহাস = ফিট (মডেল, ট্রেন_ডিএল, ভ্যাল_ডিএল)

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

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

ফলাফল প্লট করা

এই ধাপে, আমরা প্রতিটি যুগের মধ্যে নির্ভুলতাকে কল্পনা করব। আমরা লক্ষ্য করতে পারি যে যুগ বাড়ার সাথে সাথে সিস্টেমের নির্ভুলতা বাড়তে থাকে এবং একইভাবে ক্ষতিও কমতে থাকে। এখানে লাল রেখাটি প্রশিক্ষণের ডেটা অগ্রগতি নির্দেশ করে এবং যাচাইকরণের জন্য নীল। আমরা দেখতে পাচ্ছি যে আমাদের ফলাফলগুলিতে প্রচুর পরিমাণে ওভারফিটিং হয়েছে কারণ প্রশিক্ষণের ডেটা বৈধকরণের ফলাফলের থেকে বেশ ভাল এবং একইভাবে ক্ষতির ক্ষেত্রেও। 10টি যুগের পরে, ট্রেনের ডেটা 90% নির্ভুলতাকে বাইপাস করে বলে মনে হচ্ছে কিন্তু প্রায় 0.5 এর ক্ষতি হয়েছে। পরীক্ষার ডেটা প্রায় 81% আসে এবং ক্ষতি 0.2 এর কাছাকাছি।

def plot_accuracy(history): Validation_accuracies = [x['Accuracy'] ইতিহাসে x এর জন্য] Training_Accuracies = [x['train_accuracy'] ইতিহাসে x এর জন্য] plt.plot(Training_Accuracies, '-rx') plt.plot(Validation_acuracies) , '-bx') plt.xlabel('epoch') plt.ylabel('নির্ভুলতা') plt.legend(['প্রশিক্ষণ', 'বৈধতা']) plt.title ('নির্ভুলতা বনাম যুগের সংখ্যা') ; প্লট_সঠিকতা (ইতিহাস)
নির্ভুলতা প্লট
def plot_losses(history): train_losses = [x.get('train_loss') for x in history] val_losses = [x['Loss'] in history] plt.plot(train_losses, '-bx') plt.plot (val_losses, '-rx') plt.xlabel('epoch') plt.ylabel('loss') plt.legend(['Training', 'validation']) plt.title('লস বনাম যুগের সংখ্যা '); প্লট_ক্ষতি (ইতিহাস)

test_dataset = ImageFolder(data_dir+'/test', transform=ToTensor()) test_loader = DeviceDataLoader(DataLoader(test_dataset, batch_size), ডিভাইস) ফলাফল = মূল্যায়ন(ফাইনাল_মডেল, টেস্ট_লোডার) প্রিন্ট(f'Test Accuracy:"{ccuracy:" ]*100:.2f}%')
পরীক্ষার নির্ভুলতা: 81.07%

আমরা দেখতে পাচ্ছি যে আমরা 81.07% এর নির্ভুলতার সাথে শেষ করেছি।

উপসংহার:

ভাবমূর্তি:https://unsplash.com/photos/5L0R8ZqPZHk

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

চিত্র উত্স

  1. Image 1: https://becominghuman.ai/cifar-10-image-classification-fd2ace47c5e8
  2. ছবি 2: https://www.analyticsvidhya.com/blog/2021/05/convolutional-neural-networks-cnn/

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

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

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

সূত্র: https://www.analyticsvidhya.com/blog/2021/09/convolutional-neural-network-pytorch-implementation-on-cifar10-dataset/

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

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