[PyTorch] 시작하기에 앞서(overview)
PyTorch frame work¶
1) model에 적합한 dataset, dataloader 정의
2) trian(model, loss_fn, optimizer, ...)
3) eval(model, loss_fn, ...)
4) Inference(test dataset)
In [10]:
from IPython import display
display.Image('PyTorch_framework.PNG', width = 600, height = 300)
Out[10]:
1) def dataset¶
data가 들어있는 파일의 root 경로를 이용하여 접근.
Custom이 필요할 시 다음과 같은 작업 필요.
class CustomDataset(torch.utils.data.datasets):
def __init__(self, root, transform, ...):
'''
inputs:
- root(str): data가 존재하는 root 폴더
- transform: data를 가공할 모듈 (ex. image random horizontal flip, crop, etc..)
'''
self.datas = get datas using root directory
self.transform = transform
def __len__(self):
return len(dataset)
def __getitem__(self, index):
'''
inputs:
- index(int): dataset 중 하나의 data와 이와 연결된 여러 객체(label 등)에 접근할 수 있는 변수
'''
data = self.datas[idx]
label = self.labels[idx]
if self.transform:
data = transform(data)
return data, label
2) def dataloader¶
dataloader: model에 data를 쉽게 feed할 수 있도록 pytorch에서 제공하는 iterable 객체.
- 장점
1) for문을 통해 쉽게 data를 iterable하게 조작
2) 인자를 통해 batch_size, gpu 분산, data shuffle 등 쉽게 조작 가능
custom_dataset = CustomDataset(root, transform)
custom_dataloader = DataLoader(CustomDataset, batch_size, shuffle, num_workers, ...)
3, 4) train, eval¶
def train_one_epoch():
'''
1) model을 train mode로 변환
(batchnorm, dropout과 같이 train, eval일 때 각기 다른 방식으로 작용하는 layer를 위해 pytorch에서 제공하는 attribute)
2) dataloader 반복적으로 model에 feed
3) outputs = model(dataloader)
4) loss 계산 (loss_fn(outputs, labels))
5) optimizer 초기화
6) back propagation
7) optimizer step
8) log(loss, accuracy, ...), model save, etc...
'''
def evaluate():
'''
1) model을 eval mode로 변환
2) with torch.no_grad():
similar train_one_eopch (except for optimizer)
3) log, model save, etc...
'''
위의 train, eval 함수를 num_epochs 만큼 반복해야하므로 반복문으로 이를 감싸주고 PyTorch 문법에 맞게 변환해주면 된다.
def run(num_epochs, ...):
for epoch in range(num_epochs):
train()
scheulder.step() if scheduler
evaluate()
def train_one_epoch(model, train_dl, optimizer, loss_fn, ...):
model.train()
for (inputs, labels) in train_dl:
outputs = model(inputs)
_, preds = torch.max(outputs, 1)
loss = loss_fn(outputs, labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()
'''
log(loss, accuracy, ...)
model save or not
etc...
'''
def evaluate(model, eval_dl, loss_fn, ...):
model.eval()
with torch.no_grad():
for (inputs, labels) in eval_dl:
outputs = model(inputs)
_, preds = torch.max(outputs, -1)
loss = loss_fn(output, labels)
'''
log
model save or not
etc...
'''