배경
FashionMNIST 데이터셋으으로 GAN과 LDM모델을 구현하고 성능을 보는 실험을 하고 있었는데, 이미지의 품질을 보기 위해서 FID를 사용했는데, 문제들이 많이 발생했다.
문제1. FID가 1 아래로 나왔다.
GAN모델의 경우 상식적인 FID값이 나왔는데, LDM학습을 하다보니 FID값이 1 아래로 나왔다. 직관적으로 말이 안되는 수치였다. 초기학습단계에는 이미지가 노이즈 수준일텐데, 1아래로 나온다는건 왜 그랬을까 ?
원인
FrechetInceptionDistance(feature=64)로 설정했던 것이 문제였다. feature 수가 너무 작으면 실제 이미지와 생성 이미지의 분포 차이를 제대로 잡아내지 못한다는 것을 알게 됐다.
# 문제가 된 코드
fid = FrechetInceptionDistance(feature=64).to(device)
해결
feature를 표준값인 2048로 변경했더니 초기 학습 단계에서 FID가 231로 나왔다. 이 값이 훨씬 정상적인 범위였다.
# 수정된 코드
fid = FrechetInceptionDistance(feature=2048).to(device)
문제2. GAN과 LDM의 FID 측정 방식이 달랐다
원인
GAN에서는 매 step마다 실제 이미지와 가짜 이미지를 비교해서 FID를 계산했고, LDM에서는 에폭이 끝난 후 ddpm.sample()로 생성한 이미지로 FID를 계산했다. 두 방식이 달랐기 때문에 직접 비교가 의미없다는 것을 깨달았다.
해결
FID를 직접 비교하는 것을 포기했다. 대신 각 모델의 FID를 따로 보고, 최종적인 성능 비교는 생성 이미지를 눈으로 직접 확인하는 방식으로 변경했다.
문제3. 매 에폭마다 FID를 계산하니 너무 오래 걸렸다
ddpm.sample()은 T=200 스텝을 역방향으로 모두 돌아야 하기 때문에 500장을 생성하려면 상당한 시간이 걸렸다. 매 에폭마다 FID를 계산하면 학습 시간이 너무 길어졌다.
해결
5에폭마다 FID를 계산하도록 변경했다. 학습 트렌드를 모니터링하는 데는 충분했다.
if (epoch+1) % 5 == 0:
# FID 계산
fid.reset()
fid_avg = fid.compute().item()
else:
fid_avg = float('nan')
문제4. Best Model 저장 기준 애매
GAN은 30에폭 학습에 feature=64 기준으로 best model을 저장했고, LDM은 150에폭 학습에 feature=2048 기준으로 best model을 저장했다. 기준이 다르다 보니 두 best model을 비교하는 것 자체가 의미없었다.
해결
각 모델의 마지막 에폭 결과를 사용하기로 했다. 그리고 FID 그래프에서 best값을 표시하는 것도 제거하고, 단순히 학습 진행에 따른 FID 변화 트렌드만 확인하는 방식으로 변경했다.
배운 점
● FID는 측정 방식에 따라 값이 크게 달라진다. feature 수, 샘플 수, 어떤 이미지를 비교하느냐에 따라 완전히 다른 결과가 나오기 때문에 단순히 수치만 보고 좋고 나쁨을 판단하면 안 된다는 것을 배웠다.
● 정량적 지표가 항상 정답은 아니다. FID 수치가 낮다고 무조건 좋은 모델이 아닐 수 있다. 결국 생성 이미지를 직접 눈으로 확인하는 것이 가장 직관적이고 정확한 평가 방법이라는 것을 다시 한번 깨달았다.
'TIL' 카테고리의 다른 글
| [TIL] #16 2026-04-23 (0) | 2026.04.23 |
|---|---|
| [TIL] #15 2026-04-22 (0) | 2026.04.22 |
| [TIL] #13 2026-04-12 (0) | 2026.04.12 |
| [TIL] #12 2026-04-10 (1) | 2026.04.10 |
| [TIL] #11 2026-04 -08 (2) | 2026.04.08 |
