강의 복습
1. EfficientUnet baseline
- segmentation을 위한 DataLoader 준비
- Shape of Images : (batch, 3, height, width)
Shape of targets : (batch, height, width) - cv2.COLOR_BGR2RGB: OpenCV에서는 컬러 이미지를 BGR 순서로 저장하는데 matplotlib에서는 RGB 순서로 저장
- 255로 나눠서 0~1 사이로 정규화
- Shape of Images : (batch, 3, height, width)
- DataLoader 적용
- albumentations library를 활용한 transform (ToTensorV2)
- CustomDataLoader 적용
- data_dir: image files, json file 저장된 폴더의 디렉토리
- mode: train / test
- transforms: 전처리 작업
- train_loader / validation_loader / test_loader
- dataset: 로드할 데이터셋
- batchsize: 로드되는 샘플 수
- shuffle: True - 모든 epoch에서 데이터 섞음
- num_workers: 로드에 사용할 프로세스 수 (0 - 기본 프로세스)
- collate_fn: 샘플의 리스트를 merge하여 Tensor의 minibatch 구성
- model 불러오기
- segmentation_models_pytorch 라이브러리 사용
- Architecture: smp.Unet
- Encoders
- encoder_name = "efficientnet-b0"
- classes = 12
- encoder_weight = "imagenet"
- 사용할 모델의 layer 확인
- loss/optimizer 정의
- loss: Softmax + CrossEntropyLoss
- optimizer: Adam
- train/validation 함수 정의
- best_loss 초기값을 매우 큰 값으로 설정(9999999)
- loss가 가장 작은 모델 저장
- 대회의 기준은 mIoU이므로 mIoU 기준으로 변경해야 함
- 학습시키기
- best model 불러오기
- test
- test set에 대해 예측 및 시각화
- test 함수를 사용하여 batch 단위로 inference
- submission.csv 파일 생성
2. baseline 이후에 실험 해봐야할 사항들
- 주의해야 할 사항들
- 시드 고정
- torch, numpy, os 관련 시드 고정
- Validation 검증셋 시드 고정 (random_state=0) → 처음부터 나뉘어져있는 경우 해당 없음
- 실험 기록
- Network 종류, Augmentation 방법, Hypdrparameter 등
- Notion / 구글 스프레드 시트 / 파일명 / 패키지 등을 사용하여 기록
- 실험을 할 때에는 한 번에 하나의 조건만 변경해가며 실험
- 팀원마다의 역할 분배
- 하나의 베이스라인 코드 기반으로 가장 좋은 솔루션 만들기
- 독립적으로 베이스라인 코드 만들어서 마지막에 앙상블
- 각자 역할 분배
- 시드 고정
- Validation
- Validation이 중요한 이유
- 제출을 하지 않아도 모델의 성능을 평가할 수 있음
- Public 리더보드의 성능에 오버피팅 되지 않도록 도와줌
- Hold Out: Train data / Validation data로 분리, 속도가 빠르지만 Validation data는 학습에 참여 못 함
- K-Fold: 데이터를 n등분한 후 돌아가면서 Validation data로 사용, 모든 데이터가 학습에 참여
- Stratified K-Fold: 클래스 분포 고려
- Group K-Fold: 그룹 내에 correlation이 존재할 때 train과 validation 데이터셋에 동일한 그룹이 섞이지 않도록 함
- Validation이 중요한 이유
- Augmentation
- Augmentation을 하는 이유
- 데이터 수 증가
- Generalization 강화
- 성능 향상
- Class imbalance 문제 해결
- Rotation / Flip / Transpose
- 라이브러리
- Torchvision.transforms
- Autoaugment
- Fastaugment
- Albumentation
- 다양한 분야에 적용 가능
- 여러 라이브러리들을 기반으로 최적화해 속도 빠름
- 70개 이상 Augmentation 기법 구현
- Pytorch와 연동 쉬움
- 도메인에 맞는 Augmentation 기법 필요
- 최신 Augmentation 기법
- Cutout: Random하게 Box를 생성하기 때문에 사진마다 성능의 편차가 존재
- Gridmask: 객체의 중요 부분 혹은 Context information을 삭제할 수 있다는 단점을 해결하기 위해, 규칙성 있는 박스를 통해 Cutout
- Cutmix
- 랜덤하게 잘릴 박스를 추출
- 박스의 위치를 결정
- 인풋 이미지들의 순서를 섞고 Box의 크기를 결정할 lambda 추출
- Snapmix
- CAM(Class Activation Map)을 이용해 이미지 및 라벨을 mixing하는 방법
- 영역의 의미적 중요도를 고려해 라벨을 생성
- Augmentation을 하는 이유
- SOTA Model
- HRNet
- Scheduler
- Constant Learning Rate의 단점
- 너무 작을 경우: 학습 시간이 오래 소요되고, local minima에 빠질 위험이 있음
- 너무 클 경우: loss가 발산
- Scheduler 종류
- CosineAnnealingLR: Learning rate의 최대값과 최소값을 정해, 그 범위의 학습율을 Cosine 함수를 이용해 스케줄링하는 방법
- ReduceLROnPlateau: metric의 성능이 향상되지 않을 때 learning rate를 조절하는 방법
- Gradual Warmup: 학습을 시작할 때 매우 작은 learning rate로 출발해서 특정 값에 도달할 때까지 learning rate를 서서히 증가시키는 방법
- Constant Learning Rate의 단점
- Hyperparameter Tuning
- Batch size
- Gradient Accumulation: 모델의 weight를 업데이트하지 않고, 일정 step 동안 gradient를 누적한 다음 누적된 gradient를 사용해 weight를 업데이트하는 방법, 배치 사이즈를 키우는 장점이 있음
- Mixed-Precision Training of Deep Neural Networks: 웨이트의 소수점 자리를 32에서 16으로 대체하여 배치를 키우는 방법
- Gradient Accumulation: 모델의 weight를 업데이트하지 않고, 일정 step 동안 gradient를 누적한 다음 누적된 gradient를 사용해 weight를 업데이트하는 방법, 배치 사이즈를 키우는 장점이 있음
- Optimizer
- Adam
- AdamW
- AdamP
- Radam
- Lookahead optimizer: Adam이나 SGD를 통해 k번 업데이트 후, 처음 시작했던 point 방향으로 1 step back 후, 그 지점에서 다시 k번 업데이트를 시작하는 방법
- Batch size
- Ensemble
- 5-Fold Ensemble: 5-Fold Cross validation을 통해 만들어진 5개의 모델을 앙상블
- Epoch Ensemble: 학습을 완료한 후, 마지막부터 N개의 Weight를 이용해 예측한 후 결과를 앙상블
- SWA(Stochastic Weight Averaging): 각 step마다 weigh를 업데이트 시키는 SGD와 달리 일정 주기마다 weight를 평균 내는 방법
- Seed Ensemble: Random한 요소를 결정짓는 Seed만 바꿔가며 여러 모델을 학습시킨 후 앙상블
- Resize Ensemble
- Input 이미지의 Size를 다르게 학습해 앙상블하는 방법
- 학습 때와 다른 size의 Input 이미지를 이용해 Test(Inference)하는 방법
- TTA (Test time augmentation): Test set으로 모델의 성능을 테스트할 때, augmentation을 수행
- Pseudo Labeling
- 모델 학습 진행
- 성능이 가장 좋은 모델에 대해 Test 데이터셋에 대한 예측을 진행
- 2단계에서 예측한 Test 데이터셋과 Train 데이터셋을 결합해 새롭게 학습을 진행
- 3단계에서 학습한 모델로 Test 데이터셋을 예측
- 한정된 시간을 효율적으로 활용
- 코드를 돌리는 시간에 다른 작업 진행
- 작은 샘플로 실험 코드가 문제 없는지 미리 확인
- 자는 시간, 쉬는 시간 등 GPU가 쉬지 않도록 미리 실험용 코드 작성
프로젝트 회고
- 여러가지 모델을 실험해봤는데 지금까지 한 것 중에서는 DeepLabV3 + Resnet101 이 가장 성능이 좋았다. 그 다음으로는 DeepLabV3 + efficientnet-b0가 두 번째로 성능이 좋았다.
- DeepLabV3 + efficientnet-b3을 돌려봤는데 시간이 너무 오래 걸린다. 이미지 사이즈를 256으로 줄여아 할 것 같다.
- 아직 augmentation은 적용해보지 않았는데 여러 가지를 시도해봐야겠다.
'부스트캠프 AI Tech 1기 [T1209 최보미] > P stage-3 (객체검출)' 카테고리의 다른 글
Day7 학습정리 (0) | 2021.05.04 |
---|---|
Day6 학습정리 (0) | 2021.05.03 |
Day4 학습정리 (0) | 2021.04.29 |
Day3 학습정리 (0) | 2021.04.28 |
Day2 학습정리 (0) | 2021.04.27 |