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))
반응형