관리 메뉴

ComputerVision Jack

PyTorch Lecture 08 : DataLoader 본문

DeepLearning/Pytorch_ZeroToAll

PyTorch Lecture 08 : DataLoader

JackYoon 2020. 10. 21. 14:41
반응형

Batch(Batch size)

앞에 저희가 처리했떤 당뇨 데이터인 경우 데이터의 사이즈가 그리 크지 않습니다. 하지만 딥러닝을 적용할 경우 데이터의 용량이 거대해지는 경우가 발생합니다. 이럴 경우 Batch와 Dataloader를 통하여 해결할 수 있습니다.

 

Epoch

에폭의 경우 반복을 이용하여 데이터 전체를 한번 학습 시킨것을 지칭합니다.

batch size

batch size경우 해당 데이터셋을 사용자가 지정한 만큼 자른 것을 의미합니다. 따라서 1000개의 데이터가 존재할때 batch size500으로 한다면 1 Epoch을 적용할 경우 2번의 반복을 돌아야합니다.

DataLoader

데이터 로더

시퀀스적으로 보면 해당 데이터가 들어오면 셔플 적용여부를 선택하고 큐에 데이터가 들어갑니다. 그 다음 각각 큐에 존재하는 데이터에 대하여 반복을 진행합니다. 하지만 데이터 로더를 사용하면 Queue까지 스스로 구현이 되기 때문에 우리는 반복에 대한 부분만 처리해주면 됩니다.

Custom DataLoader

따라서 데이터 로더를 사용할 경우, 우리는 해당 데이터 셋에 대한 클래스를 제작하여 객체와 메소드로 접근합니다. 그 과정에서 다음과 같은 3개의 주의점이 있습니다.

  • def __init__(self): -> 데이터셋의 다운로드와 데이터셋을 읽어오는 작업을 담당합니다.
  • def __getitem__(self, index): -> 해당 인덱스에 대한 item을 반환합니다
  • def __len__(self): -> 해당 데이터의 총 길이를 반환합니다.

그럼 전 시간에 배운 당뇨 데이터를 dataLoader를 사용하여 구현해보겠습니다.

[08.dataset_loade_logistic.py]

from google.colab import files

uploaded = files.upload()

# 데이터를 코렙 환경에 로드하기 위해 import 합니다.

 

from torch.utils.data import Dataset, DataLoader

from torch import nn, from_numpy, optim

import numpy as np

#DataLoader를 사용하기위한 torch util과 모델 구현에 필요한 라이브러리를 import합니다.

 

class DiabetesDataset(Dataset):

    #Initialize your data, download, etc

    def __init__(self):

        xy = np.loadtxt('diabetes.csv.gz', delimiter=',', dtype = np.float32)

        self.len = xy.shape[0]

        self.x_data = from_numpy(xy[:, 0:-1])

        self.y_data = from_numpy(xy[:, [-1]])

    

    def __getitem__(self, index):

        return self.x_data[index], self.y_data[index]

 

    def __len__(self):

        return self.len

#데이터 셋에 대한 class를 생성합니다. __init__생성자 부분에선 데이터를 읽어오고, x_data, y_data를 생성합니다.

다음 __getitem__ 부분에선 인덱스에 대한 item을 뽑아오고, __len__에 대해선 해당 데이터의 길이를 추출합니다.

 

dataset = DiabetesDataset()

#해당 데이터 클래스의 객체를 생성합니다.

 

train_loader = DataLoader(dataset = dataset, batch_size = 32, shuffle = True, numworkers = 2)

#해당 데이터를 이용하여 DataLoader를 생성합니다. batch_size를 설정하고, shuffle(섞어서) 큐에 들어가게 합니다.

 

class Model(nn.Module):

    def __init__(self):

        super(Model, self).__init__()

        self.l1 = nn.Linear(8, 6)

        self.l2 = nn.Linear(6, 4)

        self.l3 = nn.Linear(4, 1)

        self.sigmoid = nn.Sigmoid()

 

    def forward(self, x):

        out1 = self.sigmoid(self.l1(x))

        out2 = self.sigmoid(self.l2(out1))

        y_pred = self.sigmoid(self.l3(out2))

        return y_pred

# logistic model class를 생성합니다. 전 시간에 포스팅 한것처럼 깊게 네트워크를 형성하겠습니다.

 

model = Model()

# 해당모델에 대한 객체를 생성합니다.

 

criterion = nn.BCELoss(reduction = 'sum')

optimizer = optim.SGD(model.parameters(), lr = 0.1)

# 해당 모델에 대한 손실함수와 최적화를 구현합니다.

 

for epoch in range(2):

    for i, data = in enumerate(train_loader, 0):

        inputs, labels = data

 

        y_pred = model(inputs)

 

        loss = criterion(y_pred, labels)

        print(f'Epoch { epoch + 1} | Batch : {i + 1} | Loss : {loss.item():.4f}')

 

        optimizer.zero_grad()

        loss.backward()

        optimizer.step()

# 다음 학습을 진행합니다. 전 시간의 코드와 학습부분에 대해서 다른 점은, enumerate() 함수를 사용하여 iterator()를 구현하고, train_loader에서 데이터를 꺼내오는 방식입니다.

반응형
Comments