Notice
Recent Posts
Recent Comments
Link
반응형
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- AIStages
- github branch
- 리눅스7장
- 정보처리기사
- 파이썬
- 우분투리눅스
- java
- MAC OS
- Python
- 딥러닝
- repository 복구
- ai개발밋업
- 자바
- homebrew설치
- 부스트캠프 AI Tech
- 리눅스연습문제
- ann
- Swing
- backpropagation
- Git
- 운영체제
- BPTT
- 2020정보처리기사
- CNN
- 판교퇴근길밋업
- 운영체제연습문제
- Django
- RNN
- GitHub
- 쉽게배우는운영체제
Archives
- Today
- Total
코딩하는 애옹😸
Semantic Segmentation 대회에서 사용하는 방법 본문
728x90
반응형
Baseline 이후에 실험 해봐야할 사항들
1. 주의해야할 사항들
- 디버깅 모드 : 실험환경이 잘 설정되어있는지 체크, step에 따라 loss가 잘 감소한다면 CFG.debug=False로 하여 전체 실험 진행
if CFG.debug:
CFG.epochs = 2
train = train.sample(frac=0.05, random_state=CFG.seed).reset_index(drop=True)
- 시드 고정 : 실험마다 성능이 달라지는 것을 방지
def set_seeds(seed=42):
random.seed(seed)
os.environ['PYTHONHASHSEED'] = str(seed)
np.random.seed(seed)
torch.manual_seed(seed)
torch.cuda.manual_seed(seed)
torch.cuda.manual_seed_all(seed)
torch.backends.cudnn.deterministic = True
set_seeds()
- 실험 기록 : Network 종류, Augmentation 방법, Hyperparameter 등 기록
- 실험은 한 번에 하나씩 : 하나의 조건만을 변경하여 실험
- 팀원마다의 역할 분배
- 하나의 베이스라인 코드를 기반으로 가장 좋은 솔루션 만들기
- 독립적으로 베이스라인 코드를 만들어서 마지막에 앙상블
- EDA / 코드 만들기 / 솔루션 조사 / 디스커션 조사
2. Validation
- 제출을 하지 않아도 모델의 성능 평가 가능
- Public 리더보드의 성능에 오버피팅 되지 않도록 도와줌
- Hold Out
- 전체 데이터를 8:2로 분리해 Train data / Valid data로 분리
- 80% Train data로 학습, 20% Valid data로 검증
- 해당 모델로 Inference 진행
- K-Fold
- 전체 데이터를 8:2로 분리해 Train data / Valid data로 분리
- 단, split 개념을 도입하여 모든 데이터가 학습에 참여
- 독립적인 모델로 Test 데이터에 대해 각각 Inference한 후, Ensemble
- 전체 데이터를 8:2로 분리해 Train data / Valid data로 분리
- Stratified K-Fold
- Fold 마다 class distribution을 동일하여 Split함.
- Imbalanced Class에서 좋음
- Group K-Fold
- Class 별로 split함
3. Augmentation
- 데이터 수 증가
- Generalization 강화
- 성능 향상
- Class Imbalance 문제 해결
Augmentation Library - Torchvision.transforms
import torch
from torchvision import transforms
transforms = transforms.Compose([
transforms.Resize(256,256),
transforms.RandomSizedCrop(224),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225])
])
Augmentation Library - AutoAugment
Augmentation Library - FastAutoAugment
Augmentation Library - Albumentation
- 내장된 augmentation이 많고, 빠르고, pytorch와 연동하기 쉬움
1) Cutout
- 이미지의 특정 정보를 제한한 상황에서도 Classification을 잘하도록 학습
- Random하게 Box를 생성하기 때문에 사진마다 성능의 편차가 존재
transform = A.Compose([
A.Resize(224,224),
A.CoarseDropout( ## Cutout
max_holes=8, min_holes=4,
max_height=20, min_height=8,
max_width=20, min_width=8, p=1.0)
])
2) Gridmask
- 규칙성 있는 박스를 통해 Cutout
transform = A.Compose([
A.Resize(224,224),
A.GridDropout(ratio=0.2, # mask의 크기
random_offset=True, # mask의 시작점이 random한 offset
holes_number_z=4, holes_number_y=4, p=1.0)
])
3) Cutmix
- 두 개의 이미지를 특정 영역을 잘라서 결합
from cutmix.cutmix import CutMix
from cutmix.utils import CutMixCrossEntropyLoss
dataset = CifarDataset(data = df_train,
train=True, transform=train_transform)
dataset = CutMix(dataset, numclass=10, beta=1.0, prob=0.5, num_mix=2)
loader = DataLoader(...)
criterion = CutMixCrossEntropyLoss(True)
for _ in range(num_epoch):
for input, target in loader:
output = model(input)
loss = criterion(output, target)
loss.backward()
optimizer.step()
optimizer.zero_grad()
4) SnapMix
- CAM(Class Activation Map)을 이용해 이미지 및 라벨을 mixing
- 영역의 의미적 중요도를 고려해 라벨 생성
5) CropNonEmptyMaskIfExists
- object가 존재하는 부분을 중심으로 crop
transform = A.Compose([
A.augmentations.crops.transforms.CropNonEmptyMaskIfExists(height = 256, width = 256),
ToTensorV2()
])
4. SOTA Model
- HRNet
5. Scheduler
- Learning Rate
- 너무 작으면 학습 시간 오래 소요, Local minima에 빠질 위험
- 너무 크면 loss가 발산
1) CosineAnnealingLR
- LR의 최대값과 최소값을 정해, 그 범위의 학습율을 Cosine 함수를 이용해 스케줄링
- 최대값과 최소값 사이에서 LR을 급격하게 증가시켰다가, 감소시키기 때문에 saddle point, 정체 구간을 빠르게 벗어남
2) ReduceLROnPlateau
- metric의 성능이 향상되지 않을 때 LR을 조절
3) Gradual Warmup
- 학습을 시작할 때 매우 작은 learning rate로 출발해서 특정 값에 도달할 때까지 learning rate를 서서히 증가시킴
6. Hyperparameter Tuning
1) Gradient Accumulation
- 모델의 weight를 매 step마다 업데이트하지 않고, 일정 step 동안 gradient를 누적한 다음 누적된 gradient를 사용해 weight를 업데이트하는 방법
7. Optimizer / Loss
- Adam
- AdamW
- AdamP
- Radam
- Lookaheag optimizer
- Adam이나 SGD를 통해 k번 업데이트 후, 처음 시작했던 point 방향으로 1step back 후, 그 지점에서 다시 k번 업데이트를 시작하는 방법
- Other losses
- Compound Loss 계열은 imbalanced segmentation task에 강인
- DiceFocal loss
- DiceTopK loss
8. Ensemble
1) K-Fold Ensemble
2) Epoch Ensemble
- 학습을 완료한 후, 마지막부터 N개의 weight를 이용해 예측한 후 결과를 Ensemble
3) SWA(Stochastic weight Averaging)
- 각 step마다 weight를 업데이트 시키는 SGD와 달리 일정 주기마다 weight를 평균 냄
4) Seed Ensemble
- Random한 요소를 결정짓는 Seed만 바꿔가며 여러 모델을 학습시킨 후 Ensemble
5) Resize Ensemble
- Input 이미지의 크기를 다르게 학습해 Ensemble
6) TTA (Test time augmentation)
- Inference(Test) 시 data augmentation 적용
- 원본 이미지와 함께 augmentation을 거친 N장의 이미지를 모델에 입력한 후 각각의 결과를 평균
- TTA Library - `ttach`
import ttach as tta
transforms = tta.Compose([
tta.HorizontalFilp(),
tta.Rotate90(angles=[0,180]),
tta.Scale(scales=[1, 2, 4])
])
tta_model = tta.SegmentationTTAWrapper(model, transforms)
masks = tta_model(images)
9. Pseudo Labeling
1) train 진행
2) 성능이 가장 좋은 모델에 대해 Test 데이터셋에 대한 예측 진행
- Test 데이터셋은 모델의 예측값이 threshold보다 높은 결과물을 이용
3) 2에서 예측한 test 데이터셋과 train 데이터셋을 결합해 새롭게 학습 진행
4) 3에서 학습한 모델로 Test 데이터셋 예측
10. 외부 데이터 활용
- Kaggle 참고
11. 그 외
- Classification 결과를 활용하는 방법
- Encoder Head 마지막단에 Classification Head를 달아서 활용 (Unet3+)
- 한정된 시간을 효율적으로 활용
반응형
'부스트캠프 AI Tech 3기 > Study' 카테고리의 다른 글
VScode에서 AI Stages 서버 연결 for 부캠퍼 (0) | 2022.05.12 |
---|---|
AI와 저작권법 (0) | 2022.02.16 |
[PyTorch] Troubleshooting (0) | 2022.01.27 |
[PyTorch] Multi-GPU (0) | 2022.01.27 |
[PyTorch] 모델 불러오기 (0) | 2022.01.26 |
Comments