본문 바로가기
Kaggle, Dacon

캐글 노트북에서 기존 터미널과 똑같이 split하기

by Yonghip 2024. 8. 26.

이 글은 window or wsl에서 모델을 돌리면서 그 결과를 캐글에서 시각화하고 싶은 특이한 상황에 대처하기 위해 쓴 글이다.

문제 상황

모델을 풀로 학습시키면서 추가로 validation결과를 보고 싶어서 캐글에 기존 코드, 데이터를 전부 넣고 예측했는데 예측결과가 과하게 좋았다.

확인해 보니 기존 valid set과 캐글에서 사용한 valid set의 라벨 비율, 그리고 dataset의 label 순서는 맞았지만 파일명 순서는 맞지 않았다.

 

random seed, python version, numpy 같은 라이브러리 버전 등등 모두 확인했지만 문제는 없었고 투자한 시간에 대비 아무 성과가 없어 GPT와 스택오버 플로를 마구 뒤졌다.

해결법

놀랍게도 해결법은 어이없을 정도로 단순했다. 이번 코드에 과거 ViT논문을 구현하며 사용한 dataset class를 base로 사용했는데 거기선 image folder가 아니라 직접 file을 읽고 인덱스에 따라 가져왔다. 

 

그런데 확인해 보니 wsl에서의 파일 순서와 캐글에서의 파일 순서가 달랐다. 해결법은 sorted를 붙인게 전부다.

#기존 코드
pos_images = os.listdir(os.path.join(IMAGE_ROOT, "OK"))

#개량?한 코드
pos_images = os.listdir(os.path.join(IMAGE_ROOT, "OK"))
pos_images = sorted(pos_images)

 

확인해보니 pytorch의 image folder에는 이게 기본적용돼있다. 파일 이름에 특수문자가 몇 개 들어가 있는데 아마 window와 linux가 이를 처리하는 방식이 달라 생기는 문제 같다.


과거에도 image folder뿐만 아니라  dataset 읽을 때에 정렬이 들어가는 건 알고 있었는데 옛날에 이게 그냥 시간 잡아먹는 코드라 지우고 dataset.py를 작성했던 것 같다. 정말 큰 시간을 들여 하나 배웠고 다시는 잊지 않을 것 같다.