모델은 layer를 block처럼 쌓아 만든 것이다.
이를 위한 모듈이 torch.nn.Module이다.
torch.nn.Module
딥러닝을 구성하는 layer의 baseclass
input, output, forward, backward 정의
학습의 대상이 되는 parmeter(tensor)정의
nn.Parameter
Tensor객체의 상속객체
nn.Module 내에 attribute가 될때는 requires_grad = True 로 지정되어 학습대상이 되는 tensor
우리가 직접 지정할 일은 잘 없음(대부분의 layer에는 weights값이 지정되어 있음)
backward
layer에 있는 parameter들의 미분을 수행
forward의 결과값 (model의 output = 예측치)과 실제값간의 차이(loss)에 대해 미분을 수행
해당 값으로 parameter 업데이트
# backward 과정
# 기울기 초기화
optimizer.zero_grad()
# 모델예측
output = model(input)
# loss 계산
loss = criterion(outputs, labels)
# 파라미터의 기울기 값 계산
loss.backward()
# 가중치 업데이트
optimizer.step()
epoch에서 이뤄지는 모델 학습 과정을 정리해보고 성능을 올리기 위해서 어떤 부분을 먼저 고려하면 좋을지 같이 논의해보세요
optimizer.zero_grad()를 안하면 어떤 일이 일어날지 그리고 매 batch step마다 항상 필요한지 같이 논의해보세요
optimizer.zero_grad()는 dloss / dW 를 계산하기 전에 optimazer 안에 저장되어 있는값을 0으로 초기화하는 과정이다. 생략하게 된다면 기울기값에 쓰레기값이 들어가게 되어 가중치 업데이트가 제대로 되지 않는다. 따라서 매 step마다 필요하다.
torch의 Dataset을 상속받는 CustomDataset class는 init, len, getitem으로 구성된다.
import torch
from torch.utils.data import Dataset, DataLoader
class CustomDataset(Dataset):
# 초기데이터 생성방법 지정
def __init__(self, text, labels):
self.labels = labels
self.data = text
# 데이터의 전체길이 반환
def __len__(self):
return len(self.labels)
# index값을 주었을 때 반환되는 데이터의 형태(X,y)
def __getitem__(self, idx):
label = self.labels[idx]
text = self.data[idx]
sample = {"Text": text, "Class": label}
return sample
Dataset class 생성 시 유의점
MyDataLoader = DataLoader(MyDataset, batch_size=2, shuffle=True)
# 배치데이터 가져오는 방법 1
next(iter(MyDataLoader))
# 방법 2
for dataset in MyDataLoader:
print(dataset)
argument
dataset
index로 데이터를 참조하는 map-style dataset(getitem, len)과 iter로 참조하는 Iterable style dataset(iter)이 있다.
Iterable style dataset은 stream data, real-time log와 같이 random으로 읽기에 어렵거나, data에 따라 batch size가 달라지는 데이터(dynamic batch size)에 사용한다.
batch_size : int, optional, default=1
배치(batch)의 크기, dataset에서 return하는 데이터는 tensor이므로 만약 tensor로 변환이 안되는 데이터는 에러가 난다.
shffle : bool, optional, default=False
데이터를 DataLoader에서 섞어서 사용하겠는지를 설정
sampler : Sampler, optional
데이터의 index를 원하는 방식대로 조정. map-style에서 컨트롤하기 위해 사용된다.
batch_sampler : Sampler, optional
위와 동일
num_workers : int, optional, default=0
데이터 로딩에 사용하는 subprocess개수 (멀티프로세싱)
기본값이 0인데 이는 data가 main process로 불러오는 것을 의미한다.
collate_fn : callable, optional
map-style 데이터셋에서 sample list를 batch 단위로 바꾸기 위해 필요한 기능. zero-padding이나 Variable Size 데이터 등 데이터 사이즈를 맞추기 위해 많이 사용한다.
pin_memory : bool, optional
True 일 때 데이터로더는 Tensor를 CUDA 고정 메모리에 올린다.
drop_last : bool, optional
batch 단위로 데이터를 불러올 때 마지막에 남는 batch의 길이가 설정한 batch보다 작을 경우 사용. 특히 batch의 길이가 다른 경우에 따라 loss를 구하기 귀찮은 경우, batch의 크기에 따른 의존도 높은 함수를 사용할 경우
time_out : numeric, optional, default=0
양수로 주어지는 경우, DataLoader가 data를 불러오는데 제한시간
worker_init_fn : callable, optional, default=’None’
num_worker가 개수라면, 이 파라미터는 어떤 worker를 불러올 것인가를 리스트로 전달
DataLoader에서 사용할 수 있는 각 sampler들을 언제 사용하면 좋을지 같이 논의해보세요!
데이터의 크기가 너무 커서 메모리에 한번에 올릴 수가 없을 때 Dataset에서 어떻게 데이터를 불러오는게 좋을지 같이 논의해보세요!
https://pytorch.org/docs/stable/data.html
https://subinium.github.io/pytorch-dataloader/
Custom Dataset 및 Dataloader 생성
Dataset 관련 모듈
PyTorch에서 데이터를 다루기 위한 몇 가지 모듈
1. torch.utils.data
: 데이터셋의 표준을 정의하고 데이터셋을 불러오고 자르고 섞는데 쓰는 도구들이 들어있는 모듈. 파이토치 모델을 학습시키기 위한 데이터셋의 표준을 torch.utils.data.Dataset
에 정의. Dataset 모듈을 상속하는 파생 클래스는 학습에 필요한 데이터를 로딩해주는 torch.utils.data.DataLoader
인스턴스의 입력으로 사용.
2. torchvision.dataset
: torch.utils.data.Dataset
을 상속하는 이미지 데이터셋의 모음. MNIST나 CIFAR-10과 같은 데이터셋을 제공.
3. torchtext.dataset
: torch.utils.data.Dataset
을 상속하는 텍스트 데이터셋의 모음. 기본적으로 IMDb나 AG_NEWS와 같은 데이터셋을 제공.
4. torchvision.transforms
: 이미지 데이터셋에 쓸 수 있는 여러 가지 변환 필터를 담고 있는 모듈. 예를 들어 Tensor로 변환한다던지, 크기 조절(Resize)과 잘라내기(Crop)으로 이미지를 수정할 수 있고 밝기(Brightness)와 같은 값을 조절하는데 사용.
5. torchvision.utils
: 이미지 데이터를 저장하고 시각화하기 위한 도구가 들어있는 모듈.
참고: 펭귄브로의 3분 딥러닝, 파이토치맛
Custom Dataset class
Data Loader
모델 학습을 위해서 데이터를 미니 배치(Mini batch)단위로 제공해주는 역할
DataLoader(dataset, # Dataset 인스턴스가 들어감
batch_size=1, # 배치 사이즈를 설정
shuffle=False, # 데이터를 섞어서 사용하겠는지를 설정
sampler=None, # sampler는 index를 컨트롤
batch_sampler=None, # 위와 비슷하므로 생략
num_workers=0, # 데이터를 불러올때 사용하는 서브 프로세스 개수
collate_fn=None, # map-style 데이터셋에서 sample list를 batch 단위로 바꾸기 위해 필요한 기능
pin_memory=False, # Tensor를 CUDA 고정 메모리에 할당
drop_last=False, # 마지막 batch를 사용 여부
timeout=0, # data를 불러오는데 제한시간
worker_init_fn=None # 어떤 worker를 불러올 것인가를 리스트로 전달
)
dataloader_custom = DataLoader(dataset_custom)
할일을 모두 끝내고 자자
앞으로 원활한 학습을 위해 해야할 것들은 많아지는데 하지못하고 있다.
해야할 일을 차근차근 해보자