PyTorch의 Dataset과 DataLoader를 이용하면 학습을 위한 방대한 데이터를 미니배치 단위로 처리할 수 있고, 데이터를 무작위로 섞음으로써 학습의 효율성을 향상시킬 수 있다. 또한 데이터를 여러개의 GPU를 사용해 병렬처리로 학습할 수도 있다. 아래의 코드는 Dataset과 DataLoader를 사용하지 않고 매 에폭마다 학습 데이터 전체를 입력해 학습하는 코드이다.
import torch from torch import nn, optim from sklearn.datasets import load_iris from torch.utils.data import TensorDataset, DataLoader iris = load_iris() X = iris.data[:100] y = iris.target[:100] X = torch.tensor(X, dtype=torch.float32) y = torch.tensor(y, dtype=torch.float32) net = nn.Linear(4, 1) loss_fn = nn.BCEWithLogitsLoss() optimizer = optim.SGD(net.parameters(), lr=0.25) losses = [] for epoc in range(100): batch_loss = 0.0 optimizer.zero_grad() y_pred = net(X) loss = loss_fn(y_pred.view_as(y), y) loss.backward() optimizer.step() batch_loss += loss.item() losses.append(batch_loss) from matplotlib import pyplot as plt plt.plot(losses) plt.show()
위의 코드에 대한 손실 그래프는 다음과 같다.
다음 코드는 위의 코드에 대해서 Dataset과 DataLoader를 적용한 코드이다. 앞 코드의 하이퍼 파라메터 등에 대한 모든 조건은 동일하고 단지 미니배치를 10로 하여 학습시킨다.
import torch from torch import nn, optim from sklearn.datasets import load_iris from torch.utils.data import TensorDataset, DataLoader iris = load_iris() X = iris.data[:100] y = iris.target[:100] X = torch.tensor(X, dtype=torch.float32) y = torch.tensor(y, dtype=torch.float32) ds = TensorDataset(X, y) loader = DataLoader(ds, batch_size=10, shuffle=True) net = nn.Linear(4, 1) loss_fn = nn.BCEWithLogitsLoss() optimizer = optim.SGD(net.parameters(), lr=0.25) losses = [] for epoc in range(100): batch_loss = 0.0 for xx, yy in loader: optimizer.zero_grad() y_pred = net(xx) loss = loss_fn(y_pred.view_as(yy), yy) loss.backward() optimizer.step() batch_loss += loss.item() losses.append(batch_loss) from matplotlib import pyplot as plt plt.plot(losses) plt.show()
위의 코드에 대한 손실 그래프는 다음과 같다.
손실 그래프를 보면 미니배치를 사용한 것이 더 안정적으로 학습이 진행 되는 것으로 확인할 수 있다.