(5강) Model with PyTorch
Design Model with Pytorch
Model은 일종의 System에 대한 표현을 의미한다. 우리나라 말로 '모형'이라는 의미를 통해 쉽게 이해할 수 있을 것이다.
PyTorch는 다른 딥러닝 프레임워크에 비해 자유도가 높고 유연한 장점이 있다. Pythonic한 특징으로 매우 쉽게 다룰 수 있다. 또한, Low-level의 기계처럼 Model의 동작 내부를 일일이 구성하기 쉽게 되어있다. 나만의 실험이나 커스터마이징을 하기가 매우 용이하다.
nn.Module
우리가 Model을 설계를 할 때이든, 남이 만든 Model을 불러다가 Fine Tuning하든, PyTorch 내부의 Module의 동작을 이해해야 한다. 모델을 구성하는데 nn.Module은 어떤 역할을 할까?
모든 Linear와 Conv Layer는 이 nn.Module을 상속받고 따른다.
위에서 정의한 Model은 modules()
라는 메서드를 가진다.
각 module은 다른 module과 Parameter를 저장하고 있다. 이러한 연결성이 매우 중요하다. modules를 통해 모델 내의 모든 파라미터까지 부를 수 있기 때문이다.
forward는 chain의 과정을 정의한다. 들어오는 데이터를 각 Layer에 통과시키는 순전파를 정의하는 것이다. model을 calling하는 것도 forward와 동일하게 동작한다.
nn.Module을 모두 상속한다는 의미는, Model 뿐만 아니라 이 안에 있는 모든 구성 요소들이 각각의 __init__
과 forward
를 갖고 있다는 의미이다.
내가 정의한 모델의 forward 호출만으로, 모델에 정의된 모든 Module 각각의 forward가 실행된다.
더 나아가서 nn.Module은 child modules를 갖는다. 이를 통해서, 부모 Module과 chain 된 자식 Module을 호출할 수 있고 계산에 활용할 수 있는 것이다. Backward시에도 Loss에서 발생한 Grad 값을 전달하는데, 이 때 이 전파는 우리가 정의한 Model의 modules를 타고 흐른다. 연결 되어 있기 때문에, 우리는 각각의 Parameter를 찾을 필요없이 한번에 업데이트를 수행할 수 있는 것이다.
Parameters
Modules는 일종의 저장소이다. 연산을 수행할 Tensor Parameter를 갖고 있는 것이다. Parameter는 즉 Weight와 Bias이다. 이는 Tensor의 형태로 구현되어 있다.
Weight와 Bias를 보기 위해서는 state_dict
와 parameters
로 볼 수 있다.
각 Parameter도 하나의 Class로서 내부에 Member를 갖는다.
Parameter까지 연결이 되어있기 때문에, Model에서 손쉽게 Grad나 Data를 확인할 수 있다.
또한, requires_grad
를 통해서 Freeze를 할 수도 있다.
이처럼 Pythonic한 특징 덕분에 형식과 구조만 알면 여러가지 응용과 적용이 가능하다.
예를 들면, state_dict
에서 key 값이 다르더라도 구조만 안다면 이 Parameter를 사용할 수 있는 것이다. 이는 단순히 Python Dict로 구현되어 있기 때문이다.
(6강) Pretrained Model
ImageNet
Computer Vision 분야의 발전은 ImageNet의 개발과 맥을 같이하고 있다. 획기적인 알고리즘 개발과 검증을 위해 높은 품질의 데이터 셋은 필수적이기 때문이다.
Pretrained Model
매 Task마다 모델을 일반화 하기 위해 수 많은 데이터를 학습시켜야 한다면, 이는 매우 비효율적일 것이다. Pretrained Model은 대용량의 좋은 품질의 데이터로 미리 학습시켜 놓은 Model이다. 우리는 이 Model을 Task에 맞게 다듬어서 사용함으로써 효율성을 높일 수 있다.
이는 torchvision
과 같은 다양한 Package를 통해서 손쉽게 사용할 수 있다.
Transfer Learning
CNN의 Base Architecture를 살펴보면 다음과 같다.
위 구조를 기반으로 우리는 각 Case에 맞게 Pretrained Model을 활용할 수 있다.
Reference
Project
오늘의 목표 및 진척상황
- Baseline Code 완성! (환경 구성부터 추론까지 Pipeline 완성)
- 다양한 Option 적용 및 실험을 위한 Code 구성
- Model이 동일 Class만 예측하도록 학습되던 문제 해결
- 데이터가 적은 Class 정답 비율 확인
직면했던 문제와 학습한 내용
- Model 학습의 문제
어제 Labeling의 문제를 해결하고 난 후, Stratified K Fold로 학습을 시켰다. 이 때, Train Accuracy가 0.2에 수렴하고 모든 Class를 4로 예측하는 형태가 됐다. 하루 종일 이 문제와 씨름을 했다. 일일이 출력도 확인하고, 분포도 확인하고, transform도 건드려보고, 타입도 변경해보고, 모델도 변경해보고.. 등등.. 결국 Dataset에 일부의
img_paths
만 사용하는 것이 문제였다. 오류의 예시는 다음과 같다.kf = KFold(5) for train_idx, valid_idx in kf.split(img_paths) : trian_dataset = MyDataset(img_paths[train_idx]) ...
이와 같이 Dataset을 구성하면 문제가 생기는지에 대한 원인을 규명하지는 못했다. 다만, 이를 회피할 수 있는 방법은 다음과 같은 방법이었다.
kf = KFold(5) train_dataset = MyDataset(img_paths) for train_idx, valid_idx in kf.split(img_paths) : train_subset = Subset(train_dataset, train_idx) ...
위와 같이 수행하니, 정상적인 학습이 가능했다.
- Baseline Code 완성
드디어 Data 전처리부터 Ensemble로 추론하는 것 까지의 Pipeline을 구성했다. 이제, 여러 기법들을 적용해가면서 성능을 Check하고 Model을 개선해나가면 된다!
- 소량의 Data인 Class 확인
Data가 적은 Class에 대해서, Test Data의 분포 여부를 확인해보았다. Class 2번과 같은 경우에는 13%에 육박할 정도로 많은 Data가 있음을 확인했다. Class 3, 4, 7, 8번은 Data가 적은데에 비해 약 2.5%의 비율을 갖는다.
추가로 진행 할 사항
- Fold에서 겪었던 문제 토론으로 공유하기
- Learning Rate Scheduler 도입
- Augmentation 도입 (Albumentation 등 확인)
- Data 증강 등 전처리 여부 고민
- 성별, 나이별, 마스크별 등 각각의 모델 구성 여부 고민
- Pseudo Labeling 여부 고민
'네이버 부스트캠프 AI Tech' 카테고리의 다른 글
[P1] Day 45 (0) | 2021.04.11 |
---|---|
[P1] Day 44 (0) | 2021.04.11 |
[P1] Day 42 (0) | 2021.03.31 |
[P1] Day 41 (0) | 2021.03.31 |
[U] Day 40 - Lightweight V (0) | 2021.03.28 |
Uploaded by Notion2Tistory v1.1.0