호기심 많은 분석가
[BoostCamp] Week4_Day18. 여러가지 실험들 본문
부스트캠프
개발자의 지속 가능한 성장을 위한 학습 커뮤니티
boostcamp.connect.or.kr
🕵🏻♂️마스크착용 분류 대회
- Batch_size를 256까지 키우니까 일반화 성능이 떨어지는 것으로 판단
- transforms대신 더 빠른 albumentation을 사용해봄
- Image 라이브러리 대신 cv2를 사용하는데, BILINEAR의 경우 INTER_LINEAR로 ToTorch는 있었으나 사라지면서 ToTensorV2를 사용해야 한다고 함
- ToTensorV2를 사용하면 tensor형태가 되어 Normalize시에 astype이 적용되지 못한다. 그래서 Normalize를 먼저 시행해줘야 함
- augmented = self.transforms(image = img)처럼 image라고 명시해줘야하고, img = augmented['image']의 문법을 따름
- ResNet152 model을 사용하고자 했으나 1epoch에 10분 이상이 걸려서 ResNet50으로 성능 확인 중
- ResNet18과 다르게 feature가 2048개기 떄문에 2048 → 512로 보내주는 layer를 한층 더 쌓아주었다.
- 멘토님이 알려주신 black과 isort 라이브러리를 굉장히 잘 사용 중
📙개인학습
(7강) Training & Inference 1
학습 프로세스에 필요한 요소를 크게 아래와 같이 나눌 수 있습니다.
- Loss, Optimizer, Metric
1. Loss
1-1. 복습: (오차) 역전파
- Error Backpropagation
- Loss도 사실은 nn.Module Family
- loss.backward()
- 이 함수가 실행되면 모델 파라미터의 grad 값이 업데이트 된다.
- Net이라는 모델은 모듈을 상속하고 있는 패밀리다. criterion이라는 loss도 모듈을 상속하고 있다. 같은 클래스, 패밀리라는 뜻 → model에 input으로 들어간 것이 output으로 나오는 chain이 만들어짐, criterion도 모듈을 상속한 것이기 때문에 output을 받으면 forward 함수와 연결 짓는 chain이 이어지게 됨 → backward 하나로 전체 chain의 파라미터를 업데이트할 수 있다.
Example : 조금 특별한 Loss
- 쉽게 말해서 Error를 만들어내는 과정에 양념을 치는 것
- Focal Loss
- Class Imbalance 문제가 있는 경우, 맞춘 확률이 높은 Class는 조금의 loss를, 맞춘 확률이 낮은 Class는 Loss를 훨씬 높게 부여
- Label Smoothing Loss
- Class target label을 Onehot 표현으로 사용하기보다는 ex) [0, 1, 0, 0, 0,...]
조금 Soft 하게 표현해서 일반화 성능을 높이기 위함 ex) [0.025, 0.9, 0.025,...]
- Class target label을 Onehot 표현으로 사용하기보다는 ex) [0, 1, 0, 0, 0,...]
2. Optimizer
- 어느 방향으로, 얼마나 움직일지?
- 영리하게 움직일수록 수렴은 빨라집니다.
2-1. LR scheduler
- 학습 시에 Learning rate를 동적으로 조절할 수는 없을까?
- StepLR - 특정 Step마다 LR 감소
- CosineAnnealingLR - Cosine 함수 형태처럼 LR을 급격히 변경
- ReduceLROnPlateau - 더 이상 성능 향상이 없을 때 LR 감소
3. Metric
3-1. 모델의 평가
학습에 직접적으로 사용되는 것은 아니지만 학습된 모델을 객관적으로 평가할 수 있는 지표가 필요
- Classification - Accuracy, F1-Score, precision, recall, ROC&AUD
- Regression - MAE, MSE
- Ranking - MRR, NDCG, MAP / 순서가 중요할 때
3-2. Metric의 허와 실
- 우측의 경우 정확도가 90% 더라도 타깃이 1번일 때 200개 중에 100개 밖에 맞추지 못함, 그래서 평가지표가 중요
- 데이터 상태에 따라 적절한 Metric을 선택하는 것이 필요
- Class 별로 밸런스가 적절히 분포 → Accuracy
- Class 별 밸런스가 좋지 않아서 각 클래스 별로 성능을 잘 낼 수 있는지 확인 필요 → F1-Score
(8강) Training & Inference 2
1. Training Process
- PyTorch는 이론적인 내용들을 다 구현해볼 수 있는 프레임워크
1-1. Training 준비
- 학습 한번 하기 위해 지금까지 만든 결과물
1-2. Training 프로세스의 이해
- 모델을 train 하기에 앞서서, trainable 하게 만들어줘야 함 → model.train()
- Dropout, BatchNorm을 사용해줄 수 있게 해 줌
- Epoch은 전체 데이터를 다 본다. 데이터 로더에 for문을 넣어서 batch단위로 뽑아내게끔,
- optimizer.zero_grad() : optimizer는 loss가 backward가 되는 데 있어서 각각의 모델 파라미터 안에 있는 gradient를 update 시킨다. 이때 zero_grad를 사용해주지 않으면 이전의 그라드가 남아있다. 새로운 batch에선 새로운 학습을 시키기 위해 grad를 초기화시켜줌 → 일반적인 경우에 이렇지 항상 해줘야 하는 것은 아님
- 그러니까 이미 backward를 호출하면 .grad 값에 변화도가 저장이 되는데 zero_grad를 하지 않으면 이전에 저장된 .grad의 값이 다음 루프의 업데이트에도 간섭을 받아서 원하는 방향으로 학습이 안된다고 한다.
- loss = criterion(outputs, labels)
- Input → nn.Module → forward → Criterion==loss : Chain → output
- loss의 grad_fn chain → loss.backward()
- 그 모델 파라미터에 인풋에 해당하는 이미지를 집어넣고 forward 하면 각각의 연결되어있는 모듈의 grad_fn에 backward가 적용된 것을 확인할 수 있다 → 걔네들이 iteration을 돌면서 연결되어 있는 chain이 만들어짐 → grad_fn에서 계속 추가되면서 이전에 작업했던 모델의 파라미터까지 연결됨, loss가 grad_fn을 찾아서 걔네들이 가지고 있는 adam 같은 함수를 실행시켜주면 각각의 연결된 파라미터에게 grad를 업데이트할 수 있다. → 이 모든 걸 backward() 한번 실행으로 가능하다.
- More: Gradient Accumulation
- batch_size가 중요한 Task가 있을 수 있다. GPU의 성능이 부족해서 작은 batch_size만 사용할 수 있는데, 이럴 경우(큰 batch_size를 써야 할 때)는 어떻게 해줘야 할까?
- 일정 간격마다 optimizer.step()을 밟아주면 step 하기 전에는 batch가 돌면서 loss만 쌓이다가 일정 간격이 됐을 때, 지금까지 쌓인 loss를 통해 파라미터를 업데이트하면서 학습한다 == Gradient Accumulation
- batch_size가 중요한 Task가 있을 수 있다. GPU의 성능이 부족해서 작은 batch_size만 사용할 수 있는데, 이럴 경우(큰 batch_size를 써야 할 때)는 어떻게 해줘야 할까?
2. Inference Process
2-1. Inference 프로세스 이해
- model.eval()
- with torch.no_grad():
- 검증을 거치는 과정이기 때문에 파라미터가 업데이트되길 원하지 않음
- enter라는 함수가 실행되는데, set_grad_enable(False) - 이 영역 안에서 모든 grad enable는 False로 만든다
2-2. Validation 확인
- 추론 과정에 Validataion 셋이 들어가면 그게 검증입니다
2-3. 최종 Output, Submission 형태로 변환
- 최종 Submission 스펙을 확인 후 변환하여 제출
3. Appendix: Pytorch Lightning
- 이제껏 배웠던 내용들 굉장히 중요하다. 이해하는 데도 필수적이고, 하지만 협업에서는 생산성이 중요해서 이런 작업들이 번거로울 수 있다. → 그래서 Pytorch Lightning 등장
- Keras 코드를 보는 듯 → 점점 개발되는 중
- 하지만 공부는 Pytorch로 했으면 한다. 충분한 이해가 바탕이 되지 않은 상태에서는 오히려 독이 될 수도 있다. 코드로부터 머신러닝 프로세스를 배울 수 있고 자유롭게 응용할 수 있음
👨👨👦👦피어세션
굿모닝 세션 😉
- 원상님께서 train과 val의 차이가 크지 않고 성능이 좋은데, 왜 결과가 안 좋게 나올까.. 테스트 셋 형태를 확인해봐야겠다 → 이미지를 잘라서 그런 건 아닐까? train과 val을 분리할 때 사람을 아예 분리해서 그런 건 아닐까?
- 성능 하락 원인 예측
- 얼굴만 따로 자른다
- 해상도가 낮다
- 사람을 아예 분리한다
- 성능 하락 원인 예측
- gnerator와 model의 성능을 비교해볼 수 있는 게 있을까
- 조금 복잡할 것, model이 GPU에서 계산할 때 generator가 CPU가 작업하는 시간을 비교해봐야 해서
- imbalance class에 가중치를 어떻게 주는가?
- 정훈
- 이미지를 잘라서 활용하는 것보다 그냥 활용하는 게 좋을 수도 있음
- 배경, 옷 등 요인이 영향을 미칠 수 있음
- 현동
- crop 한 것과, crop 안 한 것 같이 학습을 시키니 성능이 좋아지더라..!
- 주영
- epoch 별로 가중치를 저장하여 5, 10, 15일 때의 성능을 비교해봤는데 epoch 별 성능 차이가 크지 않은 것 같음
굿에프터눈 세션 😄
오늘부터는 팀 병합을 해야 하기 때문에 협업 방법에 대해 심도 깊게 이야기 나눔
- 데이터 정리 방법(실험)
- 같은 사람이 train과 val에 나뉘지 않도록 한다 → resnet18로 주영 실험
- class가 stratify 하게 나뉘게 사람 상관없이 나눈다.
- 데이터 전처리 방법(실험)
- crop 유무
- 데이터셋 - 원상님
- 3개의 classifier를 argument를 통해서 option으로 선택할 수 있다.
[AI Tech]Daily Report
Naver AI Tech BoostCamp 2기 캠퍼 허정훈 2021.08.03 - 2021.12.27 https://bit.ly/3zvJnSh
data-hun.notion.site
'Coding > BoostCamp' 카테고리의 다른 글
[BoostCamp] Week5_Day20. 6일만의 상승 (6) | 2021.09.01 |
---|---|
[BoostCamp] Week4_Day19. 팀 병합의 날 (0) | 2021.09.01 |
[BoostCamp] Week4_Day17. 여러번의 실패와 깊은 이해 (0) | 2021.08.30 |
[BoostCamp] Week4_Day16. 모델의 완성 (0) | 2021.08.27 |
[BoostCamp] Week4_Day15. P-Stage의 시작 (0) | 2021.08.25 |