만들며 배우는 파이토치 딥 러닝
소개
파이토치(PyTorch)는 딥 러닝 프레임워크 중 하나로, 딥 러닝 모델을 쉽게 구현하고 학습할 수 있는 도구입니다. 이번 포스팅에서는 파이토치 딥 러닝 모델을 만들면서 배워보겠습니다.
시작하기에 앞서
파이토치를 사용하기 위해서는 파이썬 기본 지식이 필요합니다. 또한, 딥 러닝의 이론적인 부분을 이해하는 것이 도움이 됩니다. 파이토치를 설치하고 시작해봅시다.
1. 데이터 준비
데이터 준비는 딥 러닝 모델 학습의 가장 중요한 부분 중 하나입니다. 실제로는 데이터 전처리, 라벨링, 정규화 등 다양한 작업이 필요합니다. 이번 예제에서는 MNIST 데이터 셋을 사용합니다.
“`python
import torch
import torchvision
import torchvision.transforms as transforms
transform = transforms.Compose(
[transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,))])
trainset = torchvision.datasets.MNIST(root=’./data’, train=True,
download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,
shuffle=True, num_workers=2)
testset = torchvision.datasets.MNIST(root=’./data’, train=False,
download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=4,
shuffle=False, num_workers=2)
classes = (‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’)
“`
위 코드에서는 먼저 transform을 정의합니다. transforms.Compose 함수를 사용하여 여러 개의 transform 함수를 결합할 수 있습니다. ToTensor() 함수는 PIL 이미지나 numpy ndarray를 torch.Tensor로 변환하고 이미지 픽셀의 크기를 0~1 사이의 값을 갖게 하기 위해 정규화합니다.
MNIST 데이터 셋은 기본적으로 28×28 픽셀의 흑백 숫자 이미지로 이루어져 있습니다. trainloader와 testloader를 통해 데이터 셋을 불러온 후, 데이터를 4개 단위로 batch로 나누어 학습하도록 설정합니다.
2. 모델 생성
“`python
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):
def init(self):
super(Net, self).init()
self.conv1 = nn.Conv2d(1, 6, 5)
self.pool = nn.MaxPool2d(2, 2)
self.conv2 = nn.Conv2d(6, 16, 5)
self.fc1 = nn.Linear(16 * 4 * 4, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 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, 16 * 4 * 4)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
net = Net()
“`
위 코드는 크게 두 가지 부분으로 나눌 수 있습니다.
첫째, 클래스 Net(nn.Module)를 정의합니다. 이 클래스를 통해 모델 구조를 정의할 수 있습니다. 이 예제에서는 2개의 컨볼루션 계층, 3개의 완전 연결 계층으로 이루어진 모델을 생성합니다.
둘째, 생성한 모델을 인스턴스화합니다.
3. 모델 학습
“`python
import torch.optim as optim
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
for epoch in range(2): # 데이터셋을 수차례 반복합니다.
running_loss = 0.0
for i, data in enumerate(trainloader, 0):
# 입력을 받아들입니다.
inputs, labels = data
# 변수에 그래디언트를 0으로 설정합니다.
optimizer.zero_grad()
# 순전파 + 역전파 + 최적화를 한 후
outputs = net(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
# 통계를 출력합니다.
running_loss += loss.item()
if i % 2000 == 1999: # print every 2000 mini-batches
print('[%d, %5d] loss: %.3f' %
(epoch + 1, i + 1, running_loss / 2000))
running_loss = 0.0
print(‘Finished Training’)
“`
위 코드는 크게 3가지 부분으로 나눌 수 있습니다.
첫째, criterion과 optimizer를 정의합니다.
둘째, for 문을 사용하여 epoch 반복을 시작합니다. training loop를 정의합니다.
셋째, 변수 optimizer에서 설정한 대로 최적화 과정이 반복되므로, 이를 통해 모델을 학습합니다.
4. 모델 평가
“`python
correct = 0
total = 0
with torch.no_grad():
for data in testloader:
images, labels = data
outputs = net(images)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
print(‘Accuracy of the network on the 10000 test images: %d %%’ % (
100 * correct / total))
“`
마지막으로 학습한 모델을 평가합니다. 모든 테스트 데이터에 대한 예측이 진행되며, 정확도를 계산합니다.
결론
파이토치를 이용하여 MNIST 데이터 셋에 대해 딥 러닝 모델을 만들고 학습하는 과정을 배워보았습니다. 데이터 전처리, 모델 구현, 학습 및 평가라는 딥 러닝 학습의 주요 개념들에 대해 익숙해졌다면 이제 다른 데이터 셋들에 대해서도 적용해보시길 권장합니다.