Pytorch_data_loading_with_DataLoader

Pytorch DataLoader를 통한 data loading

모두를 위한 딥러닝 - 파이토치 강의 참고

  • DataLoader를 통해 데이터를 batch_size 만큼 나누어 읽어오기 위해서는 torch.utils.data 의 Dataset을 상속받는 클래스를 정의해야 합니다.

  • 자기만의 Dataset을 만든 뒤, __len____getitem__ 메서드를 overriding해서 사용해야 합니다.

1
2
3
4
5
def __len__(self):
...

def __getitem__(self, idx):
...
  • Dataset의 소스는 이곳에서 확인할 수 있으며, DataLoader에 대한 한글 설명은 이곳을 참고할 수 있습니다.

  • 간단한 Linear regression 모델과 데이터를 만들어서 실습해 보았습니다.

  • 먼저 Dataset을 상속받는 저만의 Dataset과 __len____getitem__ 메서드를 만들어 보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class MyDataset(Dataset):

def __init__(self):
self.x_train = [[73, 80, 75],
[93, 88, 83],
[89, 91, 90],
[96,98, 100],
[73, 66, 70]]
self.y_train = [[152], [185], [180], [196], [142]]

def __len__(self):
return len(self.x_train)

def __getitem__(self, idx):
x = torch.FloatTensor(self.x_train[idx])
y = torch.FloatTensor(self.y_train[idx])
return x, y
  • 이렇게 만들어진 MyDataset은 torch.utils.dataDataLoader를 통해 batch_size를 조절할 수 있습니다.
1
2
dataset = MyDataset()
dataloader = DataLoader(dataset, batch_size=2, shuffle=True) # shuffle 은 데이터를 섞어서 각각의 배치를 만들어준다는 뜻이다.
  • DataLoader를 통해 만들어진 객체는 iterable한 객체이기 때문에 다음과 같이 출력해서 확인해 볼 수도 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
a = iter(dataloader)
print(next(a))
print(next(a))
print(next(a))
#>>>
[tensor([[ 73., 80., 75.],
[ 96., 98., 100.]]), tensor([[152.],
[196.]])]
[tensor([[73., 66., 70.],
[93., 88., 83.]]), tensor([[142.],
[185.]])]
[tensor([[89., 91., 90.]]), tensor([[180.]])]
  • 저만의 MyDataset에 입력한 데이터가 DataLoader를 통해 지정한 배치로 나눠져서 정상적으로 출력되는것을 확인할 수 있습니다.

  • 이제 Linear regression 모델, optimizer를 다음과 같이 만든 뒤,

1
2
3
4
5
6
7
8
9
10
11
class MultivariateLinearRegressionModel(nn.Module):
def __init__(self):
super().__init__()
self.linear = nn.Linear(3, 1)

def forward(self, x):
return self.linear(x)


model = MultivariateLinearRegressionModel()
optimizer = optim.SGD(model.parameters(), lr=1e-5)
  • DataLoader를 통해 데이터를 불러와 학습해 보겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
epochs = 20

for epoch in range(epochs + 1):
for batch_idx, train in enumerate(dataloader):
xt, yt = train

prediction = model(xt)

loss = F.mse_loss(prediction, yt)

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

print('Epoch {:4d}/{} Batch : {}/{} Cost : {:.6f}'.format(
epoch, epochs, batch_idx+1, len(dataloader), loss.item()
))
  • epochs 수만큼 학습을 하는 for문 안에 또 하나의 for문이 들어가 있는것을 확인할 수 있습니다. 안쪽 for문에서 batch_size만큼 나눠진 train 데이터를 model을 통해 학습하는 과정을 구현해 볼 수 있었습니다.

Full Code

Full Code

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×