Minseong Code Lab
← Projects
Bootcamp MissionComputer Vision

FashionMNIST 조건부 이미지 생성

조건부 생성 모델로 FashionMNIST 이미지를 만들어 보는 실습

게시 2026-07-10
PythonPyTorchtorchvisionJupyter
Contents · 목차
  1. 무엇을 하는 미션인가
  2. 조건을 넣는 방식
  3. 단계별 FID (feature=64)
  4. 한계

무엇을 하는 미션인가

FashionMNIST에서 원하는 클래스의 이미지를 생성하는 미션입니다. 조건부 GAN으로 시작해 확산 모델까지 단계적으로 바꿔가며 FID를 기록했습니다.

조건을 넣는 방식

레이블을 임베딩해 잠재 벡터와 이어 붙이는 구조입니다. 생성기의 첫 Linear 입력이 latent_dim + num_classes인 것이 그 근거입니다.

# notebooks/mission09.ipynb — 레이블 임베딩을 잠재 벡터에 이어 붙인다 (발췌)
class Generator(nn.Module):
    def __init__(self):
        super(Generator, self).__init__()
        self.label_emb = nn.Embedding(num_classes, num_classes)
        self.init_size = image_size // 4  # 7

        self.l1 = nn.Sequential(
            nn.Linear(latent_dim + num_classes, 128 * self.init_size * self.init_size),
            nn.ReLU(inplace=True)
        )
        # ... 업샘플 두 번(7 → 14 → 28) 후 Tanh

판별기와 함께 BCELoss로 학습하고, Adam(lr=0.0002, betas=(0.5, 0.999))을 씁니다. 후반부에는 SinusoidalPositionEmbeddings · ResBlock · UNet · DDPM을 추가로 구현해 확산 모델로도 생성했습니다.

단계별 FID (feature=64)

낮을수록 좋습니다. 노트북 출력 순서 그대로입니다.

단계FID (feature=64)
베이스 모델0.0083
1단계 — 학습 안정성 확보0.0048
2단계 — 모델 구조 개선0.0763
100 에폭0.0987
scheduler 적용0.0462
확산 모델0.0015

측정은 여섯 단계 모두 torchmetrics의 FrechetInceptionDistance(feature=64)로, 실제·생성 이미지 각각 len(test_loader.dataset)(노트북 기록 기준 10,000장)을 써서 같은 조건으로 계산했습니다.

값이 단조롭게 내려가지 않았습니다. 구조를 바꾼 2단계에서 FID가 오히려 올랐고, 에폭을 늘린 뒤에도 회복되지 않았습니다. 가장 낮은 값은 확산 모델 단계에서 나왔습니다. 각 단계는 여러 설정이 함께 바뀐 실험이라, 어떤 변경이 값을 움직였는지는 이 기록만으로 분리되지 않습니다.

한계

  • feature=64는 널리 보고되는 FID-2048과 다른 설정입니다. 특징 차원이 달라 다른 논문·모델의 FID 수치와 직접 비교할 수 없습니다. 위 표는 같은 특징·같은 이미지 수·같은 전처리를 쓴 이 노트북 내부의 단계 간 상대 비교로만 읽어야 합니다
  • 학습 시드와 생성 샘플링 난수까지 통제한 반복 측정은 없습니다
  • 생성 이미지의 품질은 수치 없이 판단하지 않았습니다
  • 생성 샘플 이미지는 노트북 안에만 있고 사이트로 옮기지 않았습니다