일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- ubuntu
- 백준
- C++
- 그리디
- 2단계
- 모두를 위한 딥러닝 강좌 시즌1
- STL
- MySQL
- SWEA
- 딥러닝
- 자료구조 및 실습
- ssd
- 프로그래머스
- docker
- 이것이 코딩테스트다 with 파이썬
- test-helper
- Python
- AWS
- pytorch
- cs
- 구현
- 파이썬
- CS231n
- 1단계
- 코드수행
- 머신러닝
- 전산기초
- Object detection
- 3단계
- 실전알고리즘
- Today
- Total
곰퓨타의 SW 이야기
Lab-04-2 Loading Data 본문
이번 강의 역시 부스트코스에서 제공하는 pytorch 관련 강좌를 들었다. 💪
www.boostcourse.org/ai214/lecture/42288/
파이토치로 시작하는 딥러닝 기초
부스트코스 무료 강의
www.boostcourse.org
Multivariable linear regression 복습
여러 개의 정보로부터 하나의 결론을 도출한다.
gradient descent를 통해 모델을 학습시키면 cost가 점점 작아지고 실제값 y에 예측값이 가까워진다는 것을 알 수 있다.
"Minibatch" Gradient Descent 이론
Problem
복잡한 머신러닝의 모델을 학습하려면 엄청난 양의 데이터가 필요하다.
- 엄청난 양의 데이터는 한 번에 학습시킬 수 없다. --> 너무 느리고, 하드웨어적으로 불가능하다.
- 일부분의 데이터로만 학습하는 것은 어떨까?
Solution
많은 양의 데이터가 있을 때 신경망이 학습하는 방법이 "Minibatch" Gradient Descent 이다.
이는 전체 데이터를 균일하게 나누어 학습한다. (minibatch 하나하나씩 나누어서)
컴퓨터가 모든 데이터로 cost function을 구하며 하지 않고, 각 minibatch에 있는 cost만 계산하고 gradient descent가 가능하다.
--> 컴퓨터에 무리가 덜 간다.
+ 이는 한 번에 업데이트하는 계산할 cost양이 적으므로 업데이트를 좀 더 빠르게 할 수 있다. (업데이트 주기가 빨라진다.)
- 업데이트 시 전체 데이터를 쓰지 않기 때문에 모델이 잘못된 방향으로 업데이트를 할 수 있다.
Pytorch Dataset and DataLoader 사용법
Pytorch Dataset
1. torch.utils.data.Dataset 상속
-- magic method --
2. __len__() : 이 데이터 셋의 총 데이터 수
3. __getitem__() : 어떠한 인덱스 idx를 받았을 때, 그에 상응하는 입출력 데이터를 반환한다.
from torch.utils.data import Dataset
import numpy as np
# 데이터 로드 (이전에 사용했던 시험 성적 데이터 로드)
xy = np.loadtxt('data-01-test-score.csv', delimiter=',', dtype=np.float32)
x_temp_data = xy[:, 0:-1]
y_temp_data= xy[:, [-1]]
# 5개만 사용할 예정
x_temp_data = x_temp_data[:5]
y_temp_data = y_temp_data[:5]
# torch.utils.data.Dataset 상속
class CustomDataset(Dataset) :
def __init__(self) :
self.x_data = x_temp_data
self.y_data = y_temp_data
# 이 데이터 셋의 총 데이터 수
def __len__(self) :
return len(self.x_data)
# 어떤 index를 받았을 때, 그에 상응하는 입출력 데이터 반환
def __getitem__(self,idx):
x = torch.FloatTensor(self.x_data[idx])
y = torch.FloatTensor(self.y_data[idx])
return x,y
dataset = CustomDataset()
PyTorch DataLoader
1. torch.utils.data.DataLoader 사용
2. batch_size = 2
-> 각 minibatch의 크기
-> 통상적으로 2의 제곱수로 설정한다. (16,32,64, 등)
3. shuffle = True
-> Epoch 마다 데이터 셋을 섞어서, 데이터가 학습되는 순서를 바꾼다.
from torch.utils.data import DataLoader
# batch_size = 2 -> 각 minibatch의 크기
# shuffle = True -> Epoch 마다 데이터 셋을 섞어서, 데이터가 학습되는 순서를 바꾼다.
dataloader = DataLoader(
dataset,
batch_size = 2,
shuffle = True,
)
Full code with Dataset and DataLoader
1) 필요한 것들 import
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torch.utils.data import Dataset
from torch.utils.data import DataLoader
# For reproducibility
torch.manual_seed(1)
2.) 데이터 로드
# 데이터 로드
import numpy as np
xy = np.loadtxt('data-01-test-score.csv', delimiter=',', dtype=np.float32)
x_temp_data = xy[:, 0:-1]
y_temp_data= xy[:, [-1]]
x_temp_data = x_temp_data[:5]
y_temp_data = y_temp_data[:5]
# torch.utils.data.Dataset 상속
class CustomDataset(Dataset) :
def __init__(self) :
self.x_data = x_temp_data
self.y_data = y_temp_data
# 이 데이터 셋의 총 데이터 수
def __len__(self) :
return len(self.x_data)
# 어떤 index를 받았을 때, 그에 상응하는 입출력 데이터 반환
def __getitem__(self,idx):
x = torch.FloatTensor(self.x_data[idx])
y = torch.FloatTensor(self.y_data[idx])
return x,y
dataset = CustomDataset()
# batch_size = 2 -> 각 minibatch의 크기
# shuffle = True -> Epoch 마다 데이터 셋을 섞어서, 데이터가 학습되는 순서를 바꾼다.
dataloader = DataLoader(
dataset,
batch_size = 2,
shuffle = True,
)
3) 모델 생성 및 파라미터 초기화
# 모델 초기화
model = MultivariateLinearRegressionModel()
# optimizer 설정
optimizer = optim.SGD(model.parameters(), lr=1e-5)
4) minibatch gradient descent 수행하며 모델 훈련시키기
- enumerate(dataloader) -> minibatch 인덱스와 데이터를 받는다.
- len(dataloader) -> 한 epoch 당 minibatch 개수
nb_epochs= 20
for epoch in range(nb_epochs + 1):
for batch_idx, samples in enumerate(dataloader) :
x_train, y_train = samples
# H(x) 계산
prediction = model(x_train)
# cost 계산
cost = F.mse_loss(prediction,y_train)
# cost로 H(x) 계산
optimizer.zero_grad()
cost.backward()
optimizer.step()
print('Epoch {:4d}/{} Batch {}/{} Cost : {:.6f}'.format(
epoch, nb_epochs, batch_idx + 1, len(dataloader),
cost.item()
))
이번 강의까지 해서 어떤 한개의 숫자를 예측하는 모델을 생성하였었다!
다음 강의부터는 분류하는 모델을 배운다고 한다.⭐️
'인공지능 > 부스트코스_파이토치로 시작하는 딥러닝 기초' 카테고리의 다른 글
Lab-06 Softmax Classification (0) | 2021.02.17 |
---|---|
Lab-05 Logistic Regression (0) | 2021.02.15 |
Lab-04-1 Multivariable Linear regression (0) | 2021.02.15 |
Lab-03 Deeper Look at GD (0) | 2021.02.15 |
docker container 접근 및 jupyter notebook 실행 (0) | 2021.02.15 |