Pytorch 기본

지인·2024년 11월 16일

Pytorch 주요 모듈

  1. torch : 메인 모듈
  2. torch.autograd : 자동 미분 기능
  3. **torch.nn : 신경망 (neural network) 구축
    • transformer, relu, 활성화 함수 등 갖가지 레이어 존재
  4. torch.multiprocessing : 병렬 gpu 사용
  5. **torch.optim : 최적화 알고리즘
    • sgd, adam, adamw, rmsprop 등
  6. **torch.utils : 데이터 조작
    • dataset + data loader
  7. torch.onnx : 서로 다른 프레임워크 간 모델 공유

Pytorch Flow

Data 입력 → DataSet(Transformsed?) → DataLoader → Model

DataSet의 구성요소

  • _ init _() : 생성자
  • _ len _() : 데이터의 길이 (mini batch 만들 때 사용)
  • _ getitem _() : 데이터 접근

DataLoader (Train/Test)

  • Batch (size) : 학습에 직접적인 영향, 너무 작으면 과적합/학습 불가, 클수록 메모리 부담
  • Shuffle : 학습 시 True, 테스트 시 False
  • Sampler : 불균형 데이터 다룰 때 Class마다 가중치 조작 시 사용, Sampler 사용 시 Shuffle 사용 불가
  • Collate_fn : 자연어 처리 쪽에서 중요. Input 데이터의 길이가 가변적일 때 데이터를 같은 길이로 맞춰주는 Padding 작업해주는 함수이다.
  • num_workers : cpu의 멀티프로세싱 세팅. cell script 타입의 윈도우 환경에선 1 이상 설정 시 오류 발생

Custom Dataset

torch.utils에 있는 DataSet 상속받는 클래스로 커스텀

init (), len (), getitem () 설정 필수

예제

import torch
from torch.utils.data import Dataset, DataLoader
import cv2
 
class ImageDataset(Dataset):
    def __init__(self, imgPathList, labelList, transforms=None):
        self.imgPathList = imgPathList
		    self.labelList = labelList
		    self.transforms = transforms
		    
    def __len__(self):
        return len(self.imgPathList)
    
    def __getitem__(self, idx):
        img_path = self.imgPathList[idx]
        image = cv2.imread(img_path)
        
        if self.transforms != None :
	        image = self.transforms(image=image)['image']
        
        if self.labelList != None :
		      label = self.labelList[idx]
					return image, label
				else :
					return image

Transform

  • pytorch 기본 Tansform
  • albumentations - 여러가지 증강기법

pytorch에서는 numpy를 tensor로 변경해줘야 한다. ToTensor

Pytorch DataLoader

예제

trainDataSet = CustomDataSet(tran_df['path'].values, trainLabelVec, trainTransform)
trainLoader = DataLoader(trainDataSet, batch_size=128, shuffle=True, num_workers=0)

valDataSet = CustomDataSet(val_df['path'].values, valLabelVec, testTransform)
valLoader = DataLoader(valDataSet, batch_size=128, shuffle=False, num_workers=0)

Optimizer

보통 adam이 좋긴 함. but 특정 데이터셋에선 적용 안될 수도

밑 예제와 같은 방식으로 lr을 따로 설정 가능

optimizer = torch.optim.Adam(params=model.parameters(), lr:3e-4)

optimizerParams = [
	{'params' : model.encoder.paremeters(), 'lr': 3e-4},
	{'params' : model.classifier.parameters(), 'lr':3e-3}
]
Optimizer = torch.optim.Adam(optimizerParams)

Loss Fuction

굉장히 많으므로 Document 들어가서 확인 추천

주로 쓰이는 것들

  • CrossEntropy
  • KL Divergence
  • MSE

LossFunction마다 어떠한 input을 받는지 아는 게 매우 중요**

Criterion = torch.nn.binary_cross_entropy().to(device)
// multi layer perceptron의 반환값은 logit이므로 상황에 맞게 사용해야 한다
Criterion = torch.nn.binary_cross_entropy_with_logits().to(device)
profile
중요한건 꺾여도 그냥 하는 마음

0개의 댓글