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

Pytorch_Multivariable_Linear_regression

Pytorch Multivariable Linear regression 기본 정리

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

  • 두 개 이상의 x값으로부터 y값을 예측하는 간단한 모델을 만들어보자.

  • 간단한 예제를 위해 (5,3) 의 train_x data를, (5,1) 의 train_y 데이터를 만든다.

1
2
3
4
5
6
x_train = torch.FloatTensor([[73, 80, 75],
[93, 88, 83],
[89, 91, 90],
[96,98, 100],
[73, 66, 70]])
y_train = torch.FloatTensor([[152], [185], [180], [196], [142]])
  • 선형 회귀 모델을 만들것이므로 우리가 학습해야하는 변수는 w 와 b 두 가지이다. 이를 torch.zeros 를 이용해 만들고 requires_grad=True 로 설정해 학습할 데이터로 설정하자.
1
2
w = torch.zeros((3,1), requires_grad=True)
b = torch.zeros(1, requires_grad=True)
  • 모델을 통해 구한 hypothesis와 실제값의 차이로부터 loss를 구하기 위해 MSE를 사용하고, SGD optimizer를 통해 w 와 b를 개선한다.
1
optimizer = torch.optim.SGD([w,b], lr=1e-5)
  • epochs 수만큼 모델을 학습시킨다.
1
2
3
4
5
6
7
8
9
10
11
12
13
for epoch in range(epochs+1):

hypothesis = x_train.matmul(w) + b # 모델을 통해 구해지는 predict값

loss = torch.mean((hypothesis - y_train) ** 2) # predict와 train 데이터로부터 구하는 loss

optimizer.zero_grad # gradient 초기화
loss.backward() # gradient 계산
optimizer.step() # w 와 b 개선

print('Epoch {:4d}/{} hypothesis : {} Cost : {:.6f}'. format(
epoch, epochs, hypothesis.squeeze().detach(), loss.item()
))

Full Code

Full Code

Pytorch_Linear_regression_기본정리

Pytorch Linear regression 기본 정리

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

  • 하나의 x값을 통해 하나의 y를 예측하는 간단한 모델을 만들어보자.

  • 다음과 같이 세개의 데이터를 만들고 이를 통해 간단한 선형 예측 모델을 학습시켜본다.

1
2
x_train = torch.FloatTensor([[1], [2], [3]])
y_train = torch.FloatTensor([[2], [4], [6]])
  • 선형 모델에서 x값이 주어졌을 때 y값(hypothesis-H(x))을 계산하기 위해서는 다음과 같은 식을 따르게 된다.
1
H(x) = W * x + b
  • 가지고 있는 데이터를 위 식을 통해 학습시키고자 한다면 우리가 알아야 하는 값 즉, 학습해야 하는 값은 W 와 b이다.

  • “requires_grad=True” 를 설정하여 다음과 같이 0으로 초기화된 W 와 b 를 만들 수 있다.

1
2
w = torch.zeros(1, requires_grad=True)
b = torch.zeros(1, requires_grad=True)
  • 우리가 만든 모델을 평가하기 위해서는 Mean Squared Error(MSE) 를 사용할 것입니다.

  • MSE는 예측값과 실제값의 차이를 제곱한 후 평균을 구한 값으로 다음과 같이 나타낼 수 있습니다.

1
loss = torch.mean((hypothesis - y_train) ** 2)
  • loss 를 구했다면 이를 통해 학습해야 하는 W 와 b 값을 개선해야 합니다.

  • 이를 위해 Stochastic gradient descent(SGD)를 사용할 것입니다.

  • optim 라이브러리의 SGD에 학습할 tensor를 리스트 형태로 넣어주고 learing rate를 지정해 다음과 같이 나타낼 수 있습니다.

1
optimizer = torch.optim.SGD([w, b], lr=0.01)
  • optimizer를 정의했다면 아래와 같은 순서를 통해 W와 b를 개선해준다.
1
2
3
optimizer.zero_grad()  # gradient 초기화
loss.backward() # gradient 계산
optimizer.step() # W 와 b 개선
  • 이러한 학습 방법을 따라 모델을 100회 한 후 x가 4일때의 y값을 살펴보면 8에 근접하는 값이 나오는 것을 확인할 수 있다.
1
2
3
x_test = torch.FloatTensor([[4]])
print(x_test * w + b)
#>>> tensor([[7.5598]], grad_fn=<AddBackward0>)

Full Code

Full Code

Your browser is out-of-date!

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

×