CIFAR-10 पर CNN बनाना और प्रशिक्षित करना
शिक्षार्थी Conv2d-ReLU-MaxPool ब्लॉकों को क्रम से जोड़ेंगे, विशेषता मानचित्र को समतल करेंगे, एक रैखिक वर्गीकारक जोड़ेंगे और डेटा संवर्धन के साथ CIFAR-10 पर प्रशिक्षण करेंगे।
CIFAR-10 पर CNN बनाना और प्रशिक्षित करना, CoddyKit पर Machine Learning Academy का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Machine Learning Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Machine Learning Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
CIFAR-10: मानक डेटासेट
CIFAR-10 एक प्रसिद्ध चित्र वर्गीकरण मानक है, जिसमें 10 वर्गों के 60,000 रंगीन चित्र (32x32 पिक्सेल, RGB) हैं: हवाई जहाज़, ऑटोमोबाइल, पक्षी, बिल्ली, हिरन, कुत्ता, मेंढक, घोड़ा, जहाज़ और ट्रक। इनमें 50,000 प्रशिक्षण चित्र और 10,000 परीक्षण चित्र हैं। यह इतना छोटा है कि लैपटॉप पर कुछ घंटों में प्रशिक्षित किया जा सकता है, लेकिन इतना जटिल भी है कि सरल मॉडल विफल हो जाते हैं—इसलिए CNN डिज़ाइन सीखने के लिए यह आदर्श है। PyTorch में यह torchvision.datasets.CIFAR10 के माध्यम से आसानी से उपलब्ध है।
import torchvision
import torchvision.transforms as transforms
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize(
mean=(0.4914, 0.4822, 0.4465),
std=(0.2023, 0.1994, 0.2010)
)
])
train_set = torchvision.datasets.CIFAR10(
root='./data', train=True,
download=True, transform=transform
)
print('Training images:', len(train_set)) # 50000
print('Image shape:', train_set[0][0].shape) # (3, 32, 32)DataLoader से डेटा लोड करना
डेटासेट निर्धारित करने के बाद, उसे एक DataLoader में रखें, जो बैच बनाना, क्रम बदलना और समानांतर लोडिंग संभालता है। CIFAR-10 के लिए 64 या 128 का बैच आकार सामान्य है। प्रशिक्षण डेटा के लिए shuffle=True रखें ताकि प्रत्येक युग में क्रम यादृच्छिक हो जाए, और परीक्षण सेट के लिए shuffle=False रखें (मूल्यांकन में क्रम महत्वपूर्ण नहीं होता)। num_workers=2 डेटा को प्रशिक्षण के साथ समानांतर रूप से लोड करता है, जिससे डेटा प्राप्त करते समय GPU के निष्क्रिय रहने का समय घटता है।
from torch.utils.data import DataLoader
train_loader = DataLoader(
train_set,
batch_size=128,
shuffle=True,
num_workers=2,
pin_memory=True # faster GPU transfer
)
# Peek at one batch
X_batch, y_batch = next(iter(train_loader))
print('Batch images:', X_batch.shape) # (128, 3, 32, 32)
print('Batch labels:', y_batch.shape) # (128,)CNN आर्किटेक्चर डिज़ाइन करना
CIFAR-10 के लिए 3-ब्लॉक CNN अच्छा काम करता है: प्रत्येक ब्लॉक में दो Conv-BN-ReLU परतों के बाद मैक्स पूलिंग होती है। चैनलों की संख्या दोगुनी होती जाती है (32 -> 64 -> 128), जबकि स्थानिक आकार आधा होता जाता है (32 -> 16 -> 8 -> 4)। कनवल्शन ब्लॉकों के बाद ग्लोबल औसत पूलिंग स्थानिक आयामों को समेटती है और एक रैखिक परत 10 वर्ग स्कोर में मानचित्रण करती है। इस डिज़ाइन में लगभग 250K पैरामीटर होते हैं—यह तेज़ी से प्रशिक्षण के लिए पर्याप्त छोटा है और डेटा संवर्धन के बिना 80% से अधिक सटीकता प्राप्त कर सकता है।
import torch.nn as nn
class CIFAR10Net(nn.Module):
def __init__(self):
super().__init__()
self.features = nn.Sequential(
nn.Conv2d(3, 32, 3, padding=1), nn.BatchNorm2d(32), nn.ReLU(),
nn.Conv2d(32, 32, 3, padding=1), nn.BatchNorm2d(32), nn.ReLU(),
nn.MaxPool2d(2), # 32->16
nn.Conv2d(32, 64, 3, padding=1), nn.BatchNorm2d(64), nn.ReLU(),
nn.Conv2d(64, 64, 3, padding=1), nn.BatchNorm2d(64), nn.ReLU(),
nn.MaxPool2d(2), # 16->8
nn.Conv2d(64, 128, 3, padding=1), nn.BatchNorm2d(128), nn.ReLU(),
nn.MaxPool2d(2), # 8->4
)
self.classifier = nn.Sequential(
nn.AdaptiveAvgPool2d((1, 1)),
nn.Flatten(),
nn.Linear(128, 10)
)
def forward(self, x):
return self.classifier(self.features(x))प्रशिक्षण घटकों की स्थापना
CIFAR-10 वर्गीकरण के लिए ये व्यवस्थाएँ करें: मानदंड के रूप में CrossEntropyLoss (10 वर्गों के कच्चे लॉजिट), अनुकूलक के रूप में मोमेंटम वाला Adam या SGD, और प्रशिक्षण के दौरान सीखने की दर घटाने के लिए कोसाइन एनीलिंग या चरणबद्ध LR शेड्यूलर। मॉडल को .to(device) से GPU पर भेजें। महँगा प्रशिक्षण शुरू करने से पहले जाँच के रूप में कुल पैरामीटर संख्या प्रिंट करें।
import torch
import torch.nn as nn
import torch.optim as optim
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = CIFAR10Net().to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(
model.parameters(),
lr=0.1,
momentum=0.9,
weight_decay=5e-4
)
scheduler = optim.lr_scheduler.CosineAnnealingLR(
optimizer, T_max=50
)
total_params = sum(p.numel() for p in model.parameters())
print(f'Parameters: {total_params:,}') # ~250,000प्रशिक्षण युग फ़ंक्शन
एक प्रशिक्षण युग को फ़ंक्शन में समाहित करने से कोड पुनः उपयोग योग्य और सुव्यवस्थित बनता है। फ़ंक्शन सभी बैचों पर चलता है, 4-चरणीय अपडेट लागू करता है, हानि और सही पूर्वानुमानों का संचय करता है तथा औसत हानि और सटीकता लौटाता है। लूप के भीतर X_batch और y_batch दोनों को device पर भेजना सही तरीका है—DataLoader में pin_memory=True के साथ पहले से डेटा लोड करने पर यह स्थानांतरण तेज़ हो जाता है।
import torch
def train_epoch(model, loader, criterion, optimizer, device):
model.train()
total_loss, correct, total = 0.0, 0, 0
for X, y in loader:
X, y = X.to(device), y.to(device)
optimizer.zero_grad()
logits = model(X)
loss = criterion(logits, y)
loss.backward()
optimizer.step()
total_loss += loss.item() * X.size(0)
correct += (logits.argmax(1) == y).sum().item()
total += X.size(0)
return total_loss / total, correct / totalमान्यता युग फ़ंक्शन
मान्यता फ़ंक्शन प्रशिक्षण फ़ंक्शन जैसा ही होता है, सिवाय इसके कि: model.eval() Dropout और BatchNorm की यादृच्छिकता बंद करता है; torch.no_grad() गति बढ़ाने के लिए ग्रेडिएंट ट्रैकिंग बंद करता है; और अनुकूलक का कोई चरण नहीं होता। लौटाई गई मान्यता सटीकता और हानि का उपयोग सामान्यीकरण प्रदर्शन पर नज़र रखने, अति-अनुकूलन का पता लगाने और ReduceLROnPlateau के माध्यम से सीखने की दर निर्धारित करने के लिए किया जाता है।
import torch
def eval_epoch(model, loader, criterion, device):
model.eval()
total_loss, correct, total = 0.0, 0, 0
with torch.no_grad():
for X, y in loader:
X, y = X.to(device), y.to(device)
logits = model(X)
loss = criterion(logits, y)
total_loss += loss.item() * X.size(0)
correct += (logits.argmax(1) == y).sum().item()
total += X.size(0)
return total_loss / total, correct / totalपूर्ण प्रशिक्षण लूप
प्रशिक्षण और मान्यता युग फ़ंक्शन निर्धारित हो जाने के बाद, बाहरी लूप num_epochs बार चलता है। प्रत्येक युग के बाद LR शेड्यूलर का चरण चलाएँ और मान्यता सटीकता में सुधार होने पर मॉडल को सहेजें। प्रत्येक युग में मेट्रिक्स प्रिंट करने से स्थिति स्पष्ट रहती है—ठीक से समायोजित CNN में पहले युग की लगभग 30% प्रशिक्षण सटीकता से 50वें युग तक 90% से अधिक तक बढ़ोतरी दिखनी चाहिए। मान्यता सटीकता सामान्यतः प्रशिक्षण से 5–10 प्रतिशत अंक पीछे रहती है।
num_epochs = 50
best_val_acc = 0.0
for epoch in range(num_epochs):
tr_loss, tr_acc = train_epoch(
model, train_loader, criterion, optimizer, device)
val_loss, val_acc = eval_epoch(
model, val_loader, criterion, device)
scheduler.step()
print(f'Epoch {epoch+1:03d}: '
f'tr_loss={tr_loss:.3f} tr_acc={tr_acc:.3f} '
f'val_loss={val_loss:.3f} val_acc={val_acc:.3f}')
if val_acc > best_val_acc:
best_val_acc = val_acc
torch.save(model.state_dict(), 'best_cifar10.pt')सटीकता सुधारने के लिए डेटा संवर्धन
डेटा संवर्धन प्रशिक्षण चित्रों पर यादृच्छिक रूपांतरण लागू करता है, जिससे डेटासेट कृत्रिम रूप से बड़ा होता है और मॉडल अधिक मजबूत बनता है। CIFAR-10 के लिए रैंडम हॉरिज़ॉन्टल फ़्लिप, रैंडम क्रॉप (padding के साथ) और कलर जिटर सामान्य तकनीकें हैं। संवर्धन से सामान्यतः सटीकता 3–5 प्रतिशत अंक बढ़ती है। संवर्धन केवल प्रशिक्षण रूपांतरण पर लागू करें—नियतात्मक मूल्यांकन के लिए परीक्षण रूपांतरण में केवल सामान्यीकरण रखें।
import torchvision.transforms as transforms
train_transform = transforms.Compose([
transforms.RandomCrop(32, padding=4), # shift by 4px
transforms.RandomHorizontalFlip(), # mirror 50%
transforms.ColorJitter(
brightness=0.2, contrast=0.2,
saturation=0.2, hue=0.1
),
transforms.ToTensor(),
transforms.Normalize(
(0.4914, 0.4822, 0.4465),
(0.2023, 0.1994, 0.2010)
)
])
test_transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize(
(0.4914, 0.4822, 0.4465),
(0.2023, 0.1994, 0.2010)
)
])प्रशिक्षण वक्रों की व्याख्या
CNN के विकास के लिए प्रशिक्षण वक्रों को पढ़ना सीखना आवश्यक है। एक अभिसरित मॉडल में प्रशिक्षण और सत्यापन हानि, दोनों साथ-साथ घटती हैं। अतिअनुरूपण में प्रशिक्षण हानि लगभग शून्य रहती है, जबकि सत्यापन हानि स्थिर हो जाती है या बढ़ती है। अल्पअनुरूपण में दोनों हानियाँ अधिक और स्थिर रहती हैं। CIFAR-10 के लिए, 50 युगों के एक स्वस्थ प्रशिक्षण में, दिए गए आर्किटेक्चर और संवर्धन के साथ, ये परिणाम दिखने चाहिए: युग 1 में लगभग 35% सटीकता, युग 10 में लगभग 70%, और युग 50 में लगभग 85–90% सत्यापन सटीकता।
# Typical CIFAR-10 accuracy milestones
milestones = {
'Epoch 1': 'val_acc ~35% (random = 10%)',
'Epoch 5': 'val_acc ~60% (basic patterns learned)',
'Epoch 10': 'val_acc ~70% (edges, textures)',
'Epoch 20': 'val_acc ~78% (object parts)',
'Epoch 50': 'val_acc ~85% (with augmentation)',
'With ResNet18': 'val_acc ~93%',
'State of art': 'val_acc ~99% (huge ensembles)'
}
for epoch, note in milestones.items():
print(f'{epoch}: {note}')प्रति-वर्ग सटीकता विश्लेषण
समग्र सटीकता, अलग-अलग वर्गों के प्रदर्शन में छिपे अंतर को नहीं दिखाती। CIFAR-10 के कुछ वर्गों में अंतर करना अधिक कठिन होता है—'cat' बनाम 'dog' और 'automobile' बनाम 'truck' इसके सामान्य भ्रम-युग्म हैं। प्रति-वर्ग सटीकता की गणना करने या भ्रम मैट्रिक्स का आलेख बनाने से पता चलता है कि मॉडल को किन वर्गों में कठिनाई हो रही है। इससे लक्षित डेटा संग्रह या संवर्धन रणनीतियों का मार्गदर्शन मिलता है। एकत्र की गई भविष्यवाणियों और लेबलों पर sklearn.metrics.confusion_matrix का उपयोग करें।
import torch
classes = ['airplane', 'auto', 'bird', 'cat', 'deer',
'dog', 'frog', 'horse', 'ship', 'truck']
# Collect all predictions
all_preds, all_labels = [], []
model.eval()
with torch.no_grad():
for X, y in test_loader:
X = X.to(device)
preds = model(X).argmax(1).cpu()
all_preds.extend(preds.tolist())
all_labels.extend(y.tolist())
# Per-class accuracy
for i, cls in enumerate(classes):
mask = [l == i for l in all_labels]
correct = sum(p == l for p, l in zip(all_preds, all_labels) if l == i)
total = sum(mask)
print(f'{cls}: {correct}/{total} = {correct/total:.1%}')CutMix और Mixup संवर्धन
मानक संवर्धन से आगे, उन्नत तकनीकें CNN के प्रदर्शन को और बेहतर बनाती हैं। Mixup दो प्रशिक्षण छवियों और उनके लेबलों के बीच रैखिक अंतर्वेशन करता है: मॉडल को दोनों वर्गों के मिश्रण की भविष्यवाणी करनी होती है। CutMix एक छवि से आयताकार भाग लेकर उसे दूसरी छवि पर चिपकाता है और क्षेत्रफल के अनुपात में लेबल निर्धारित करता है। दोनों प्रभावी नियमितीकरण तकनीकों की तरह काम करते हैं और अतिअनुरूपण को कम करते हैं। ये अत्याधुनिक CIFAR-10 प्रशिक्षण में मानक तकनीकें हैं और केवल यादृच्छिक क्रॉप तथा फ्लिप की तुलना में सटीकता में 1–3% की वृद्धि करती हैं।
import torch
def mixup_batch(X, y, alpha=0.2, num_classes=10):
lam = torch.distributions.Beta(alpha, alpha).sample()
idx = torch.randperm(X.size(0))
X_mix = lam * X + (1 - lam) * X[idx]
# Soft labels: blend of one-hot vectors
y_onehot = torch.zeros(X.size(0), num_classes)
y_onehot.scatter_(1, y.unsqueeze(1), 1)
y_onehot2 = y_onehot[idx]
y_mix = lam * y_onehot + (1 - lam) * y_onehot2
return X_mix, y_mix
# Use with soft-label cross entropy
# loss = -(y_mix * F.log_softmax(logits, dim=1)).sum(dim=1).mean()त्वरित जाँच
इस पाठ में दिए गए Python के साथ मशीन लर्निंग से संबंधित सिद्धांतों की अपनी समझ जाँचें।
पाठ का पुनरावलोकन
इस पाठ में आपने सीखा: CIFAR-10 10 वर्गों वाला मानक छवि बेंचमार्क है, जिसमें 50K प्रशिक्षण और 10K परीक्षण 32x32 RGB छवियाँ हैं; BatchNorm वाला 3-ब्लॉक CNN मानक संवर्धन के साथ 50 युगों के बाद लगभग 85% सटीकता प्राप्त करता है; और डेटा संवर्धन (यादृच्छिक क्रॉप, क्षैतिज फ्लिप, रंग परिवर्तन) प्रशिक्षण और परीक्षण सटीकता के बीच के अंतर को कम करने के लिए आवश्यक है। आगे हम अधिक सुदृढ़ मॉडल बनाने के लिए डेटा संवर्धन रूपांतरणों का विस्तार से अध्ययन करेंगे।
एआई शिक्षक के साथ Python सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 30
- पाठ
- 120
अक्सर पूछे जाने वाले प्रश्न
क्या “CIFAR-10 पर CNN बनाना और प्रशिक्षित करना” पाठ निःशुल्क है?
हाँ—“CIFAR-10 पर CNN बनाना और प्रशिक्षित करना” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Machine Learning Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Machine Learning Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“CIFAR-10 पर CNN बनाना और प्रशिक्षित करना” में मैं क्या सीखूँगा?
शिक्षार्थी Conv2d-ReLU-MaxPool ब्लॉकों को क्रम से जोड़ेंगे, विशेषता मानचित्र को समतल करेंगे, एक रैखिक वर्गीकारक जोड़ेंगे और डेटा संवर्धन के साथ CIFAR-10 पर प्रशिक्षण करेंगे। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Machine Learning Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या Machine Learning Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Machine Learning Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।
“CIFAR-10 पर CNN बनाना और प्रशिक्षित करना” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस Machine Learning Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर Machine Learning Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- कन्वोल्यूशन और फ़िल्टर: किनारों और पैटर्न का पता लगाना
- पूलिंग परतें: स्थानिक डाउनसैंपलिंग और अपरिवर्तनशीलता
- CIFAR-10 पर CNN बनाना और प्रशिक्षित करना
- डेटा संवर्धन: मज़बूती के लिए रूपांतरण