딥러닝은 인공지능 및 머신러닝의 한 분야로, 사람의 뇌를 모사한 인공신경망을 기반으로 하고 있습니다.
많은 데이터와 강력한 컴퓨팅 파워의 발전 덕분에 딥러닝 기술이 과거보다 훨씬 더 많은 주목을 받고 있습니다.
특히, 파이토치는 딥러닝 프레임워크 중 하나로, 사용의 용이성과 유연성 덕분에 많은 연구자와 개발자들이 선호하고 있습니다.
이번 포스트에서는 파이토치를 이용한 모델 정의에 대해 깊이 있게 알아보겠습니다.
1. 딥러닝 모델 이해하기
딥러닝 모델은 입력 데이터에 대한 예측을 수행하기 위해 여러 층의 신경망을 사용하는 알고리즘입니다.
모델은 입력층, 은닉층, 출력층으로 구성되며, 각 층은 신경망의 노드(뉴런)로 이루어져 있습니다.
1.1 신경망의 기본 구조
기본적인 신경망은 다음과 같은 요소로 구성됩니다:
- 입력층: 모델에 들어오는 데이터를 받는 층입니다.
- 은닉층: 입력된 정보를 처리하는 층으로, 여러 층을 쌓을 수 있습니다.
- 출력층: 최종적인 예측 결과를 출력하는 층입니다.
2. 파이토치 설치하기
파이토치를 사용하기 위해 먼저 설치해야 합니다. 파이썬 패키지 관리 도구인 pip를 사용하여 설치할 수 있습니다.
아래 명령어를 터미널에 입력하여 설치해 주세요:
pip install torch torchvision
3. 모델 정의하기
파이토치에서 모델을 정의하는 방식은 매우 직관적입니다. 네트워크의 구조를 정의할 때는 주로
torch.nn.Module
클래스를 상속받아 Custom Module을 만드는 방식으로 진행됩니다.
또한, 모델을 구성하는 torch.nn
모듈을 통해 다양한 레이어와 기능을 사용할 수 있습니다.
3.1 간단한 모델 예제
아래의 예제는 간단한 다층 퍼셉트론(MLP) 모델을 정의하는 코드입니다. 이 모델은
입력으로 784차원 벡터를 받아 10차원 벡터(0-9 숫자 분류)를 출력하는 구조입니다.
import torch
import torch.nn as nn
import torch.optim as optim
# 모델 정의
class MLP(nn.Module):
def __init__(self):
super(MLP, self).__init__()
self.fc1 = nn.Linear(784, 128) # 입력 레이어
self.fc2 = nn.Linear(128, 64) # 은닉 레이어
self.fc3 = nn.Linear(64, 10) # 출력 레이어
self.relu = nn.ReLU() # ReLU 활성화 함수
self.softmax = nn.Softmax(dim=1) # 소프트맥스 함수
def forward(self, x):
x = self.fc1(x) # 입력층 -> 은닉층1
x = self.relu(x) # 활성화
x = self.fc2(x) # 은닉층1 -> 은닉층2
x = self.relu(x) # 활성화
x = self.fc3(x) # 은닉층2 -> 출력층
return self.softmax(x) # 소프트맥스 적용
위의 코드에서, MLP
클래스는 신경망 모델을 정의합니다. 그 안에는 세 개의 선형 레이어와 두 개의 ReLU 활성화 레이어가 포함됩니다. 모델의 forward
메소드는 데이터가 네트워크를 통해 흐르는 방식을 정의합니다.
3.2 모델 학습하기
모델을 정의한 후에는 데이터를 통해 학습시켜야 합니다. 이를 위해 손실 함수와 최적화 알고리즘을 설정해야 합니다.
일반적으로 다중 클래스 분류의 경우, 교차 엔트로피 손실 함수와 Adam 옵티마이저를 많이 사용합니다.
# 손실 함수와 옵티마이저 설정
model = MLP()
criterion = nn.CrossEntropyLoss() # 손실 함수
optimizer = optim.Adam(model.parameters(), lr=0.001) # Adam 옵티마이저
이후, 모델을 학습시키기 위해 많은 반복을 거치게 됩니다. 아래 코드는 전체 학습 과정의 예를 보여줍니다.
MNIST 데이터셋을 사용하여 10,000회 반복 학습을 수행합니다.
주의해야 할 점은 데이터를 미니 배치 단위로 나누어 학습시키는 것입니다.
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
# 데이터셋 및 로더 설정
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))])
train_dataset = datasets.MNIST(root='./data', train=True, transform=transform, download=True)
train_loader = DataLoader(dataset=train_dataset, batch_size=64, shuffle=True)
# 모델 학습
for epoch in range(5): # 5 에포크 동안 학습
for i, (images, labels) in enumerate(train_loader):
optimizer.zero_grad() # 기울기 초기화
outputs = model(images.view(-1, 784)) # 이미지를 784 차원 벡터로 평탄화
loss = criterion(outputs, labels) # 손실 계산
loss.backward() # 역전파
optimizer.step() # 가중치 업데이트
if (i+1) % 100 == 0: # 100터 배치마다 기록
print(f'에포크 [{epoch+1}/5], 배치 [{i+1}/{len(train_loader)}], 손실: {loss.item():.4f}')
4. 다양한 모델 구조
위의 예시는 간단한 다층 퍼셉트론 모델을 정의했지만, 실제 딥러닝에서는 다양한 모델 구조가 필요합니다.
두 번째 예시로 합성곱 신경망(CNN)을 정의하는 방법을 살펴보겠습니다.
4.1 합성곱 신경망(CNN) 정의하기
이미지 데이터를 처리하는 데 널리 사용되는 합성곱 신경망은 다음과 같은 구조로 정의됩니다.
class CNN(nn.Module):
def __init__(self):
super(CNN, self).__init__()
self.conv1 = nn.Conv2d(1, 32, kernel_size=3, stride=1, padding=1) # 합성곱 레이어
self.conv2 = nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1)
self.pool = nn.MaxPool2d(kernel_size=2, stride=2) # 맥스풀링 레이어
self.fc1 = nn.Linear(64 * 7 * 7, 128) # 선형 레이어
self.fc2 = nn.Linear(128, 10)
def forward(self, x):
x = self.pool(F.relu(self.conv1(x))) # 첫 번째 합성곱 + 활성화 + 풀링
x = self.pool(F.relu(self.conv2(x))) # 두 번째 합성곱 + 활성화 + 풀링
x = x.view(-1, 64 * 7 * 7) # 평탄화
x = F.relu(self.fc1(x)) # 선형 레이어 + 활성화
x = self.fc2(x) # 출력 레이어
return x
5. 결론
이번 포스트에서는 파이토치에서의 모델 정의 방법에 대해 알아보았습니다.
위에서 다룬 코드는 기본적인 신경망부터 CNN에 이르기까지 다양하게 응용될 수 있습니다.
딥러닝의 기초를 이해하고, 모델 정의에 대한 이해가 깊어지면 더 복잡한 문제를 해결할 수 있는 기초가 될 것입니다.
앞으로도 딥러닝의 다양한 기술들을 배우고 실습하여 많은 경험을 쌓아보시기 바랍니다.
6. 참고 자료
– PYTorch 공식 문서: https://pytorch.org/docs/stable/index.html
– 딥러닝 입문서: “Deep Learning” by Ian Goodfellow, Yoshua Bengio, Aaron Courville