일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 미디언 필터링
- 모두의 딥러닝
- 딥러닝 공부
- MFC 프로그래밍
- 파이토치
- 영상처리
- c언어 정리
- object detection
- matlab 영상처리
- 팀프로젝트
- 딥러닝
- 해리스 코너 검출
- tensorflow 예제
- c++공부
- 케라스 정리
- 모두의 딥러닝 예제
- 김성훈 교수님 PyTorch
- c++
- Pytorch Lecture
- 파이토치 강의 정리
- C언어 공부
- 파이토치 김성훈 교수님 강의 정리
- TensorFlow
- pytorch
- 가우시안 필터링
- c언어
- pytorch zero to all
- 컴퓨터 비전
- 골빈해커
- 딥러닝 스터디
- Today
- Total
ComputerVision Jack
PyTorch Lecture 08 : DataLoader 본문
Batch(Batch size)
앞에 저희가 처리했떤 당뇨 데이터인 경우 데이터의 사이즈가 그리 크지 않습니다. 하지만 딥러닝을 적용할 경우 데이터의 용량이 거대해지는 경우가 발생합니다. 이럴 경우 Batch와 Dataloader를 통하여 해결할 수 있습니다.
Epoch
에폭의 경우 반복을 이용하여 데이터 전체를 한번 학습 시킨것을 지칭합니다.
batch size
batch size경우 해당 데이터셋을 사용자가 지정한 만큼 자른 것을 의미합니다. 따라서 1000개의 데이터가 존재할때 batch size를 500으로 한다면 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에서 데이터를 꺼내오는 방식입니다.
'DeepLearning > Pytorch_ZeroToAll' 카테고리의 다른 글
PyTorch Lecture 10 : Basic CNN (0) | 2020.10.26 |
---|---|
PyTorch Lecture 09 : softmax Classifier (0) | 2020.10.23 |
PyTorch Lecture 07 : Wide and Deep (0) | 2020.10.20 |
PyTorch Lecture 06 : Logistic Regression (0) | 2020.10.12 |
PyTorch Lecture 05 : Linear Regression in the PyTorch way (0) | 2020.10.07 |