파이토치를 학습하실 때, 가장 중요한 것은 모든 함수를 익히실 필요가 없습니다.

기본 함수와 딥러닝 흐름만 알고서, 여러 예제들을 통해서 모르는 함수들을 찾고 이해하고 응용하는 과정이 가장 중요합니다.

 

그렇다면, 좋은 예제들이 필요한데요...

 

웹에 여러 개발자들이 작성한 코드로 공부하시는 것은 절대적으로 비추합니다.

사람 말에도 억양과 사투리가 있듯이, 코드도 자신만의 방법이 있기 때문입니다.

 

그렇기 때문에, 서적이나 공식 사이트에 나와 있는 예제들로 먼저 학습을 하시고, 완벽히 이해하시고, 나만의 코드로 응용시키는 작업이 중요하다고 감히 말씀드리겠습니다.

 

일단 밑에 나와 있는 사이트는

 

pytorch.org/tutorials/beginner/deep_learning_60min_blitz.html

 

Deep Learning with PyTorch: A 60 Minute Blitz — PyTorch Tutorials 1.6.0 documentation

 

pytorch.org

파이토치가 제공하는 예제 사이트입니다. 영어로 학습하시는 것이 불편하신 분들은...

 

tutorials.pytorch.kr/beginner/deep_learning_60min_blitz.html

 

파이토치(PyTorch)로 딥러닝하기: 60분만에 끝장내기 — PyTorch Tutorials 1.6.0 documentation

Shortcuts

tutorials.pytorch.kr

를 들어가시면, 위에 사이트를 한글로 잘 번역되어 있습니다. 물론, 모든 문서가 번역되어있지는 않지만 그래도 주요 예제들은 한글로 잘 번역되어있습니다.

그럼 여기 사이트에서 관심 있는 분야들을 공부하시고... 이렇게 배운 코드를 활용하는 방법에 대해서 설명드리도록 하겠습니다.

먼저, 응용을 하기 위한 응용 예제인 분류기 학습용(CIFAR-10)을 택하였습니다.

 

tutorials.pytorch.kr/beginner/blitz/cifar10_tutorial.html?highlight=cifar

 

분류기(Classifier) 학습하기 — PyTorch Tutorials 1.6.0 documentation

Note Click here to download the full example code 분류기(Classifier) 학습하기 지금까지 어떻게 신경망을 정의하고, 손실을 계산하며 또 가중치를 갱신하는지에 대해서 배웠습니다. 이제 아마도 이런 생각을 �

tutorials.pytorch.kr

분류기 학습으로 응용 방법을 설명드리겠습니다.

아마 케라스, 텐서플로를 통해서 접해보신 분들은 CIFAR10 프로젝트라고 이미 알고 계실 겁니다.

10개 이미지를 분류하여 학습하는 프로젝트입니다. 처음 보시거나 모르시는 분들은, 밑에 나와있는 코드들을 보면서 이해하시면 됩니다.

 

그럼 코드를 통해서 한번 확인해보겠습니다.

(참고로, 지금 아래에 나와 있는 코드는 사이트에 있는 코드를 그대로 가져왔습니다.)

 

먼저 필요 모듈을 불러와줍니다.

import torch
import torchvision
import torchvision.transforms as transforms

파이토치를 사용할 것이기 때문에 당연히 torch 모듈을 불러주었고요..

torchvision은 이미지(영상)를 다루기 위한 torch의 모듈입니다.

그리고 transform은 이미지를 변형하기 위한 torchvision의 내장 함수입니다.

 

다음은 데이터를 불러와서 데이터를 정규화해주는 과정입니다.

transform = transforms.Compose(
    [transforms.ToTensor(),
     transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

trainset = torchvision.datasets.CIFAR10(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.CIFAR10(root='./data', train=False,
                                       download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=4,
                                         shuffle=False, num_workers=2)

classes = ('plane', 'car', 'bird', 'cat',
           'deer', 'dog', 'frog', 'horse', 'ship', 'truck')

 

transforms.ToTensor() : 데이터 타입을 텐서 형태로 변경(이미지 0~255 값을 0~1 값으로 바꿔)

transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]) : 이미지 값을 -1과 1 사이의 값으로 정규화하는 과정입니다.

datasets.CIFAR10 : root 해당 경로에 CIFAR10 데이터를 저장(해당 경로가 있으면 데이터 읽어옴) train =True/False (train_data / test_data), download 여부(데이터셋이 없을 때), transform : 미리 지정한 transform 사용

DataLoader : 기존에 지정한 데이터셋들에, batch_size 단위로 나눠주고, shuffle로 데이터를 섞을지 지정해주고, num_worker를 지정해줍니다. num_workers는 학습 중에 cpu 작업을 몇 개의 코어를 사용할지 설정하는 파라미터입니다.

(그냥 넘어가셔도 됩니다. 컴퓨터 환경을 잘 아시는 분들은, 해당 환경에서 사용 가능한 코어의 개수를 넣어주시면 됩니다.)

(windows 환경에서 에러가 나면 num_workers=0으로 설정)

 

다음은 우리가 지정한 데이터를 확인하는 과정입니다. (넘어가셔도 됩니다)

import matplotlib.pyplot as plt
import numpy as np

# 이미지를 보여주기 위한 함수

def imshow(img):
    img = img / 2 + 0.5     # unnormalize
    npimg = img.numpy()
    plt.imshow(np.transpose(npimg, (1, 2, 0)))
    plt.show()


# 학습용 이미지를 무작위로 가져오기
dataiter = iter(trainloader)
images, labels = dataiter.next()

# 이미지 보여주기
imshow(torchvision.utils.make_grid(images))
# 정답(label) 출력
print(' '.join('%5s' % classes[labels[j]] for j in range(4)))

이미지를 보여주기 위해서, matplotlib을 사용하였고, imshow 함수를 만들어 랜덤 한 이미지를 보여줍니다.

(iter, next() 함수는 파이썬 내장 함수이므로, 모르시는 분들은 따로 찾아 학습하시길....)

 

다음 함수는, 토치에서 사용할 모델을 만드는 과정입니다.

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(3, 6, 5)
        self.pool = nn.MaxPool2d(2, 2)
        self.conv2 = nn.Conv2d(6, 16, 5)
        self.fc1 = nn.Linear(16 * 5 * 5, 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 * 5 * 5)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x


net = Net()

Conv2d : 컨볼루션(convolution) 레이어로써 영상처리 분야에 CNN을 구현할 때, 주로 사용합니다.

MaxPool2d : 영상 CNN에서 특징을 뽑아낼 때, 사용합니다.

 

다음은 비용 함수와 옵티마이저를 설정해 주는 과정입니다.

import torch.optim as optim

criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)

비용 함수로는 다중 분류에 많이 사용하는 CrossEntropyLoos 함수를 설정하였고,

옵티마이저는 SGD(확률적 경사 하강)을 사용합니다.

 

다음은, 우리가 만든 데이터셋, 모델, 비용 함수 옵티마이저를 통해서 학습을 진행하는 과정입니다.

for epoch in range(2):   # 데이터셋을 수차례 반복합니다.

    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        # [inputs, labels]의 목록인 data로부터 입력을 받은 후;
        inputs, labels = data

        # 변화도(Gradient) 매개변수를 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')

그럼 다음 포스팅에서, 어떻게 응용할 수 있는지 확인해보도록 하겠습니다.

반응형

+ Recent posts