인공지능/파이토치

파이토치 - Dataset과 DataLoader

해피밀세트 2020. 7. 20. 16:33
반응형

 

 

 

  • 파이토치에는 Dataset과 DataLoader라는 기능이 있어서 미니 배치 학습이나 데이터 셔플, 병렬 처리 까지 간단히 수행할 수 있다.
  • TensorDataset은 Dataset을 상속한 클래스로 학습 데이터 X와 레이블 Y를 묶어 놓는 컨테이너이다.
  • TensorDataset을 DataLoader에 전달하면 for 루프에서 데이터의 일부분만 간단히 추출할 수 있게 된다.
  • TensorDataset에는 텐서만 전달할 수 있으며, Variable은 전달할 수 없으니 주의
  • Dataset은 직접 작성할 수도 있어서 대량의 이미지 파일을 한 번에 메모리에 저장하지 않고 필요할 때마다 읽어서 학습하는 등 다양하게 활용할 수 있다.

 

TensorDataset을 DataLoader에 전달해서 데이터의 일부만 간단히 추출

 

# 라이브러리 불러오기

import torch

from torch import nn, optim

from torch.utils.data import TensorDataset, DataLoader

from sklearn.datasets import load_digits

digits = load_digits()

# 독립변수, 종속변수 분리

X = digits.data

Y = digits.target

# Numpy의 ndarray를 파이토치의 텐서로 변환

X = torch.tensor(X, dtype=torch.float32)

Y = torch.tensor(Y, dtype=torch.int64)

# Dataset 작성

ds = TensorDataset(X, Y)

# 순서로 섞어서 64개씩 데이터를 변환하는 DataLoader 작성

loader = DataLoader(ds, batch_size=64, shuffle=True)

# 네트워크 구성

net = nn.Sequential(

    nn.Linear(6432),

    nn.ReLU(),

    nn.Linear(3216),

    nn.ReLU(),

    nn.Linear(1610)

)

# 최적화

loss_fn = nn.CrossEntropyLoss()

optimizer = optim.Adam(net.parameters())

# 최적화 실행

losses = []

for epoch in range(10):

  running_loss = 0.0

  for xx, yy in loader :

    # xx, yy는 64개만 받는다.

    y_pred = net(xx)

    loss = loss_fn(y_pred, yy)

    optimizer.zero_grad()

    loss.backward()

    optimizer.step()

    running_loss += loss.item()

  losses.append(running_loss)

 

반응형