VGG-Net (Visual Geometry Group) یک معماری شبکه عصبی کانولوشنی (CNN) عمیق است که توسط Visual Geometry Group در دانشگاه آکسفورد توسعه یافته است. این شبکه در مقالهی سال ۲۰۱۴ با عنوان “شبکههای کانولوشنی بسیار عمیق برای شناسایی تصاویر در مقیاس بزرگ” توسط سیمونیان و زیسرمن معرفی شد. معماری VGG-Net به دلیل سادگی، طراحی یکنواخت و عملکرد عالی در وظایف طبقهبندی تصویر شناخته شده است. این مدل نقش مهمی در پیشرفت یادگیری عمیق ایفا کرده و به طور گسترده برای یادگیری انتقالی (Transfer Learning) استفاده میشود.
ویژگیهای کلیدی VGG-Net
✅ معماری عمیق اما ساده: از فیلترهای کانولوشنی کوچک ۳×۳ به صورت یکنواخت در کل شبکه استفاده میکند.
✅ طراحی یکنواخت: همهی لایههای کانولوشنی از تابع فعالساز ReLU استفاده کرده و پس از آنها یک لایه Max Pooling قرار میگیرد.
✅ افزایش عمق: در نسخههای مختلفی مانند VGG-11، VGG-13، VGG-16 و VGG-19 ارائه شده است (عدد نشاندهندهی تعداد لایههای دارای پارامتر قابل train است).
✅ لایههای کاملاً متصل: شامل سه لایهی Fully Connected در انتها است که این مدل را برای طبقهبندی مناسب میسازد.
✅ وزنهای از پیش آموزشدیده شده: مدلهای VGG با وزنهای از پیش آموزشدیده شده (pretrained model) روی مجموعه داده ImageNet در دسترس هستند و برای یادگیری انتقالی بسیار مفید میباشند.
مروری بر معماری VGG-Net
VGG دارای چندین نسخه است که معروفترین آنها VGG-16 و VGG-19 هستند. در ادامه، معماری VGG-16 بهطور دقیق بررسی شده است:
ساختار لایههای VGG-16
لایه | نوع | تعداد فیلترها | اندازه کرنل | استراید | فعالسازی |
---|---|---|---|---|---|
1 | کانولوشن | 64 | 3×3 | 1 | ReLU |
2 | کانولوشن | 64 | 3×3 | 1 | ReLU |
3 | Max Pooling | – | 2×2 | 2 | – |
4 | کانولوشن | 128 | 3×3 | 1 | ReLU |
5 | کانولوشن | 128 | 3×3 | 1 | ReLU |
6 | Max Pooling | – | 2×2 | 2 | – |
7 | کانولوشن | 256 | 3×3 | 1 | ReLU |
8 | کانولوشن | 256 | 3×3 | 1 | ReLU |
9 | کانولوشن | 256 | 3×3 | 1 | ReLU |
10 | Max Pooling | – | 2×2 | 2 | – |
11 | کانولوشن | 512 | 3×3 | 1 | ReLU |
12 | کانولوشن | 512 | 3×3 | 1 | ReLU |
13 | کانولوشن | 512 | 3×3 | 1 | ReLU |
14 | Max Pooling | – | 2×2 | 2 | – |
15 | کانولوشن | 512 | 3×3 | 1 | ReLU |
16 | کانولوشن | 512 | 3×3 | 1 | ReLU |
17 | کانولوشن | 512 | 3×3 | 1 | ReLU |
18 | Max Pooling | – | 2×2 | 2 | – |
19 | Fully Connected | 4096 | – | – | ReLU |
20 | Fully Connected | 4096 | – | – | ReLU |
21 | Fully Connected | 1000 (برای ImageNet) | – | – | Softmax |
VGG-19 نیز الگوی مشابهی دارد اما دارای تعداد بیشتری لایهی کانولوشنی است.
پیادهسازی VGG-Net در پایتون (با استفاده از PyTorch)
وارد کردن کتابخانههای مورد نیاز
pythonCopyEditimport torch
import torch.nn as nn
import torchvision.models as models
import torchvision.transforms as transforms
import torchvision.datasets as datasets
from torch.utils.data import DataLoader
بارگذاری مدل از پیش آموزشدیدهی VGG-16
pythonCopyEditmodel = models.vgg16(pretrained=True)
print(model)
تغییر مدل برای یک وظیفهی طبقهبندی سفارشی
pythonCopyEditnum_classes = 10 # مثال برای مجموعه داده CIFAR-10
model.classifier[6] = nn.Linear(model.classifier[6].in_features, num_classes)
بارگذاری و پیشپردازش دادهها
pythonCopyEdittransform = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
dataset = datasets.CIFAR10(root='./data', train=True, transform=transform, download=True)
dataloader = DataLoader(dataset, batch_size=64, shuffle=True)
آموزش مدل
pythonCopyEditcriterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
def train(model, dataloader, criterion, optimizer, epochs=5):
model.train()
for epoch in range(epochs):
running_loss = 0.0
for images, labels in dataloader:
optimizer.zero_grad()
outputs = model(images)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
running_loss += loss.item()
print(f'Epoch {epoch+1}, Loss: {running_loss/len(dataloader)}')
train(model, dataloader, criterion, optimizer)
چرا VGG-Net مهم است؟
✅ افزایش عمق شبکه باعث بهبود دقت در طبقهبندی تصاویر میشود.
✅ یکی از اولین معماریهای عمیق اما ساده در شبکههای CNN بود.
چرا از کرنلهای ۳×۳ استفاده شده است؟
🔹 کاهش تعداد پارامترها در مقایسه با فیلترهای ۵×۵ یا ۷×۷، در حالی که میدان دید حفظ میشود.
🔹 افزایش غیرخطیت در مدل با تعداد لایههای بیشتر.
🔹 کاهش هزینهی محاسباتی در مقایسه با کرنلهای بزرگتر.
انواع VGG
✔ VGG-16: دارای ۱۶ لایهی دارای پارامترهای قابل یادگیری
✔ VGG-19: دارای ۱۹ لایه، مشابه VGG-16 اما با لایههای کانولوشنی بیشتر
چرا VGG-Net از نظر محاسباتی پرهزینه است؟
❌ استفاده از لایههای کاملاً متصل در انتها که تعداد زیادی پارامتر دارند.
❌ اندازهی بزرگ مدل، که باعث کندی آن نسبت به معماریهای مدرنتر مانند ResNet و MobileNet میشود.
نتیجهگیری
معماری VGG-Net یک معماری ساده اما عمیق بود که تأثیر زیادی بر پیشرفت یادگیری عمیق گذاشت. با اینکه معماریهای مدرنتر مانند ResNet و EfficientNet امروزه عملکرد بهتری دارند، اما VGG هنوز هم برای یادگیری انتقالی، تشخیص اشیا و استخراج ویژگیها پرکاربرد است.