만들 면서 배우는 파이 토치 딥 러닝

만들며 배우는 파이토치 딥 러닝

소개

파이토치(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 데이터 셋에 대해 딥 러닝 모델을 만들고 학습하는 과정을 배워보았습니다. 데이터 전처리, 모델 구현, 학습 및 평가라는 딥 러닝 학습의 주요 개념들에 대해 익숙해졌다면 이제 다른 데이터 셋들에 대해서도 적용해보시길 권장합니다.