딥러닝은 최근 몇 년간 인공지능(AI) 분야에서 가장 많은 주목을 받는 기술 중 하나입니다. 특히, 컴퓨터 비전 분야에서는 딥러닝을 기반으로 한 다양한 모델들이 뛰어난 성능을 보여주고 있습니다. 그중에서도 AlexNet은 2012년 ImageNet 대회에서 뛰어난 성적을 거두며 딥러닝의 대중화를 이끌었던 혁신적인 모델입니다. 이는 매우 깊은 신경망 구조로, 여러 개의 컨볼루션 레이어와 풀링 레이어로 구성되어 있습니다.
1. AlexNet 구조 소개
AlexNet은 다음과 같은 주요 구성 요소로 이루어져 있습니다:
- 입력 레이어: 224×224 크기의 컬러 이미지
- 1층: Convolutional Layer: 96개의 필터 사용, 필터 크기 11×11, 스트라이드 4
- 2층: Max Pooling Layer: 3×3 최대 풀링, 스트라이드 2
- 3층: Convolutional Layer: 256개의 필터 사용, 필터 크기 5×5
- 4층: Max Pooling Layer: 3×3 최대 풀링, 스트라이드 2
- 5층: Convolutional Layer: 384개의 필터 사용, 필터 크기 3×3
- 6층: Convolutional Layer: 384개의 필터 사용, 필터 크기 3×3
- 7층: Convolutional Layer: 256개의 필터 사용, 필터 크기 3×3
- 8층: Max Pooling Layer: 3×3 최대 풀링, 스트라이드 2
- 9층: Fully Connected Layer: 4096 뉴런
- 10층: Fully Connected Layer: 4096 뉴런
- 11층: Output Layer: 1000개의 클래스에 대한 Softmax 출력
2. AlexNet의 작동 원리
AlexNet의 기본 아이디어는 이미지에서 특징을 추출하고, 이를 사용하여 이미지를 분류하는 것입니다. 초기 단계에서 이미지의 고수준 특징을 학습하고, 이후 단계에서 이를 조합하여 더 복잡한 개념을 학습합니다. 각 Convolutional Layer는 입력 이미지에서 필터를 통해 특징 맵을 생성하고, Max Pooling Layer는 이러한 특징을 다운샘플링하여 계산량을 줄입니다.
3. PyTorch로 AlexNet 구현하기
이제 PyTorch를 사용하여 AlexNet 모델을 구현해보겠습니다. PyTorch는 딥러닝 모델을 구현하는 데 매우 유용한 프레임워크로, 유연하고 직관적인 API를 제공합니다.
3.1 패키지 불러오기
PyTorch를 사용하기 위해 필요한 패키지를 불러옵니다.
python
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
3.2 AlexNet 모델 정의하기
이제 AlexNet 아키텍처를 정의합니다. 각 레이어를 nn.Module 클래스를 상속받은 클래스로 구현합니다.
python
class AlexNet(nn.Module):
def __init__(self, num_classes=1000):
super(AlexNet, self).__init__()
self.features = nn.Sequential(
nn.Conv2d(3, 96, kernel_size=11, stride=4, padding=0),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
nn.Conv2d(96, 256, kernel_size=5, padding=2),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
nn.Conv2d(256, 384, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(384, 384, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(384, 256, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
)
self.classifier = nn.Sequential(
nn.Dropout(),
nn.Linear(256 * 6 * 6, 4096),
nn.ReLU(inplace=True),
nn.Dropout(),
nn.Linear(4096, 4096),
nn.ReLU(inplace=True),
nn.Linear(4096, num_classes),
)
def forward(self, x):
x = self.features(x)
x = torch.flatten(x, 1)
x = self.classifier(x)
return x
3.3 데이터셋 준비하기
모델 학습을 위한 데이터셋을 준비합니다. CIFAR-10이나 ImageNet과 같은 데이터셋을 사용할 수 있습니다. 여기서는 CIFAR-10을 예로 들겠습니다.
python
transform = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])
train_dataset = datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
train_loader = DataLoader(dataset=train_dataset, batch_size=32, shuffle=True)
3.4 모델 학습하기
모델 학습을 위한 손실 함수와 옵티마이저를 정의하고, 학습 과정을 진행합니다.
python
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = AlexNet(num_classes=10).to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
for epoch in range(10): # 10 에폭 동안 학습
model.train()
for images, labels in train_loader:
images, labels = images.to(device), labels.to(device)
optimizer.zero_grad()
outputs = model(images)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
print(f'Epoch [{epoch+1}/10], Loss: {loss.item():.4f}')
4. 결론
AlexNet은 단순한 모델이지만, 딥러닝의 발전에 매우 중요한 역할을 했습니다. 데이터셋을 통해 깊이 있는 학습이 가능하다는 것을 보여주었고, 이후 발전된 많은 모델들의 기초가 되었습니다. 이 강좌를 통해 AlexNet의 구조와 PyTorch를 사용한 간단한 구현 예제를 살펴봤습니다. 딥러닝의 길은 멀지만, 기본 개념을 잘 이해하고 나아간다면 더 복잡한 모델도 쉽게 이해할 수 있을 것입니다.
5. 참조 문헌
- AlexNet paper: ImageNet Classification with Deep Convolutional Neural Networks
- PyTorch Documentation: PyTorch Documentation