15 نوفمبر 202518 دقيقة قراءة
كيف تدرّب أول نموذج AI خاص بك؟
دليل عملي خطوة بخطوة لتدريب نموذج تصنيف صور باستخدام PyTorch
المشروع: تصنيف الصور (قطط 🐱 vs كلاب 🐶)
سنبني نموذج CNN بسيط يميّز بين صور القطط والكلاب. هذا مشروع مثالي للمبتدئين!
ما تحتاجه:
- ✓ Python 3.8+
- ✓ PyTorch
- ✓ Google Colab (مجاني)
ما ستتعلمه:
- ✓ تحضير البيانات
- ✓ بناء CNN
- ✓ التدريب والتقييم
الخطوة 1: إعداد البيئة
تثبيت المكتبات
# في Google Colab أو Terminal
!pip install torch torchvision
استيراد المكتبات
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
الخطوة 2: تحضير البيانات
Data Augmentation
نطبق تحويلات على الصور لزيادة تنوع البيانات ومنع Overfitting
# تحويلات للصور
transform = transforms.Compose([
transforms.Resize((128, 128)), # تصغير الصورة
transforms.RandomHorizontalFlip(), # قلب عشوائي
transforms.ToTensor(), # تحويل لـ Tensor
transforms.Normalize((0.5,0.5,0.5), (0.5,0.5,0.5))
])
تحميل Dataset
# مثال: استخدام CIFAR-10 (10 categories)
train_data = datasets.CIFAR10(
root='./data',
train=True,
transform=transform,
download=True
)
train_loader = DataLoader(train_data, batch_size=32, shuffle=True)
الخطوة 3: بناء النموذج (CNN)
معمارية CNN بسيطة
class SimpleCNN(nn.Module):
def __init__(self):
super().__init__()
# Convolutional Layers
self.conv1 = nn.Conv2d(3, 32, 3) # 3 channels → 32
self.conv2 = nn.Conv2d(32, 64, 3)
self.pool = nn.MaxPool2d(2, 2)
# Fully Connected Layers
self.fc1 = nn.Linear(64*30*30, 128)
self.fc2 = nn.Linear(128, 10) # 10 classes
self.relu = nn.ReLU()
def forward(self, x):
x = self.pool(self.relu(self.conv1(x)))
x = self.pool(self.relu(self.conv2(x)))
x = x.view(-1, 64*30*30) # Flatten
x = self.relu(self.fc1(x))
x = self.fc2(x)
return x
شرح المعمارية:
- • Conv1: 3→32 filters (استخراج features بسيطة)
- • Conv2: 32→64 filters (features أعمق)
- • MaxPool: تقليل الحجم بعد كل conv
- • FC Layers: التصنيف النهائي
الخطوة 4: التدريب
إعداد النموذج والـ Optimizer
model = SimpleCNN()
criterion = nn.CrossEntropyLoss() # Loss function
optimizer = optim.Adam(model.parameters(), lr=0.001)
Training Loop
epochs = 10
for epoch in range(epochs):
running_loss = 0.0
for images, labels in train_loader:
# 1. Forward pass
outputs = model(images)
loss = criterion(outputs, labels)
# 2. Backward pass
optimizer.zero_grad() # صفّر gradients
loss.backward() # احسب gradients
optimizer.step() # حدّث الأوزان
running_loss += loss.item()
print(f'Epoch {epoch+1}, Loss: {running_loss/len(train_loader):.3f}')
ما يحدث في كل Epoch:
- 1. Forward Pass: مرر الصور عبر الشبكة
- 2. Calculate Loss: قارن Output بالـ Labels الحقيقية
- 3. Backward Pass: احسب gradients
- 4. Update Weights: حسّن الأوزان
الخطوة 5: التقييم
اختبار النموذج
model.eval() # وضع Evaluation
correct = 0
total = 0
with torch.no_grad(): # لا نحتاج gradients
for images, labels in test_loader:
outputs = model(images)
_, predicted = torch.max(outputs, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
accuracy = 100 * correct / total
print(f'Test Accuracy: {accuracy:.2f}%')
حفظ النموذج
torch.save(model.state_dict(), 'my_first_model.pth')
# لتحميله لاحقاً:
model.load_state_dict(torch.load('my_first_model.pth'))
نصائح لتحسين النموذج
📊
زِد البيانات
أكثر بيانات = دقة أعلى
🔧
جرّب Learning Rates مختلفة
0.001, 0.0001, 0.01 - جرّب!
🏗️
استخدم Pre-trained Models
ResNet, VGG مع Transfer Learning
⏱️
راقب Overfitting
استخدم Dropout و Early Stopping
🎉 مبروك! درّبت أول نموذج AI!
الآن أنت تفهم:
- ✅ كيف تحضّر البيانات
- ✅ كيف تبني CNN
- ✅ Forward/Backward Pass
- ✅ التدريب والتقييم
المشاريع القادمة: جرّب Object Detection، NLP، أو Generative AI!