본문 바로가기

개발

파이토치 튜토리얼 탐방기

YOLO 학습전에 파이토치 튜토리얼로 한번 찬찬히 맛보고 넘어가도록 하겠다.

 

먼저, 지난번에 파이토치 설치하고 나서, Cuda 지원버전인지 확인을 한번 했어야 했는데 그냥 넘어갔다.

 

간단하게

import torch
print(torch.cuda.is_available())

 

명령어를 통해 Cuda가 활용가능한지 확인해 볼 수 있다.

값이 잘찍히는지 확인할 수 있었다.

 

그럼 본격적으로 튜토리얼을 진행해보도록 하겠다.

 

파이토치 튜토리얼은 아래 공홈의 튜토리얼 페이지에서 제공하고있다.

 

https://tutorials.pytorch.kr/?_gl=1*1kgqx6g*_ga*MTI5NzAzNjYyMC4xNzAyNzM1OTc1*_ga_LEHG248408*MTcwMjgxODg3My4yLjEuMTcwMjgxOTY4NC42MC4wLjA.*_ga_LZRD6GXDLF*MTcwMjgxODg2Ny4yLjEuMTcwMjgxOTY4NC42MC4wLjA.*_ga_L5NC8SBFPY*MTcwMjgxODg3My4yLjEuMTcwMjgxOTY4NC42MC4wLjA.

 

파이토치(PyTorch) 한국어 튜토리얼에 오신 것을 환영합니다!

파이토치(PyTorch) 한국어 튜토리얼에 오신 것을 환영합니다. 파이토치 한국 사용자 모임은 한국어를 사용하시는 많은 분들께 PyTorch를 소개하고 함께 배우며 성장하는 것을 목표로 하고 있습니다.

tutorials.pytorch.kr

 

파이토치는 데이터 작업을 위한 기본 요소 두가지를 제공한다.

 

첫 번째는 데이터셋 처리

두 번째는 데이터로더 이다.

 

나도 잘은 모르지만 결국 A/I 든 뭐든 데이터셋을 구성하고 데이터를 돌면서 모델에 학습시키는게 주된 업무다 보니 이런걸 지원하는게 파이토치의 역할인것 같다.

 

파이토치는  TorchText, TorchVision  TorchAudio 와 같이 도메인에 특화된 라이버리를 데이터셋과 함께 제공한다.

 

첫 번째로 다룰 튜토리얼에서는 TorchVision을 다룬다고한다. 마침, YOLO를 하는 입장에서 시작이 좋은것 같다.

 

일단은 시키는데로 진행하면서 학습을 진행해보자.

 

데이터셋을 다운로드 받자.

 

아래와 같은 코드를 실행을시키면, 데이터 다운로드가 시작된다.

import torch
from torch import nn
from torch.utils.data import DataLoader
from torchvision import datasets
from torchvision.transforms import ToTensor

# 공개 데이터셋에서 학습 데이터를 내려받습니다.
training_data = datasets.FashionMNIST(
    root="data",
    train=True,
    download=True,
    transform=ToTensor(),
)

# 공개 데이터셋에서 테스트 데이터를 내려받습니다.
test_data = datasets.FashionMNIST(
    root="data",
    train=False,
    download=True,
    transform=ToTensor(),
)

 

그럼 아래와 같이 다운로드가 완료 되고 data 폴더와 그 하부의 데이터가 자동으로 생성된다.

 

폴더를 열어보면 FashionMNIST 데이터를 받아서 저장했다. 파이토치는 라이브러리를 데이터셋과 함께 제공한다. 이 튜토리얼에서는 TorchVision 데이터셋을 사용하도록 한다.

파이토치가 제공하는 데이터셋은 아래 페이지에서 전체 목록을 확인할 수 있다.

https://pytorch.org/vision/stable/datasets.html

 

Datasets — Torchvision 0.16 documentation

Shortcuts

pytorch.org

 

튜토리얼 전문을 가져와보자.

 

import torch
from torch import nn
from torch.utils.data import DataLoader
from torchvision import datasets
from torchvision.transforms import ToTensor

# 공개 데이터셋에서 학습 데이터를 내려받습니다.
training_data = datasets.FashionMNIST(
    root="data",
    train=True,
    download=True,
    transform=ToTensor(),
)

# 공개 데이터셋에서 테스트 데이터를 내려받습니다.
test_data = datasets.FashionMNIST(
    root="data",
    train=False,
    download=True,
    transform=ToTensor(),
)

batch_size = 64

# 데이터로더를 생성합니다.
train_dataloader = DataLoader(training_data, batch_size=batch_size)
test_dataloader = DataLoader(test_data, batch_size=batch_size)

for X, y in test_dataloader:
    print(f"Shape of X [N, C, H, W]: {X.shape}")
    print(f"Shape of y: {y.shape} {y.dtype}")
    break

# 학습에 사용할 CPU나 GPU, MPS 장치를 얻습니다.
device = (
    "cuda"
    if torch.cuda.is_available()
    else "mps"
    if torch.backends.mps.is_available()
    else "cpu"
)
print(f"Using {device} device")

# 모델을 정의합니다.
class NeuralNetwork(nn.Module):
    def __init__(self):
        super().__init__()
        self.flatten = nn.Flatten()
        self.linear_relu_stack = nn.Sequential(
            nn.Linear(28*28, 512),
            nn.ReLU(),
            nn.Linear(512, 512),
            nn.ReLU(),
            nn.Linear(512, 10)
        )

    def forward(self, x):
        x = self.flatten(x)
        logits = self.linear_relu_stack(x)
        return logits

model = NeuralNetwork().to(device)
print(model)

loss_fn = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=1e-3)

def train(dataloader, model, loss_fn, optimizer):
    size = len(dataloader.dataset)
    for batch, (X, y) in enumerate(dataloader):
        X, y = X.to(device), y.to(device)

        # 예측 오류 계산
        pred = model(X)
        loss = loss_fn(pred, y)

        # 역전파
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        if batch % 100 == 0:
            loss, current = loss.item(), (batch + 1) * len(X)
            print(f"loss: {loss:>7f}  [{current:>5d}/{size:>5d}]")

           
def test(dataloader, model, loss_fn):
    size = len(dataloader.dataset)
    num_batches = len(dataloader)
    model.eval()
    test_loss, correct = 0, 0
    with torch.no_grad():
        for X, y in dataloader:
            X, y = X.to(device), y.to(device)
            pred = model(X)
            test_loss += loss_fn(pred, y).item()
            correct += (pred.argmax(1) == y).type(torch.float).sum().item()
    test_loss /= num_batches
    correct /= size
    print(f"Test Error: \n Accuracy: {(100*correct):>0.1f}%, Avg loss: {test_loss:>8f} \n")


epochs = 5
for t in range(epochs):
    print(f"Epoch {t+1}\n-------------------------------")
    train(train_dataloader, model, loss_fn, optimizer)
    test(test_dataloader, model, loss_fn)
print("Done!")


torch.save(model.state_dict(), "model.pth")
print("Saved PyTorch Model State to model.pth")

model = NeuralNetwork().to(device)
model.load_state_dict(torch.load("model.pth"))

classes = [
    "T-shirt/top",
    "Trouser",
    "Pullover",
    "Dress",
    "Coat",
    "Sandal",
    "Shirt",
    "Sneaker",
    "Bag",
    "Ankle boot",
]

model.eval()
x, y = test_data[0][0], test_data[0][1]
with torch.no_grad():
    x = x.to(device)
    pred = model(x)
    predicted, actual = classes[pred[0].argmax(0)], classes[y]
    print(f'Predicted: "{predicted}", Actual: "{actual}"')

 

대충 돌려봤는데 세부적으로 설명을 하자면 너무 길고 대충 느낌만 가져가자.

 

굉장히 일반적으로 영상인식 모델을 적용하는 방식으로 보여지고 YOLO로 여기에서 크게 벗어나지 않을 것으로 예상된다.

 

 

나의 GTX 1080을 작 인식하고 5번의 epoch를 잘 숭해하며 64.7%의 정확도를 보이며 잘 학습이 되는걸 확인 할 수 있었다.

 

이제 바로 YOLO로 넘어가도록 하겠다.

728x90
반응형
LIST

'개발' 카테고리의 다른 글

플러터참조  (0) 2024.01.10
YOLOv8 to tflite  (1) 2023.12.20
YOLOv8 맛보기  (1) 2023.12.20
정비지원시스템개발(2)  (1) 2023.12.17
정비지원시스템 개발  (2) 2023.12.16