এতে আমরা PyTorch ব্যবহার করে MNIST ডেটাসেট ব্যবহার করে হাতে লেখা ডিজিট ক্লাসিফায়ার চিনতে CNN-কে প্রশিক্ষণ দিতে যাচ্ছি।
MNIST হস্তলিখিত শ্রেণীবিভাগের টাস্কের জন্য একটি বহুল ব্যবহৃত ডেটাসেট যা হস্তলিখিত সংখ্যার 28*28 পিক্সেল গ্রেস্কেল চিত্রের লেবেলযুক্ত 70k এরও বেশি কভার করে। ডেটাসেটে প্রায় 60k প্রশিক্ষণের ছবি এবং 10k পরীক্ষার ছবি রয়েছে। আমাদের কাজ হল 60k ট্রেনিং ইমেজ ব্যবহার করে একটি মডেলকে প্রশিক্ষণ দেওয়া এবং পরবর্তীতে 10k পরীক্ষার ইমেজে এর শ্রেণীবিন্যাস নির্ভুলতা পরীক্ষা করা।
ইনস্টলেশন
প্রথমে আমাদের প্রয়োজন MXNet সর্বশেষ সংস্করণ, তার জন্য আপনার টার্মিনালে নিম্নলিখিতটি চালান:
$pip mxnet ইনস্টল করুন
এবং আপনি এরকম কিছু করবেন,
সংগ্রহ করা mxnetDownloading https://files.pythonhosted.org/packages/60/6f/071f9ef51467f9f6cd35d1ad87156a29314033bbf78ad862a338b9eaf2e6/mx.1462a338b9eaf2e6/mx.12-188b. ███████████████████████████ | 12.8MB 131kB/s প্রয়োজনীয়তা ইতিমধ্যেই সন্তুষ্ট:numpy in c:\python\python361\lib\site-packages (mxnet থেকে) (1.16.0)গ্রাফভিজ সংগ্রহ করা (mxnet থেকে) https://files.python/orgpackages/ডাউনলোড করা হচ্ছে। 1f/e2/ef2581b5b86625657afd32030f90cf2717456c1d2b711ba074bf007c0f1a/graphviz-0.10.1-py2.py3-none-any.whl....uccess...m/2.py3-none-any.whl...uccess...m.2.0.x.1গ্রাফি গ্রাফ ইনস্টল করা হচ্ছে।দ্বিতীয়ত, আমাদের টর্চ এবং টর্চভিশন লাইব্রেরি দরকার- যদি এটি এমন না হয় যেখানে আপনি পিপ ব্যবহার করে এটি ইনস্টল করতে পারেন।
লাইব্রেরি আমদানি করুন
টর্চিমপোর্ট টর্চভিশন আমদানি করুনMNIST ডেটাসেট লোড করুন
আমরা আমাদের প্রোগ্রামে কাজ শুরু করার আগে, আমাদের MNIST ডেটাসেট প্রয়োজন। তাই আসুন মেমরিতে চিত্র এবং লেবেলগুলি লোড করি এবং এই পরীক্ষার জন্য আমরা যে হাইপারপ্যারামিটারগুলি ব্যবহার করব তা সংজ্ঞায়িত করি৷
#n_epochs হল সংখ্যার সংখ্যা, আমরা সম্পূর্ণ প্রশিক্ষণ ডেটাসেটন_epochs =3batch_size_train =64batch_size_test =1000#Learning_rate এবং মোমেন্টামের জন্য লুপ করব opimizerlearning_rate =0.01momentum =0.5_dtorn_backs =0.5.01 মোমেন্টাম। =Falsetorch.manual_seed(random_seed)এখন আমরা TorchVision ব্যবহার করে MNIST ডেটাসেট লোড করতে যাচ্ছি। আমরা প্রশিক্ষণের জন্য ব্যাচ_সাইজ 64 এবং এই ডেটাসেটে পরীক্ষার জন্য 1000 আকার ব্যবহার করছি। স্বাভাবিককরণের জন্য, আমরা 0.1307 এর গড় মান এবং MNIST ডেটাসেটের 0.3081 এর মান বিচ্যুতি ব্যবহার করব।
train_loader =torch.utils.data.DataLoader( torchvision.datasets.MNIST('/files/', train=True, download=True, transform=torchvision.transforms.Compose([ torchvision.transforms.ToTensor(), torchvision.transforms.Normalize( (0.1307,), (0.3081,)) ]) ), batch_size=batch_size_train, shuffle=True)test_loader =torch.utils.data.DataLoader( torchvision.datasets.MNIST'('/'/ train=False, download=True, transform=torchvision.transforms.Compose([ torchvision.transforms.ToTensor(), torchvision.transforms.Normalize((0.1307,), (0.3081,)) ]) ),batch_size=batch_size_test, shuffle =সত্য)আউটপুট
ডাউনলোড হচ্ছে https://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gzডাউনলোড হচ্ছে https://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gzডাউনলোড হচ্ছে https://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gzডাউনলোড হচ্ছে https://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gzProcessing... সম্পন্ন !পরীক্ষার ডেটা লোড করতে test_loader ব্যবহার করুন
examples =enumerate(test_loader)batch_idx, (example_data, example_targets) =next(examples)example_data.shapeআউটপুট
টর্চ। সাইজ([1000, 1, 28, 28])সুতরাং আউটপুট থেকে আমরা দেখতে পাচ্ছি যে আমাদের কাছে একটি টেস্ট ডেটা ব্যাচ আছে আকৃতির একটি টেনসর:[1000, 1, 28, 28] মানে- গ্রেস্কেলে 28*28 পিক্সেলের 1000 উদাহরণ।
matplotlib ব্যবহার করে কিছু ডেটাসেট প্লট করা যাক।
matplotlib.pyplot ইম্পোর্ট করুন pltfig =plt.figure() এর জন্য i রেঞ্জ(5):plt.subplot(2,3,i+1)plt.tight_layout()plt.imshow(example_data[i][0 ], cmap='gray', interpolation='none')plt.title("গ্রাউন্ড ট্রুথ:{}".format(example_targets[i]))plt.xticks([])plt.yticks([])print( ডুমুর)আউটপুট
নেটওয়ার্ক তৈরি করা
এখন আমরা আমাদের নেটওয়ার্ক তৈরি করতে যাচ্ছি 2-D কনভোলিউশনাল লেয়ার ব্যবহার করে যার পরে দুটি সম্পূর্ণ-সংযুক্ত স্তর। আমরা যে নেটওয়ার্কটি তৈরি করতে চাই তার জন্য আমরা একটি নতুন ক্লাস তৈরি করতে যাচ্ছি তবে তার আগে কিছু মডিউল আমদানি করা যাক৷
nnimport torch হিসাবে torch.nn আমদানি করুন। Conv2d(1, 10, kernel_size=5) self.conv2 =nn.Conv2d(10, 20, kernel_size=5) self.conv2_drop =nn.Dropout2d() self.fc1 =nn.Linear(320, 50) self.fc2 =nn.Linear(50, 10) def forward(self, x):x =F.relu(F.max_pool2d(self.conv1(x), 2)) x =F.relu(F.max_pool2d(self.conv2_drop) (self.conv2(x)), 2)) x =x.view(-1, 320) x =F.relu(self.fc1(x)) x =F.dropout(x, training=self.training) x =self.fc2(x)রিটার্ন F.log_softmax(x)
নেটওয়ার্ক এবং অপ্টিমাইজার শুরু করুন:
নেটওয়ার্ক =Net()অপ্টিমাইজার =optim.SGD(network.parameters(), lr =learning_rate,momentum =ভরবেগ)
মডেল প্রশিক্ষণ
আমাদের প্রশিক্ষণ মডেল তৈরি করা যাক. তাই প্রথমে চেক করুন আমাদের নেটওয়ার্ক নেটওয়ার্ক মোডে আছে এবং তারপর প্রতি যুগে একবার সামগ্রিক প্রশিক্ষণের ডেটা ইন্টারেট করুন। ডেটালোডার পৃথক ব্যাচ লোড করবে। আমরা optimizer.zero_grad()
ব্যবহার করে গ্রেডিয়েন্ট শূন্যে সেট করিtrain_losses =[]train_counter =[]test_losses =[]test_counter =[i*len(train_loader.dataset) in range(n_epochs + 1)]
একটি সুন্দর প্রশিক্ষণ বক্ররেখা তৈরি করতে, আমরা প্রশিক্ষণ এবং পরীক্ষার ক্ষতি সংরক্ষণের জন্য দুটি তালিকা তৈরি করি। x-অক্ষে আমরা প্রশিক্ষণের উদাহরণের সংখ্যা প্রদর্শন করতে চাই।
ব্যাকওয়ার্ড() কলটি আমরা এখন গ্রেডিয়েন্টের একটি নতুন সেট সংগ্রহ করি যা আমরা optimizer.step() ব্যবহার করে নেটওয়ার্কের প্রতিটি প্যারামিটারে আবার প্রচার করি।
def train(epoch):network.train() batch_idx, (data, target) in enumerate(train_loader):optimizer.zero_grad() output =network(data) loss =F.nll_loss(আউটপুট, টার্গেট) ক্ষতি .backward() optimizer.step() if batch_idx % log_interval ==0:print('Train Epoch:{} [{}/{} ({:.0f}%)]\tলস:{:.6f}'। বিন্যাস( epoch, batch_idx * len(data), len(train_loader.dataset), 100. * batch_idx / len(train_loader), loss.item()) train_losses.append(loss.item()) train_counter.append(( batch_idx*64) + ((epoch-1)*len(train_loader.dataset))) torch.save(network.state_dict(), '/results/model.pth') torch.save(optimizer.state_dict(), ' /results/optimizer.pth')
নিরপেক্ষ নেটওয়ার্ক মডিউল, সেইসাথে অপ্টিমাইজার, .state_dict() ব্যবহার করে তাদের অভ্যন্তরীণ অবস্থা সংরক্ষণ এবং লোড করার ক্ষমতা রাখে।
এখন আমাদের পরীক্ষার লুপের জন্য, আমরা পরীক্ষার ক্ষতির সমষ্টি করি এবং নেটওয়ার্কের নির্ভুলতা গণনা করার জন্য সঠিকভাবে শ্রেণীবদ্ধ অঙ্কগুলির ট্র্যাক রাখি।
def test():network.eval() test_loss =0 correct =0 with torch.no_grad():ডেটার জন্য, test_loader-এ লক্ষ্য:output =network(data) test_loss +=F.nll_loss(আউটপুট, লক্ষ্য, size_average=False).item() pred =output.data.max(1, keepdim=True)[1] সঠিক +=pred.eq(target.data.view_as(pred)).sum() test_loss /=len( test_loader.dataset) test_losses.append(test_loss) প্রিন্ট('\nপরীক্ষা সেট:গড় ক্ষতি:{:.4f}, নির্ভুলতা:{}/{} ({:.0f}%)\n'.ফর্ম্যাট( test_loss, সঠিক, len(test_loader.dataset), 100. * correct / len(test_loader.dataset)))
প্রশিক্ষণ চালানোর জন্য, এলোমেলোভাবে শুরু করা পরামিতিগুলির সাথে আমাদের মডেলের মূল্যায়ন করতে আমরা n_epochs-এ লুপ করার আগে একটি পরীক্ষা() কল যোগ করি।
পরীক্ষাআউটপুট
<প্রি>পরীক্ষা সেট:গড় ক্ষতি:2.3048, নির্ভুলতা:1063/10000 (10%)ট্রেন যুগ:1 [0/60000 (0%)]ক্ষতি:2.294911ট্রেন যুগ:1 [640/60000 (1%)]ক্ষতি:2.35 ইইরা 1280/60000 (2%)]ক্ষতি:2.290719ট্রেন যুগ:1 [1920/60000 (3%)]ক্ষতি:2.294191ট্রেন যুগ:1 [2560/60000 (4%)]ক্ষতি:96/2019 ইপিও 60000 (5%)]ক্ষতি:2.292224ট্রেন যুগ:1 [3840/60000 (6%)]ক্ষতি:2.216632ট্রেন যুগ:1 [4480/60000 (7%)]ক্ষতি:2.259664010T/501640T 9%)]ক্ষতি:2.244781ট্রেন যুগ:1 [5760/60000 (10%)]ক্ষতি:2.245569ট্রেন যুগ:1 [6400/60000 (11%)]ক্ষতি:2.203358:160000000 (10%) )]ক্ষতি:2.192290ট্রেন যুগ:1 [7680/60000 (13%)]ক্ষতি:2.040502ট্রেন যুগ:1 [8320/60000 (14%)]ক্ষতি:2.102528ট্রেন পর্ব [1600001] (1606%) লস:1.944297ট্রেন যুগ:1 [9600/60000 (16%)]ক্ষতি:1.886444ট্রেন যুগ:1 [10240/60000 (17%)]ক্ষতি:1.801920ট্রেন যুগ [101920ট্রেন যুগ:106% (16%) 1.421267ট্রেন যুগ:1 [11520/60000 (19%)]ক্ষতি:1.491448ট্রেন যুগ:1 [12160/60000 (20%)]ক্ষতি:1.600088ট্রেন যুগ:10088 (10088) 21%)]ক্ষতি:1.218677ট্রেনের যুগ:1 [13440/60000 (22%)]ক্ষতি:1.060651ট্রেন যুগ:1 [14080/60000 (23%)]ক্ষতি:1.161512%/2012012012012012077 )]ক্ষতি:1.351181ট্রেনের যুগ:1 [15360/60000 (26%)]ক্ষতি:1.012257ট্রেন যুগ:1 [16000/60000 (27%)]ক্ষতি:1.018847ch:1.018847Train/606% [2006] লস:০.৯৪৪৩২৪ ট্রেনের যুগ:১ [১৭২৮০/৬০০০০ (২৯%)]ক্ষতি:০.৯২৯২৪৬ ট্রেন যুগ:১ [১৭৯২০/৬০০০০ (৩০%)]ক্ষতি:০.৯০৩৩৩৬ ট্রেন যুগ [১৮০%:১০০৬] 1.243159ট্রেন যুগ:1 [19200/60000 (32%)]ক্ষতি:0.696106ট্রেন যুগ:1 [19840/60000 (33%)]লোকসান:0.902251ট্রেন যুগ:10801608606% যুগ:1 [21120/60000 (35%)]ক্ষতি:1.203934ট্রেনের যুগ:1 [21760/60000 (36%)]ক্ষতি:0.682855ট্রেন যুগ:1 [22400/60000 (35%)T300000000000000T3000000000000000000000000000 টি 1 [23040/60000 (38%)]ক্ষতি:0.932158ট্রেন যুগ:1 [23680/60000 (39%)]লোকসান:1.110188ট্রেন যুগ:1 [24320/60000 (ss1%:41%:41%) 24960/60000 (42%)]ক্ষতি:0.584215ট্রেন যুগ:1 [25600/60000 (43%)]ক্ষতি:0.724121ট্রেন যুগ:1 [26240 /60000 (44%)]ক্ষতি:0.707071ট্রেন যুগ:1 [26880/60000 (45%)]ক্ষতি:0.574117ট্রেন যুগ:1 [27520/60000 (46%)]লোকসান:6201/601600 (47%)]ক্ষতি:0.654354ট্রেন যুগ:1 [28800/60000 (48%)]ক্ষতি:0.811647ট্রেন যুগ:1 [29440/60000 (49%)]ক্ষতি:0.5368854T/5001003000 %)]ক্ষতি:0.849961ট্রেন যুগ:1 [30720/60000 (51%)]ক্ষতি:0.844555ট্রেন যুগ:1 [31360/60000 (52%)]ক্ষতি:0.687859ch/30% (30%) ]ক্ষতি:0.766818ট্রেন যুগ:1 [32640/60000 (54%)]ক্ষতি:0.597061ট্রেন যুগ:1 [33280/60000 (55%)]ক্ষতি:0.691049Train Epoch1 [30049] (Loss130%) :0.573049ট্রেন যুগ:1 [34560/60000 (58%)]ক্ষতি:0.405698ট্রেন যুগ:1 [35200/60000 (59%)]ক্ষতি:0.480660ট্রেন যুগ:5018/408% [501601] ট্রেন যুগ:1 [36480/60000 (61%)]ক্ষতি:0.496494……………….ট্রেন যুগ:3 [49920/60000 (83%)]ক্ষতি:0.253500ট্রেন যুগ:3 [50560/60% (40%) )]ক্ষতি:0.364354ট্রেন যুগ:3 [51200/60000 (85%)]ক্ষতি:0.333843ট্রেন যুগ:3 [51840/60000 (86%)]ক্ষতি:0.096922ট্রেন যুগ:3 [52480/60000 (87%)]ক্ষতি:0.282102ট্রেন যুগ:3 [53120/60000 (88%)]লোকসান:0.236428ট্রেন যুগ:3 [53760/60000 (87%) 600000000000000 ইপিও:60% 3 [54400/60000 (91%)]ক্ষতি:0.198840ট্রেনের যুগ:3 [55040/60000 (92%)]ক্ষতি:0.344225ট্রেন যুগ:3 [55680/60000 (93%:40000 (93%) 56320/60000 (94%)]ক্ষতি:0.216912ট্রেন যুগ:3 [56960/60000 (95%)]ক্ষতি:0.309554ট্রেন যুগ:3 [57600/60000 (96%:32000000000000000000000) 60000 (97%)]ক্ষতি:0.176541ট্রেন যুগ:3 [58880/60000 (98%)]ক্ষতি:0.456749ট্রেন যুগ:3 [59520/60000 (99%)]ক্ষতি:0.58 গ্রাম সর্বনিম্ন সেট ক্ষতি:0.0912, সঠিকতা:9716/10000 (97%)
মডেলের কর্মক্ষমতা মূল্যায়ন করা
তাই মাত্র 3টি যুগের প্রশিক্ষণের মাধ্যমে আমরা পরীক্ষার সেটে 97% নির্ভুলতা অর্জন করতে পেরেছি। এলোমেলোভাবে শুরু করা পরামিতি সহ, আমরা প্রশিক্ষণ শুরু করার আগে প্রাথমিকভাবে পরীক্ষা সেটে 10% নির্ভুলতার সাথে শুরু করেছি।
আমাদের প্রশিক্ষণ বক্ররেখা প্লট করা যাক:
fig =plt.figure()plt.plot(train_counter, train_losses, color='blue')plt.scatter(test_counter, test_losses, color='red')plt.legend(['ট্রেন লস', 'পরীক্ষা ক্ষতি'], loc='উপরের ডানদিকে')plt.xlabel('প্রশিক্ষণের উদাহরণের সংখ্যা দেখা')plt.ylabel('নেতিবাচক লগের সম্ভাবনা ক্ষতি')চিত্র
আউটপুট
উপরের আউটপুট পরীক্ষা করে, আমরা আরও কিছু ফলাফল দেখতে যুগের সংখ্যা বাড়াতে পারি, যেহেতু 3টি যুগ পরীক্ষা করে নির্ভুলতা বাড়ানো হয়।
কিন্তু তার আগে, আরও কিছু উদাহরণ চালান এবং মডেলের আউটপুট তুলনা করুন:
torch.no_grad() সহ:output =network(example_data)fig =plt.figure() এর জন্য i রেঞ্জে(6):plt.subplot(2,3,i+1) plt.tight_layout() plt। imshow(example_data[i][0], cmap='gray', interpolation='none') plt.title("ভবিষ্যদ্বাণী:{}".ফর্ম্যাট( output.data.max(1, keepdim=True)[1] [i].item())) plt.xticks([]) plt.yticks([])fig
যেহেতু আমরা আমাদের মডেলের ভবিষ্যদ্বাণীগুলি দেখতে পাচ্ছি, এটি সেই উদাহরণগুলির জন্য বিন্দুতে থাকার মতো দেখায়৷
৷