[트러블 슈팅][하이라이트 사진 추천] Linear Probing 학습 과정 - 100-hours-a-week/5-yeosa-wiki GitHub Wiki
1. 데이터 로딩 문제
-
학습에 사용할 데이터셋의 크기가 33GB로, 데이터를 로드해오는 것부터 어려웠음
- COLAB에서 학습을 돌리기 위해 Google Drive 연동
-
Google Drive에 압축 파일을 올리고 해제
-
Google Drive에서 제공하는 Extractor는 너무 느려서 사용 불가 → Colab에서 아래 코드 실행해서 압축 해제
!unzip "AVA_dataset.zip"
-
- COLAB에서 학습을 돌리기 위해 Google Drive 연동
-
Google Drive를 마운트 했다고 해도, 불러오는 속도가 너무 느렸음
→ 결국 로컬에서 학습
2. 정확한 학습 가이드의 부재
- 학습 방안이 제시되어 있는 논문에는 사용한 데이터셋, Loss, Optimizer만 나타나 있음
- 스코어 정규화를 하였는지, Epoch는 몇으로 돌렸는지가 나와있지 않았음
→ 방식을 나눠서 실험을 하고 최적의 결과를 도출
# 스코어 정규화 전
[epoch 1] Spearman Rank Correlation: 0.1410
[epoch 2] Spearman Rank Correlation: 0.3466
[epoch 3] Spearman Rank Correlation: 0.5080
[epoch 4] Spearman Rank Correlation: 0.5744
[epoch 5] Spearman Rank Correlation: 0.6079
# 스코어 정규화 후
[epoch 1] Spearman Rank Correlation: 0.1400
[epoch 2] Spearman Rank Correlation: 0.6030
[epoch 3] Spearman Rank Correlation: 0.6776
[epoch 4] Spearman Rank Correlation: 0.6947
[epoch 5] Spearman Rank Correlation: 0.7012
3. 배치 단위로 미리 저장한 이미지 임베딩과 스코어 매칭 불일치
a. 문제 개요
- AVA dataset을 배치 단위로 미리 임베딩 후
.pt
파일로 저장하여 학습에 활용하려고 했음 - 그러나 일부 이미지 로딩 실패(
Image.open(...)
)로 인해 임베딩 벡터 수와 스코어 수가 불일치하는 문제가 발생 - 이로 인해 학습 시
image_features
와scores
간의 매핑이 어긋나 모델이 정확히 학습되지 않았음
b. 발생 원인
-
batch_image_generator()
내부에서 이미지를 열 때 예외 발생 시 continue로 건너뛰게 되어 있음try: img = Image.open(row['image_url']).convert("RGB") ... except: print(f"[Error] Faild to load {row['image_url']}") continue
-
그러나 이후
.pt
파일 저장 시 사용된 인덱싱 로직은start_idx:end_idx
기준으로 DataFrame 상의 전체 인덱스를 고정적으로 참조torch.save({ 'image_names': df.iloc[start_idx:end_idx]['image_url'].tolist(), # ❌ 손실된 이미지 고려 안함 ... })
-
이로 인해 로드에 실패한 이미지가 누락되었음에도, 스코어는 고정된 인덱스를 기준으로 저장되어
embedding
과score
의 순서가 어긋남
c. 해결 방법: 임베딩-스코어를 함께 저장 및 불러오기
-
이미지 로딩이 성공한 경우에만 임베딩 벡터, 스코어, 이미지 이름을 각각 리스트에 수집하고, 동일한 순서로
.pt
에 저장image_names.append(row['image_url']) # ✅ 로딩 성공한 경우에만 추가 scores.append(row['mean_score']) images.append(img_tensor) ... torch.save({ 'image_names': image_names, 'image_features': embeddings.cpu(), 'scores': scores.cpu() }, f"ava_embeddings/ViT_B_32_train_image_batch_{count:04d}.pt")
-
학습 시에도
.pt
에서image_features
와scores
를 함께 불러와 정확히 정렬된 상태로 학습에 활용:for file in train_files: data = torch.load(file) train_features.append(data['image_features']) train_labels.append(data['scores'])
d. 핵심 정리
항목 | 내용 |
---|---|
문제 현상 | image_features 와 scores 의 매칭이 어긋남 |
원인 | 이미지 로딩 실패 시 continue 하면서도, df.iloc[start_idx:end_idx] 를 그대로 사용 |
증상 | 학습 시 loss 이상치, Spearman correlation 저하, 평가 오류 |
조치 | 이미지 임베딩과 정답 스코얼르 동시에, 같은 순서로 .pt에 저장 → 학습 시 동시에 로드 |
결과 | 학습/평가 시 정확한 임베딩–스코어 매칭이 보장됨 |