IT/Machine Learning

pytorch Classifier 튜토리얼 (feat. sklearn, digits, accuracy)

엘티엘 2023. 6. 15. 08:40

pytorch 로 classifier 모델을 만들어보자. 

Data Load

  • sklearn 의 load_digits 함수를 사용해서 데이터를 로딩한다.
  • train, test 데이터를 분리한다
  • train_loader 및 test tensor를 만든다.
from sklearn import datasets
from sklearn.model_selection import train_test_split
from torch.utils.data import TensorDataset, DataLoader, random_split


data = datasets.load_digits()
x_train, x_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.2, random_state=0)

train_set = TensorDataset(torch.tensor(x_train).float(), torch.tensor(y_train).long())
train_loader = DataLoader(train_set, batch_size=128)

x_test = torch.tensor(x_test).float()
y_test = torch.tensor(y_test).long()

Model, Loss function, Optimizer 만들기

  • model, loss function, optimizer를 만든다.
  • model 내 마지막 softmax 가 없음을 주의한다 (cross_entropy 계산시 softmax 자동 적용)
model = nn.Sequential(
    nn.Linear(data.data.shape[-1], len(set(data.target)))
)
loss_fn = nn.functional.cross_entropy
optimizer= torch.optim.SGD(model.parameters(), lr=0.001)

학습하기

  • train 함수를 정의하고 학습을 수행한다.
  • loss=0.013
  • y가 1D tensor 임을 주의한다 (model의 output tensor와 차원이 다름)
def train(loader, model, loss_fn, optimizer):
  epoch=1000
  print_num=100

  for e in range(epoch):
    for i, (x, y) in enumerate(loader):
      pred = model(x)
      loss = loss_fn(pred, y)

      optimizer.zero_grad()
      loss.backward()
      optimizer.step()

    if e % print_num == 0:
      print(e, loss.item())
  print(e, loss.item())
  
train(train_loader, model, loss_fn, optimizer)

Accuracy 확인하기

  • test 데이터를 활용해 성능을 측정한다.
  • pytorch 는 기본적으로 accuracy 계산 패키지가 없기 떄문에 torchmetrics 패키지를 사용한다.
import torchmetrics

with torch.no_grad():
  model.eval()
  accuracy = torchmetrics.Accuracy(task="multiclass", num_classes=len(set(data.target)))

  pred = model(x_test)
  print(accuracy(pred, y_test))

 

반응형