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
best_resnet34.pth 81MB · 로컬 보관best_resnet34.pth (노트북 폴더 기준)| 항목 | 값 |
|---|---|
| 베이스 모델 | 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) |
| 직접 수집 내용 | 국내 연예인 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 에폭, 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 시드 없음. 재현 불가 |
| 지표 | 값 | 테스트셋 | 비교 대상 (baseline 등) |
|---|---|---|---|
| accuracy | 0.675 | test 40장 | 없음 (무작위 3분류 기대값 약 0.33) |
| best val loss | 0.735 | val 48장 (16 에폭) |
측정 안 함.
| 장비 | 장비 이름 | 배치 크기 | 지연 시간 (샘플당, p50 / p95) | 처리량 (샘플/초) | 메모리 사용 |
|---|---|---|---|---|---|
| CPU | [미확인] | - | 측정 안 함 | 측정 안 함 | 측정 안 함 |
| GPU | [미확인] | 10 | 측정 안 함 (학습 중 tqdm 약 3.4 ~ 4.0 it/s) | 측정 안 함 | 측정 안 함 |
raw_dataset)torch.no_grad()(기울기 추적 끄기)와 model.eval()(Dropout·BatchNorm 동작 전환)은 역할이 다름 (노트북 정리)train_dataset = datasets.ImageFolder(root='./dataset/train', transform=transforms_train)
test_dataset = datasets.ImageFolder(root='./dataset/test', transform=transform_test)
print(len(train_dataset))
240
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)
optimizer = optim.Adam(model.parameters(), lr=1e-4)
criterion = nn.CrossEntropyLoss()
epochs, patience = 20, 3
# 에폭마다 val loss를 계산해 줄면 best_resnet34.pth 저장, 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
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}')
정확도: 67.5
같은 과제·데이터셋으로 학습한 모델이 생기면 여기에서 비교됩니다.