W1
Deeplearning W1 Hackathon
아이콘 이미지 분류
이번 주 배운 CNN으로 32×32 아이콘 이미지를 10개 클래스로 분류합니다. 합성곱·풀링이 만든 표현을 실제 데이터로 검증하고, 과적합을 실험으로 진단합니다.
- METRIC
- Accuracy
- LEVEL
- 초중급
- EST. TIME
- 2시간
- BASELINE
- CNN
Start Here / Step 00
데이터와 제출 규격부터 확인하세요
32×32 흑백 이미지 · 픽셀 열 0~1023 (1,024개)
Starter / Step 00b
여기서 출발하세요
기준선 · Accuracy 0.79 (seed 0)
ZIP을 푼 폴더에서 그대로 실행하면 submission.csv가 만들어집니다. 완성된 답이 아니라 기준선입니다 — 먼저 제출해 점수를 확인하고, 아래 항목을 바꿔가며 개선하세요.
From the Lectures · 이 코드가 출발한 강의
- 12강 · 컴퓨터비전 입문 — CNN 기초
- nn.Conv2d와 nn.MaxPool2d를 왜 겹쳐 쌓는지
- 13강 · 데이터 증강과 전이학습
- 이 코드의 원형(conv 32/64 + 은닉 128)과 증강 기법
- 3강 · 첫 신경망 5분 데모
- /255.0 스케일 맞추기와 CrossEntropyLoss
- 9강 · 일반화와 최적화
- 과적합을 학습·검증 곡선으로 진단하기
dl-w1.py · PyTorch
import pandas as pd, torch, torch.nn as nn
torch.manual_seed(0) # 13강처럼 시드 고정 — 이게 없으면 돌릴 때마다
# 점수가 흔들려 "내 개선이 효과가 있었나"를 못 가린다
tr, te = pd.read_csv("train.csv"), pd.read_csv("test.csv")
classes = sorted(tr["label"].unique()) # 10개 클래스 이름 — 정렬해야 매번 같은 순서
# CSV의 픽셀 1,024개(0~1023 열)를 32×32 격자로 되돌린다. Conv2d는 3강에서 쓴 한 줄짜리
# 목록이 아니라 (장수, 채널, 높이, 너비) 4차원을 받는다. 흑백이라 채널은 1.
# / 255.0은 0~255 정수를 0~1로 — 3강과 같은 이유(입력 스케일을 맞춰야 학습이 안정).
X = torch.tensor(tr.drop(columns=["ID", "label"]).values.reshape(-1, 1, 32, 32) / 255.0, dtype=torch.float32)
y = torch.tensor([classes.index(v) for v in tr["label"]]) # 클래스 이름 → 0~9 정수
Xt = torch.tensor(te.drop(columns=["ID"]).values.reshape(-1, 1, 32, 32) / 255.0, dtype=torch.float32)
# 13강 SmallCNN과 같은 얼개 — conv 32/64 + 은닉 128. 거기는 컬러(채널 3)·이진(출력 1),
# 여기는 흑백(채널 1)·10클래스(출력 10)라는 점만 다르다.
model = nn.Sequential(
nn.Conv2d(1, 32, 3, padding=1), nn.ReLU(), nn.MaxPool2d(2), # 32×32 → 16×16
nn.Conv2d(32, 64, 3, padding=1), nn.ReLU(), nn.MaxPool2d(2), # 16×16 → 8×8
nn.Flatten(), nn.Linear(64 * 8 * 8, 128), nn.ReLU(), nn.Linear(128, len(classes)))
opt = torch.optim.Adam(model.parameters(), lr=1e-3)
lossf = nn.CrossEntropyLoss() # softmax를 손실 안에서 처리 (3강)
for epoch in range(15): # 먼저 돌려보고 조절하세요
for i in range(0, len(X), 32):
opt.zero_grad(); loss = lossf(model(X[i:i + 32]), y[i:i + 32]); loss.backward(); opt.step()
print(epoch, round(loss.item(), 4))
pred = model(Xt).argmax(1) # 로짓이 가장 큰 칸 = 예측 클래스
pd.DataFrame({"ID": te["ID"], "label": [classes[i] for i in pred]}).to_csv("submission.csv", index=False)
Next Steps
- 01검증 분할을 만들어 과적합이 언제 시작되는지 확인
- 02augmentation·Dropout으로 일반화 성능 비교
- 03필터 수·층 수·epoch를 바꿔가며 학습 곡선 관찰
Live Rankings
클래스 리더보드
이해 확인을 통과해 ranked가 된 제출만 표시합니다. 각 수강생의 최고 점수 1개만 순위에 반영됩니다.
순위 기록을 불러오는 중입니다.
Join the Board
제출 → 이해 확인 → 순위 공개
출력값은 서버가 다시 채점합니다. 객관식 3문항 중 2문항 이상과 80자 이상의 실험 회고를 제출하기 전까지 점수는 잠깁니다.
- 01CSV 검증현재
- 02서버 재채점대기
- 03이해 확인대기
- 04순위 공개대기
Submission Gate
제출 준비 중
미션 브리프는 먼저 확인할 수 있습니다. 강사가 비공개 평가셋과 제출 설정을 공개하면 CSV 제출과 이해 확인이 열립니다.
Learning Objectives
이번 미션에서 확인할 것
- 01이미지 tensor의 채널·높이·너비 계약을 검증한다.
- 02기본 CNN의 convolution과 pooling 역할을 결과와 연결한다.
- 03augmentation과 regularization이 일반화 성능에 미치는 영향을 비교한다.
Output Checklist
제출·학습 산출물
사이트에는 submission.csv만 업로드합니다. 나머지는 notebook에 남겨 수업 중 실험 근거로 설명합니다.
- 사이트 제출submission.csv
- 실험 기록재현 가능한 notebook
- 실험 기록학습·검증 곡선
- 실험 기록오분류 이미지 분석
Original Source
위 ZIP은 학습용 split입니다. 정답이 포함된 원본 전체는 아래 대회에서 확인하세요.