본문 바로가기
수업 복습/머신러닝과 딥러닝

데이터 로더

by 김복칠 2024. 1. 16.

1. 데이터 로더(Data Loader)

  • 데이터 양이 많을 때 배치 단위로 학습하는 방법

2. 손글씨 인식 모델 만들기

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split

device = 'cuda' if torch.cuda.is_available() else 'cpu'

digits = load_digits()

x_data = digits['data']
y_data = digits['target']

x_data = torch.FloatTensor(x_data)
y_data = torch.LongTensor(y_data)

x_train, x_test, y_train, y_test = train_test_split(x_data, y_data, test_size=0.2, random_state=2024)

loader = torch.utils.data.DataLoader(
    dataset = list(zip(x_train, y_train)), # 받아서 확인할 데이터 종류(?)가 두개인 경우 zip 으로 묶어줌
    batch_size = 64,
    shuffle = True
)
# drop_last=False : 마지막 짜투리(64개 미만의 데이터)를 학습한다는 뜻

model = nn.Sequential(
    nn.Linear(64,10)
)
optimizer = optim.Adam(model.parameters(), lr=0.01)
  • 이전 수업에서 배웠던 학습과정을 사이킷런에서 제공하는 손글씨 데이터셋에 접목시켜 분석을 진행해 보겠습니다
  • 데이터를 받아온 뒤 데이터를 나누어 줍니다
  • 이후 타입을 Tensor로 바꾸어 주는데 결과를 다항으로 반환받아야 하기 때문에 y_data는 LongTensor()함수를 사용해줍니다
  • 이후 데이터를 train, test 로 나누어 주고 학습데이터를 데이터 로더를 만들어서 넣어줍니다
  • 데이터 양이 많기 때문에 학습하고자 하는 데이터를 나누어서 순차대로 학습을 시켜주기 위함입니다
  • 이후 모델을 만들어 optimizer를 생성해 줍니다
  • 이때 모델의 input이 64인 이유는 위에서 데이터로더 생성 때 나누어서 입력받을 데이터를 64로 설정해 주었기 때문입니다
  • 경사하강법은 Adam을 사용해 줍니다
epochs = 50

for epoch in range(epochs + 1):
    sum_losses = 0
    sum_accs = 0

    for x_batch, y_batch in loader:     # 전체 데이터를 64개씩 뽑아서 돌림
        y_pred = model(x_batch)
        loss = nn.CrossEntropyLoss()(y_pred, y_batch)

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

        sum_losses = sum_losses+loss

        y_prob = nn.Softmax(1)(y_pred)
        y_pred_index = torch.argmax(y_prob, axis=1)
        acc = (y_batch == y_pred_index).float().sum() / len(y_batch) * 100
        sum_accs = sum_accs + acc

    avg_loss = sum_losses / len(loader)
    avg_acc = sum_accs / len(loader)
    print(f'Epoch {epoch:4d}/{epochs} Loss : {avg_loss:.6f} Accuracy : {avg_acc:.2f}')
    
y_pred = model(x_test)
y_prob = nn.Softmax(1)(y_pred)

y_pred_index = torch.argmax(y_prob, axis=1)
accuracy = (y_test == y_pred_index).float().sum() / len(y_test) * 100
print(f'테스트 정확도는 {accuracy:.2f}% 입니다')
# 결과 : 테스트 정확도는 96.11% 입니다
  • 이전 과정과 동일하게 학습을 시켜준 뒤 결과를 확인하기 위해 model에 x_test 데이터를 넣어서 y_pred 를 만들어 줍니다
  • 그리고 단일 결과를 가장 잘 향상신켜주는 비선형 활성화 함수인 Softmax() 함수를 통해 y_prob 을 통해 결과를 확인해 줍니다

 

'수업 복습 > 머신러닝과 딥러닝' 카테고리의 다른 글

비선형 활성화 함수  (0) 2024.01.17
딥러닝  (0) 2024.01.16
파이토치로 구현한 논리회귀  (0) 2024.01.12
파이토치로 구현한 선형회귀  (2) 2024.01.09
파이토치  (1) 2024.01.09