← 모델 목록
수업 실습 2026-09-08 · image-classification
CNN 계열 (ResNet, ImageNet 사전학습)

torchvision resnet34 (ResNet34_Weights.DEFAULT)

ResNet34 전이학습 인물 사진 3분류 - 웹 스크래핑 커스텀 데이터셋 (수업 실습)
모델
잔차 연결(skip connection)을 쓰는 34층 ImageNet 사전학습 CNN. 백본을 모두 얼리고 마지막 fc만 3개 클래스로 바꿔 학습
사용 목적
이미지 검색 사이트에서 직접 모은 사진으로 커스텀 데이터셋(ImageFolder)을 만들고 전이학습으로 분류하는 흐름을 익히려고 사용
코드
mnmms/dl
가중치
best_resnet34.pth 81MB · 로컬 보관
best_resnet34.pth (노트북 폴더 기준)
accuracy67.5%
학습 시간1.7분
추론 CPU / GPU측정 안 함

데이터

  • Bing 이미지 검색 스크래핑 · 인물 3명
  • train 240 (→ 192 / val 48) · test 40
  • 224×224로 리사이즈 (비율 무시)

학습

  • 백본 전체 동결 · fc 512→3 교체
  • Adam lr 1e-4 · 배치 10 · 19 에폭 (early stop)
  • GPU(CUDA) · 약 1.7분

결과

  • test accuracy 0.675 (40장)
  • best val loss 0.735 (16 에폭)

배운 점

  • 얼굴이 아닌 사진 전체를 찌그러뜨려 넣음
  • 노트북 메모: 얼굴 중심 크롭이 필요
개요용도 의도한 용도: 웹 이미지로 커스텀 데이터셋을 만들고 전이학습으로 분류해 보는 수업 실습 대상 사용자: 해당 없음 (학습용…

용도

  • 의도한 용도: 웹 이미지로 커스텀 데이터셋을 만들고 전이학습으로 분류해 보는 수업 실습
  • 대상 사용자: 해당 없음 (학습용)
  • 의도하지 않은 용도: 얼굴 인식·신원 확인 등 실제 인물 식별 용도. 실존 인물 사진이라 공개 서비스에 쓰면 안 됨

모델 정보

항목 값
베이스 모델 torchvision.models.resnet34(weights=ResNet34_Weights.DEFAULT) (ImageNet-1k 사전학습)
크기 · 변형 ResNet34 (torchinfo.summary 출력). 학습되는 파라미터는 fc 1,539개 [🚩AI 설명] (512×3 + 3으로 계산)
리비전 torchvision 0.29.0+cu126 (uv.lock 기준)
아키텍처 ResNet34 백본(전체 동결) → fc = Linear(512, 3)
학습 방식 전이학습 (백본 동결, 분류층만 학습)
프롬프트 · 에이전트 구성 해당 없음
데이터확보 방식 직접 수집 출처 Bing 이미지 검색 결과 ( better_bing_image_downloader ) 직접 수집 내…
항목 값
확보 방식 직접 수집
출처 Bing 이미지 검색 결과 (better_bing_image_downloader)
직접 수집 내용 국내 연예인 3명의 이름으로 각각 최대 100장 검색·다운로드(limit=100, 성인 필터 켬). 폴더명이 곧 라벨(ImageFolder). 앞의 80장은 train, 나머지는 test로 옮김(dataset_split). 원본은 raw_dataset/에 복사해 보관. 수집일 2026-09-08 [🚩AI 설명] (폴더 시각 기준)
이용 조건 확인 수업 실습용으로 수집. 이 카드는 개인 웹 포트폴리오용으로 게시하기로 함 (사용자 확인 2026-10-12). 사진은 카드에 넣지 않음
규모 280장: train 240 (클래스당 80) / test 40 (12 / 12 / 16)
분할 train 240을 8:2 random_split → train 192 / val 48 (시드 없음). test 40은 다운로드 순서 기준
레이블·클래스 분포 train 균등 (80 / 80 / 80), test 12 / 12 / 16
전처리 train: Resize((224,224)) → RandomHorizontalFlip(0.5) → ToTensor → Normalize(0.5, 0.5). test: 반전 없이 같음
개인정보·민감정보 처리 실존 인물 얼굴 사진. 이 허브에는 사진·인물 이름을 넣지 않음. 코드 레포의 dataset/, raw_dataset/ 공개 여부 [미확인]
학습하이퍼파라미터 Adam(lr=1e-4) , CrossEntropyLoss , 배치 10 에폭 / 스텝 최대 20 에폭, ear…
항목 값
하이퍼파라미터 Adam(lr=1e-4), CrossEntropyLoss, 배치 10
에폭 / 스텝 최대 20 에폭, early stopping(patience 3, val loss 기준) → 19 에폭에서 중단
학습 시간 약 1.7분 (노트북 출력: 18 에폭까지 97.5초, 에폭당 약 5초)
하드웨어 GPU (device='cuda'). 장비는 이 컴퓨터의 NVIDIA GeForce RTX 4070 Laptop GPU 8GB로 보이나 노트북에서 직접 확인하지는 않음 [미확인]
프레임워크 torch 2.14.0+cu126, torchvision 0.29.0, better-bing-image-downloader
시드 · 재현 방법 train/val random_split 시드 없음. 재현 불가
결과accuracy 0.675 test 40장 없음 (무작위 3분류 기대값 약 0.33) best val loss 0.735 va…
지표 값 테스트셋 비교 대상 (baseline 등)
accuracy 0.675 test 40장 없음 (무작위 3분류 기대값 약 0.33)
best val loss 0.735 val 48장 (16 에폭)
  • 에폭별 val loss: 1.041 → 0.852(10) → 0.812(13) → 0.735(16), 이후 3 에폭 개선 없어 중단 (노트북 출력)
  • [🚩AI 설명] test가 40장이라 1장이 2.5%p입니다. 검색 결과에는 같은 사진의 중복이나 다른 인물이 섞일 수 있는데 정제 여부는 확인하지 않았습니다 [미확인]

추론 성능 (CPU / GPU)

측정 안 함.

장비 장비 이름 배치 크기 지연 시간 (샘플당, p50 / p95) 처리량 (샘플/초) 메모리 사용
CPU [미확인] - 측정 안 함 측정 안 함 측정 안 함
GPU [미확인] 10 측정 안 함 (학습 중 tqdm 약 3.4 ~ 4.0 it/s) 측정 안 함 측정 안 함
한계 · 배운 점한계 알려진 실패 유형: [미확인] (틀린 사진을 따로 보지 않음) 편향 / 공정성 이슈: 인물 3명, 각 80장의 검색 결과…

한계

  • 알려진 실패 유형: [미확인] (틀린 사진을 따로 보지 않음)
  • 편향 / 공정성 이슈: 인물 3명, 각 80장의 검색 결과만 학습
  • 성능이 떨어지는 입력 조건: 얼굴이 작게 나온 사진. 노트북 메모: 사진 전체를 224×224로 찌그러뜨려 넣었고, 얼굴을 찾아 잘라 넣어야 함

배운 점

  • 노트북 메모: 분류 모델은 분류하는 데이터에 대한 이해도가 높아야 함. 사람 얼굴을 찾아 224×224로 잘라야 잘 나옴
  • 노트북 메모: 학습이 빠른 이유는 전이학습이라 가중치를 얼려 놨기 때문
  • 노트북 메모: 원본 데이터는 꼭 남겨 두기 (raw_dataset)
  • torch.no_grad()(기울기 추적 끄기)와 model.eval()(Dropout·BatchNorm 동작 전환)은 역할이 다름 (노트북 정리)
사용 방법코드 셀 4개
In [1]데이터셋 만들기
train_dataset = datasets.ImageFolder(root='./dataset/train', transform=transforms_train)
test_dataset = datasets.ImageFolder(root='./dataset/test', transform=transform_test)
print(len(train_dataset))
Out[1] 출력 보기
240
In [2]모델 준비 (전체 동결 + fc 교체)
weights = models.ResNet34_Weights.DEFAULT
model = models.resnet34(weights=weights)

for param in model.parameters():
    param.requires_grad = False

model.fc = nn.Linear(in_features=512, out_features=3)
In [3]학습 (early stopping)
optimizer = optim.Adam(model.parameters(), lr=1e-4)
criterion = nn.CrossEntropyLoss()
epochs, patience = 20, 3
# 에폭마다 val loss를 계산해 줄면 best_resnet34.pth 저장, 3번 연속 안 줄면 중단
Out[3] 출력 보기
Best Model Saved!!! :)
epoch 1 / loss: 1.0411284118890762 / time: 5.222661018371582
...
Best Model Saved!!! :)
epoch 16 / loss: 0.7351135164499283 / time: 86.12172555923462
epoch 17 / loss: 0.756317064166069 / time: 91.87902450561523
epoch 18 / loss: 0.7572726011276245 / time: 97.47896599769592
EarlyStopping !!!!! 3 / 3
In [4]테스트 정확도
model.eval()
with torch.no_grad():
    corrects = 0
    for data, labels in test_dataloader:
        preds = model(data.to(device))
        pred = torch.max(preds, 1)[1]
        corrects += torch.sum(pred == labels.to(device).data)
    print(f'정확도: {corrects / len(test_dataset) * 100}')
Out[4] 출력 보기
정확도: 67.5

같은 과제·데이터셋 비교

같은 과제·데이터셋으로 학습한 모델이 생기면 여기에서 비교됩니다.