대회를 앞둔 특강에서 강사님께서 이런 얘기를 강조하셨다.
신뢰할 수 있는, 테스트 결과와 비슷한 추세를 갖는 validation set을 만들어 놓으면, 나중에 제출횟수의 부담 없이 많은 실험을 해볼 수 있다.
테스트 데이터셋을 보니 어그멘테이션이 강하게 들어간 더러운(?) 이미지들이 많았다. 그래서 트레인 이미지도 테스트 이미지처럼 최대한 더럽게 만들고 폴드를 나눠 검증하기로 했다. k-fold는 클래스별로 비율을 맞춰서 넣을 수 있게 하는 StratifiedKFold를 사용해 폴드 5개로 나눠서 4개 폴드가 돌 때 1개 폴드는 검증용으로 쓸 수 있도록 했다. (처음에는 임밸런스된 데이터, 1, 13, 14번 클래스의 이미지가 적은 상태로 데이터를 증강시킨 것을 사용했기 때문에, 부족한 클래스도 골고루 들어갈 수 있도록 스트랫파이드폴드를 썼는데 나중에는 데이터 밸런스를 맞춰주기도 했다.)
내가 했던 방식은 원래 데이터셋(Not augmentation, 1570장)에 이걸로 10배 정도 augmentation한 데이터를 섞어서 전체 학습 데이터셋으로 정의하고, 여기서 폴드를 5개로 나눈 방식이였다. 그런데, 클로드랑 얘기하다가 얘가 어그멘테이션된 데이터는 밸리데이션 셋에 넣으면 안된다고, 그러면 오버피팅된다고 원래 트레인 데이터셋만 가지고 거기서 밸리데이션셋을 구성하라는 거다.
아니 근데 트레인 데이터 양 자체가 너무 적어서 증강시킨거고, 테스트 데이터에 최대한 맞추려고 트레인을 강하게 어그멘테이션을 줘서 만든건데 이걸 넣지 말라는게... 읭? 이해가 안가서 멘토님께 질문을 했다.
Q. 지금 validation set을 만들 때 StratifiedKFold를 사용해서 5개 폴드를 만들고 한 폴드를 돌아가면서 validation set으로 만드는 방식으로 하고 있습니다. train 데이터에 어그멘테이션을 한 이미지도 한꺼번에 저장해서 전체 트레인 데이터를 만들고 거기서 폴드를 나눴는데요. 찾아보니까 어그멘테이션 된 이미지는 밸리데이션 셋에 안 넣는 게 좋다고 하더라구요. (오버피팅이 될 수 있다고?) 그렇다면, validation set을 만들 때 대회에서 준 트레인 데이터셋만 가지고 만들어야 할까요? 그렇기에는 기존 트레인 데이터셋이 1570장인가 엄청 작았는데, 그럼 중복해서 이걸로만 평가하면 이것도 오버피팅이 아닐까 싶기도 해요.
A. StratifiedKFold 할때,
aug된 데이터 + aug된 데이터 + aug된 데이터 + aug된 데이터 + aug안된 valid데이터
aug된 데이터 + aug된 데이터 + aug된 데이터 + aug안된 데이터 + aug된 valid데이터
aug된 데이터 + aug된 데이터 + aug안된 데이터 + aug된 데이터 + aug된 valid데이터
aug된 데이터 + aug안된 데이터 + aug된 데이터 + aug된 데이터 + aug된 valid데이터
aug안된 데이터 + aug된 데이터 + aug된 데이터 + aug된 데이터 + aug된 valid데이터
요렇게 하신다는 뜻이죠?..
Q. aug된 데이터 9 : aug안된 원래 주어졌던 데이터 1 이 비율로 섞여 있는 데이터셋이 10이라고 하면, 그 10을 5개 폴드로 나눈 방식으로 했어요!
A. 아 넵! 제 생각에는 큰 문제가 안될것 같습니다. 또 이번 대회가 평가 데이터셋과 학습 데이터셋 사이의 차이가 커서 괜찮을것 같아요..
그리고 실험을 해보기 전에는 모두 가설이라는 점... 실험을 해서 결과를 봐야 포트폴리오에 적을 수 있습니다.
이렇게 답변을 받고 그냥 처음 내 생각대로 했다. ㅋㅋㅋㅋ
그리고 폴드를 5개 나눠서, 폴드 나눈 것들마다 모델을 하나씩 뽑고 이 모델들을 앙상블해서 최종 모델을 뽑는 방식으로 적용했다.
정리하면, 트레인셋 폴더 안에 원래 1570장에다가 임의로 부족한 클래스에 대해 증강한 이미지, 그리고 각 이미지별로 10배씩 어그멘테이션까지 다 한 총 17860장의 이미지가 있다. 여기서 train 데이터를 가지고와서 폴드를 나눴으니, validation data set 안에도 어그멘테이션된 데이터가 들어간 셈이다. 그리고 이전 방식과 동일한 모델과 파라미터 똑같이 써서 올렸는데, 점수가 높아졌다!
Rasnet 모델을 사용하고 다른 파라미터 아마 거의 비슷한 상태(기억이 가물가물한데 아마 비슷할거다..)에서 폴드를 나눠서 앙상블한 경우에 퍼블릭에서 0.48, 프라이빗에서 0.52. 폴드 나누기 전에는 0.39 / 0.41.
'공부방 > Upstage AI Lab 4기' 카테고리의 다른 글
[CV 문서 분류 대회] 어떤 사이클을 돌았나요? 사이클별 실험 정리 (0) | 2024.11.12 |
---|---|
[CV 문서 분류 대회] 최적의 계산 효율을 이끌어낼 데이터셋의 크기? (0) | 2024.11.11 |
[CV 문서 분류 대회] 셋째 날 정리: 임밸런스 데이터 맞춰주기 (0) | 2024.11.04 |
[CV 문서 분류 대회] 두 번째 날 정리 (0) | 2024.11.01 |
[CV 문서 분류 대회] 베이스라인 돌려보고 흐름 파악하기 (1) | 2024.10.31 |