PyTorch 작동 구조
- 학습 단계
Data -> Model -> Output -> Loss -> Optimization - PyTorch 사용
Data : torch.utils.data.Dataset / torch.utils.data.DataLoader
Model : torch.nn.Module
Loss Function : torch.nn / torch.nn.functional
Optimization : torch.optim - 각 클래스 간 관계
Data
- Dataset과 DataLoader를 사용하여 데이터 로드
- `Dataset`과 `DataLoader`를 사용하면, 데이터 집합에서 미니 배치(전체 데이터 집합을 더 작은 부분집합으로 분할한 일부 데이터)크기의 데이터를 반환
- PyTorch에는 이미지 데이터를 다루는 ‘ImageFolder’, ‘CIFAR10’, ‘MNIST’ 등과 같이 흔히 사용되는 데이터 셋들에 대한 Dataset 구현체들이 이미 제공되고 있어, 편리하게 사용 - 많은 경우, 직접 데이터 셋을 구축
- PyTorch에서 제공하는 구현체인 `Dataset`은 제한적
- custom dataset을 구현하여 자신의 데이터를 사용한 `Dataset`을 만들 수 있음
- Custom dataset 구현을 위해서는 `Dataset` 클래스를 상속하여 custom dataset 클래스를 만들어서 사용
- __init__: `Dataset` 객체가 생성될 때 한 번만 실행됩니다. 주로 사용할 데이터 셋을 불러오고 필요한 변수를 선언
- __getitem__: 주어진 인덱스에 해당하는 단일 데이터를 불러오고 반환
( 데이터 셋의 데이터를 로드하는 순서를 의미하는 인덱스를 `Dataset`에 인자로 주어, 데이터 셋의 위치에 해당하는 데이터를 가져옴)
- __len__: 데이터 셋의 데이터 개수를 반환 ( e.g. 이미지 개수 ) - 주의 사항
- 데이터 타입 : tensor 형태로 변경하여 반환
- PyTorch는 데이터를 `torch.tensor` 객체로 다루므로, 데이터는 tensor로 변환
- 데이터 차원 : 모든 데이터의 차원의 크기는 같아야함.
- `Dataset`은 `DataLoader`와 함께 사용
- `DataLoader`에서 데이터들을 미니 배치로 묶어(stack) 주는 역할
예시) 모든 이미지는 같은 높이(height), 너비(width)와 채널(channel)을 가짐, 모든 (텍스트를 포함한) 시퀀스는 같은 길이(max_len) - DataLoader
- 데이터를 미니 배치로 묶어서 반환하는 역할
- 데이터 셋의 단일 데이터들을 정해진 개수만큼 모아 미니 배치(mini-batch)를 구성하는 역할
- `DataLoader`의 인자로 `Dataset`은 필수이며, 그 외의 추가 인자들이 존재
- batch_size [int, default = 1]: 미니 배치의 크기
- shuffle [bool, default = False]: epoch마다 데이터의 순서가 섞이는 여부
- num_workers [int, default = 0]: 데이터 로딩에 사용하는 서브 프로세스 개수
- rop_last [bool, default = False]: 마지막 미니 배치의 데이터 수가 미니 배치 크기보다 작은 경우, 데이터를 버릴지 말지
Model
PyTorch에서 제공하는 모델
- Torchvision
- 이미지 분석에 특화된 다양한 모델을 제공
- 문서에서 불러올 수 있는 여러 가지 모델의 목록을 확인 가능
- ResNet, VGG, AlexNet, EfficientNet, ViT 등 널리 알려진 모델을 편리하게 사용
- Torchvision: `torchvision.models.[model 이름]()`를 활용하면 손쉽게 모델을 불러옴 - PyTorch Hub
- CV, audio, generative, NLP 도메인의 모델들이 공개
- PyTorch Hub 홈페이지에서 torchvision 라이브러리와 마찬가지로 불러올 수 있는 모델의 목록을 알려줌
- 모델마다 `torch.hub.load()`로 전달하는 인자가 다름-> 원하는 모델을 PyTorch Hub에서 클릭하여 불러오는 코드를 확인
-> PyTorch에 공개된 모델은 제한적
- 딥러닝 분야는 빠르게 발전하고 있으며, 새로운 모델이 지속해서 연구 및 발표
- 논문에 공개된 모델은 주로 GitHub 등의 코드 공유 플랫폼에만 공개되는 것이 대부분
- 새로운 모델을 빠르게 접하고 상황에 맞게 변형해서 사용하기 위해서는, PyTorch에서 모델을 어떻게 정의하고 사용하는지 이해하는 것이 필요
- Custom Model
- PyTorch에서 모델은 일반적으로 `torch.nn.Module` 클래스를 상속받아 정의
- Custom model을 정의하기 위해서는 아래 두 가지 메서드를 꼭 작성
- __init__: `super().__init__()`을 통해 부모 클래스 (nn.Module)를 초기화한 후, 모델의 레이어와 파라미터를 초기화
- forward: 입력 데이터에 대한 연산을 정의
역전파와 최적화
- PyTorch에서 사용되는 훈련 과정의 일반적인 형태"
- optimizer.zero_grad(): 이전 gradient를 ‘0’으로 설정
( radient를 ‘0’으로 초기화하지 않는다면, gradient가 누적되어 데이터가 계속 중복된 채 학습에 사용)
- output = model(data): 모델을 사용하여 입력값(데이터)에 대해 연산
- loss = loss_function(output, label): loss 값 계산
- loss.backward(): loss에 대한 gradient 계산 (이때, AutoGrad를 통해 자동으로 gradient 계산)
- optimizer.step(): 계산된 gradient를 사용하여 각 파라미터를 업데이트 - AutoGrad
- tensor의 연산에 대한 미분을 자동으로 계산하기 위해, 내부적으로 computational graph를 생성
- Computational graph: 수학적 계산을 노드(node)와 엣지(edge) 의 그래프로 표현한 것. 그래프를 통해 연산의 흐름이 기록
- 노드: 수학적 연산을 나타냄 (예시) 덧셈, 곱셈, 뺄셈 등의 기본적인 연산)
- 엣지: 연산의 입력값 또는 출력값
- 이러한 computational graph와 chain rule을 이용하여 gradient 계산을 자동화 -> 미분식을 일일이 구현하지 않아도 됨
추론과 평가
- Inference
- 학습한 모델을 이용하여, 입력 데이터에 대한 예측 결과를 내놓는 과정
- inference 시에는 `model.eval()`과 `torch.no_grad()`를 함께 사용
- model.eval(): 모델을 evaluation 모드로 전환, 모델의 특정 레이어들(dropout, batchnorm)이 학습 과정과 추론 과정에서 다르게 작동해야 하기 때문
- torch.no_grad(): AutoGrad 기능을 비활성화, 추론 과정에서는 gradient 계산이 필요하지 않으므로, 이를 통해 메모리 사용량을 줄이고 계산 속도를 향상 - Evaluation
- 모델의 성능을 평가하는 과정
- Inference 과정에서 도출한 예측 결과와 실제 라벨을 비교하여 모델의 성능을 평가
- 태스크에 맞는 metric을 선정하여 numpy array로 변환하여 외부 라이브러리를 사용. or PyTorch를 사용해 직접 구현하여 성능을 평가
'Study > 머신러닝' 카테고리의 다른 글
PyTorch Lightning (0) | 2024.12.17 |
---|---|
PyTorch 전이학습 (3) | 2024.12.17 |
텐서 조작, Tensor Manipulation(with PyTorch) (0) | 2024.12.16 |
Pytorch (0) | 2024.12.16 |
Deep Learning 기본 모델 구조 (2) | 2024.12.16 |